Home | History | Annotate | Download | only in development
      1 package com.android.settings.development;
      2 
      3 import android.content.Context;
      4 import android.content.pm.PackageManager;
      5 import android.os.UserManager;
      6 import android.support.annotation.VisibleForTesting;
      7 import android.support.v14.preference.SwitchPreference;
      8 import android.support.v7.preference.Preference;
      9 import android.support.v7.preference.PreferenceScreen;
     10 
     11 import com.android.settings.core.PreferenceControllerMixin;
     12 import com.android.settingslib.development.DeveloperOptionsPreferenceController;
     13 import com.android.settingslib.wrapper.PackageManagerWrapper;
     14 
     15 public class LocalTerminalPreferenceController extends DeveloperOptionsPreferenceController
     16         implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
     17 
     18     private static final String ENABLE_TERMINAL_KEY = "enable_terminal";
     19 
     20     @VisibleForTesting
     21     static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
     22 
     23     private PackageManagerWrapper mPackageManager;
     24     private UserManager mUserManager;
     25 
     26     public LocalTerminalPreferenceController(Context context) {
     27         super(context);
     28 
     29         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
     30     }
     31 
     32     @Override
     33     public boolean isAvailable() {
     34         return isPackageInstalled(TERMINAL_APP_PACKAGE);
     35     }
     36 
     37     @Override
     38     public String getPreferenceKey() {
     39         return ENABLE_TERMINAL_KEY;
     40     }
     41 
     42     @Override
     43     public void displayPreference(PreferenceScreen screen) {
     44         super.displayPreference(screen);
     45 
     46         mPackageManager = getPackageManagerWrapper();
     47 
     48         if (isAvailable() && !isEnabled()) {
     49             mPreference.setEnabled(false);
     50         }
     51     }
     52 
     53     @Override
     54     public boolean onPreferenceChange(Preference preference, Object newValue) {
     55         final boolean terminalEnabled = (Boolean) newValue;
     56         mPackageManager.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE,
     57                 terminalEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
     58                         : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
     59         return true;
     60     }
     61 
     62     @Override
     63     public void updateState(Preference preference) {
     64         final boolean isTerminalEnabled = mPackageManager.getApplicationEnabledSetting(
     65                 TERMINAL_APP_PACKAGE) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
     66         ((SwitchPreference) mPreference).setChecked(isTerminalEnabled);
     67     }
     68 
     69     @Override
     70     protected void onDeveloperOptionsSwitchEnabled() {
     71         if (isEnabled()) {
     72             mPreference.setEnabled(true);
     73         }
     74     }
     75 
     76     @Override
     77     protected void onDeveloperOptionsSwitchDisabled() {
     78         super.onDeveloperOptionsSwitchDisabled();
     79         mPackageManager.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE,
     80                 PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
     81         ((SwitchPreference) mPreference).setChecked(false);
     82     }
     83 
     84     @VisibleForTesting
     85     PackageManagerWrapper getPackageManagerWrapper() {
     86         return new PackageManagerWrapper(mContext.getPackageManager());
     87     }
     88 
     89     private boolean isPackageInstalled(String packageName) {
     90         try {
     91             return mContext.getPackageManager().getPackageInfo(packageName, 0 /* flags */) != null;
     92         } catch (PackageManager.NameNotFoundException e) {
     93             return false;
     94         }
     95     }
     96 
     97     private boolean isEnabled() {
     98         return mUserManager.isAdminUser();
     99     }
    100 }
    101