| package com.android.settings.development; |
| |
| import android.content.Context; |
| import android.content.pm.PackageManager; |
| import android.os.UserManager; |
| |
| import androidx.annotation.VisibleForTesting; |
| import androidx.preference.Preference; |
| import androidx.preference.PreferenceScreen; |
| import androidx.preference.TwoStatePreference; |
| |
| import com.android.settings.core.PreferenceControllerMixin; |
| import com.android.settingslib.development.DeveloperOptionsPreferenceController; |
| |
| public class LocalTerminalPreferenceController extends DeveloperOptionsPreferenceController |
| implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { |
| |
| private static final String ENABLE_TERMINAL_KEY = "enable_terminal"; |
| |
| @VisibleForTesting |
| static final String TERMINAL_APP_PACKAGE = "com.android.terminal"; |
| |
| private PackageManager mPackageManager; |
| private UserManager mUserManager; |
| |
| public LocalTerminalPreferenceController(Context context) { |
| super(context); |
| |
| mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); |
| } |
| |
| @Override |
| public boolean isAvailable() { |
| return isPackageInstalled(TERMINAL_APP_PACKAGE); |
| } |
| |
| @Override |
| public String getPreferenceKey() { |
| return ENABLE_TERMINAL_KEY; |
| } |
| |
| @Override |
| public void displayPreference(PreferenceScreen screen) { |
| super.displayPreference(screen); |
| |
| mPackageManager = getPackageManager(); |
| |
| if (isAvailable() && !isEnabled()) { |
| mPreference.setEnabled(false); |
| } |
| } |
| |
| @Override |
| public boolean onPreferenceChange(Preference preference, Object newValue) { |
| final boolean terminalEnabled = (Boolean) newValue; |
| mPackageManager.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE, |
| terminalEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED |
| : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */); |
| return true; |
| } |
| |
| @Override |
| public void updateState(Preference preference) { |
| final boolean isTerminalEnabled = mPackageManager.getApplicationEnabledSetting( |
| TERMINAL_APP_PACKAGE) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; |
| ((TwoStatePreference) mPreference).setChecked(isTerminalEnabled); |
| } |
| |
| @Override |
| protected void onDeveloperOptionsSwitchEnabled() { |
| if (isEnabled()) { |
| mPreference.setEnabled(true); |
| } |
| } |
| |
| @Override |
| protected void onDeveloperOptionsSwitchDisabled() { |
| super.onDeveloperOptionsSwitchDisabled(); |
| mPackageManager.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE, |
| PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */); |
| ((TwoStatePreference) mPreference).setChecked(false); |
| } |
| |
| @VisibleForTesting |
| PackageManager getPackageManager() { |
| return mContext.getPackageManager(); |
| } |
| |
| private boolean isPackageInstalled(String packageName) { |
| try { |
| return mContext.getPackageManager().getPackageInfo(packageName, 0 /* flags */) != null; |
| } catch (PackageManager.NameNotFoundException e) { |
| return false; |
| } |
| } |
| |
| private boolean isEnabled() { |
| return mUserManager.isAdminUser(); |
| } |
| } |