1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5  * except in compliance with the License. You may obtain a copy of the License at
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the
10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11  * KIND, either express or implied. See the License for the specific language governing
12  * permissions and limitations under the License.
13  */
14 
15 package com.android.systemui.plugins;
16 
17 import android.content.ComponentName;
18 import android.content.Context;
19 import android.content.SharedPreferences;
20 import android.content.pm.PackageManager;
21 
22 import com.android.internal.annotations.VisibleForTesting;
23 import com.android.systemui.shared.plugins.PluginEnabler;
24 
25 import javax.inject.Inject;
26 import javax.inject.Singleton;
27 
28 /** */
29 @Singleton
30 public class PluginEnablerImpl implements PluginEnabler {
31     private static final String CRASH_DISABLED_PLUGINS_PREF_FILE = "auto_disabled_plugins_prefs";
32 
33     private final PackageManager mPm;
34     private final SharedPreferences mAutoDisabledPrefs;
35 
PluginEnablerImpl(Context context)36     public PluginEnablerImpl(Context context) {
37         this(context, context.getPackageManager());
38     }
39 
40     @Inject
PluginEnablerImpl(Context context, PackageManager pm)41     @VisibleForTesting public PluginEnablerImpl(Context context, PackageManager pm) {
42         mAutoDisabledPrefs = context.getSharedPreferences(
43                 CRASH_DISABLED_PLUGINS_PREF_FILE, Context.MODE_PRIVATE);
44         mPm = pm;
45     }
46 
47     @Override
setEnabled(ComponentName component)48     public void setEnabled(ComponentName component) {
49         setDisabled(component, ENABLED);
50     }
51 
52     @Override
setDisabled(ComponentName component, @DisableReason int reason)53     public void setDisabled(ComponentName component, @DisableReason int reason) {
54         boolean enabled = reason == ENABLED;
55         final int desiredState = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
56                 : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
57         mPm.setComponentEnabledSetting(component, desiredState, PackageManager.DONT_KILL_APP);
58         if (enabled) {
59             mAutoDisabledPrefs.edit().remove(component.flattenToString()).apply();
60         } else {
61             mAutoDisabledPrefs.edit().putInt(component.flattenToString(), reason).apply();
62         }
63     }
64 
65     @Override
isEnabled(ComponentName component)66     public boolean isEnabled(ComponentName component) {
67         return mPm.getComponentEnabledSetting(component)
68                 != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
69     }
70 
71     @Override
getDisableReason(ComponentName componentName)72     public @DisableReason int getDisableReason(ComponentName componentName) {
73         if (isEnabled(componentName)) {
74             return ENABLED;
75         }
76         return mAutoDisabledPrefs.getInt(componentName.flattenToString(), DISABLED_MANUALLY);
77     }
78 }
79