• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 import android.util.Log;
22 
23 import com.android.internal.annotations.VisibleForTesting;
24 import com.android.systemui.shared.plugins.PluginEnabler;
25 
26 import javax.inject.Inject;
27 import javax.inject.Singleton;
28 
29 /** */
30 @Singleton
31 public class PluginEnablerImpl implements PluginEnabler {
32     private static final String TAG = "PluginEnablerImpl";
33     private static final String CRASH_DISABLED_PLUGINS_PREF_FILE = "auto_disabled_plugins_prefs";
34 
35     private final PackageManager mPm;
36     private final SharedPreferences mAutoDisabledPrefs;
37 
PluginEnablerImpl(Context context)38     public PluginEnablerImpl(Context context) {
39         this(context, context.getPackageManager());
40     }
41 
42     @Inject
PluginEnablerImpl(Context context, PackageManager pm)43     @VisibleForTesting public PluginEnablerImpl(Context context, PackageManager pm) {
44         mAutoDisabledPrefs = context.getSharedPreferences(
45                 CRASH_DISABLED_PLUGINS_PREF_FILE, Context.MODE_PRIVATE);
46         mPm = pm;
47     }
48 
49     @Override
setEnabled(ComponentName component)50     public void setEnabled(ComponentName component) {
51         setDisabled(component, ENABLED);
52     }
53 
54     @Override
setDisabled(ComponentName component, @DisableReason int reason)55     public void setDisabled(ComponentName component, @DisableReason int reason) {
56         boolean enabled = reason == ENABLED;
57         final int desiredState = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
58                 : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
59         mPm.setComponentEnabledSetting(component, desiredState, PackageManager.DONT_KILL_APP);
60         if (enabled) {
61             mAutoDisabledPrefs.edit().remove(component.flattenToString()).apply();
62         } else {
63             mAutoDisabledPrefs.edit().putInt(component.flattenToString(), reason).apply();
64         }
65     }
66 
67     @Override
isEnabled(ComponentName component)68     public boolean isEnabled(ComponentName component) {
69         try {
70             return mPm.getComponentEnabledSetting(component)
71                     != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
72         } catch (IllegalArgumentException ex) {
73             Log.e(TAG, "Package Manager Exception", ex);
74             return false;
75         }
76     }
77 
78     @Override
getDisableReason(ComponentName componentName)79     public @DisableReason int getDisableReason(ComponentName componentName) {
80         if (isEnabled(componentName)) {
81             return ENABLED;
82         }
83         return mAutoDisabledPrefs.getInt(componentName.flattenToString(), DISABLED_UNKNOWN);
84     }
85 }
86