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.SwitchPreference; 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; ((SwitchPreference) 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 */); ((SwitchPreference) 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(); } }