Disable non-permitted accessibility services and IMEs

Bug: 14469005
Change-Id: I4986f035318854c27ecb92bbe2f0c977d53b6361
This commit is contained in:
Kenny Guy
2014-08-21 13:20:21 +01:00
parent 10673f1a1e
commit 333f2bc71a
4 changed files with 47 additions and 6 deletions

View File

@@ -3602,6 +3602,8 @@
<string name="accessibility_feature_state_on">On</string> <string name="accessibility_feature_state_on">On</string>
<!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] --> <!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] -->
<string name="accessibility_feature_state_off">Off</string> <string name="accessibility_feature_state_off">Off</string>
<!-- Summary when an accessibility feature or ime is not permitted. [CHAR LIMIT=40] -->
<string name="accessibility_feature_or_input_method_not_allowed">Not allowed by your organization</string>
<!-- Title for the preference category containing the video caption preview. [CHAR LIMIT=35] --> <!-- Title for the preference category containing the video caption preview. [CHAR LIMIT=35] -->
<string name="captioning_preview_title">Preview</string> <string name="captioning_preview_title">Preview</string>

View File

@@ -18,6 +18,7 @@ package com.android.settings.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -28,6 +29,7 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
@@ -197,11 +199,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private int mLongPressTimeoutDefault; private int mLongPressTimeoutDefault;
private DevicePolicyManager mDpm;
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
addPreferencesFromResource(R.xml.accessibility_settings); addPreferencesFromResource(R.xml.accessibility_settings);
initializeAllPreferences(); initializeAllPreferences();
mDpm = (DevicePolicyManager) (getActivity()
.getSystemService(Context.DEVICE_POLICY_SERVICE));
} }
@Override @Override
@@ -434,7 +440,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
accessibilityManager.getInstalledAccessibilityServiceList(); accessibilityManager.getInstalledAccessibilityServiceList();
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings( Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
getActivity()); getActivity());
List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
UserHandle.myUserId());
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(), final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
@@ -454,12 +461,27 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
preference.setTitle(title); preference.setTitle(title);
final boolean serviceEnabled = accessibilityEnabled final boolean serviceEnabled = accessibilityEnabled
&& enabledServices.contains(componentName); && enabledServices.contains(componentName);
String serviceEnabledString;
if (serviceEnabled) { if (serviceEnabled) {
preference.setSummary(getString(R.string.accessibility_feature_state_on)); serviceEnabledString = getString(R.string.accessibility_feature_state_on);
} else { } else {
preference.setSummary(getString(R.string.accessibility_feature_state_off)); serviceEnabledString = getString(R.string.accessibility_feature_state_off);
} }
// Disable all accessibility services that are not permitted.
String packageName = serviceInfo.packageName;
boolean serviceAllowed =
permittedServices == null || permittedServices.contains(packageName);
preference.setEnabled(serviceAllowed || serviceEnabled);
String summaryString;
if (serviceAllowed) {
summaryString = serviceEnabledString;
} else {
summaryString = getString(R.string.accessibility_feature_or_input_method_not_allowed);
}
preference.setSummary(summaryString);
preference.setOrder(i); preference.setOrder(i);
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName()); preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
preference.setPersistent(true); preference.setPersistent(true);

View File

@@ -18,6 +18,7 @@ package com.android.settings.inputmethod;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
@@ -34,6 +35,7 @@ import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout; import android.hardware.input.KeyboardLayout;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import android.preference.CheckBoxPreference; import android.preference.CheckBoxPreference;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
@@ -102,6 +104,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
private SettingsObserver mSettingsObserver; private SettingsObserver mSettingsObserver;
private Intent mIntentWaitingForResult; private Intent mIntentWaitingForResult;
private InputMethodSettingValuesWrapper mInputMethodSettingValues; private InputMethodSettingValuesWrapper mInputMethodSettingValues;
private DevicePolicyManager mDpm;
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
@@ -175,6 +178,8 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
mHandler = new Handler(); mHandler = new Handler();
mSettingsObserver = new SettingsObserver(mHandler, activity); mSettingsObserver = new SettingsObserver(mHandler, activity);
mDpm = (DevicePolicyManager) (getActivity().
getSystemService(Context.DEVICE_POLICY_SERVICE));
} }
private void updateInputMethodSelectorSummary(int value) { private void updateInputMethodSelectorSummary(int value) {
@@ -403,6 +408,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
mKeyboardSettingsCategory.removePreference(pref); mKeyboardSettingsCategory.removePreference(pref);
} }
mInputMethodPreferenceList.clear(); mInputMethodPreferenceList.clear();
List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
final Context context = getActivity(); final Context context = getActivity();
final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
? mInputMethodSettingValues.getInputMethodList() ? mInputMethodSettingValues.getInputMethodList()
@@ -410,8 +416,11 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
final int N = (imis == null ? 0 : imis.size()); final int N = (imis == null ? 0 : imis.size());
for (int i = 0; i < N; ++i) { for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = imis.get(i); final InputMethodInfo imi = imis.get(i);
final boolean isAllowedByOrganization = permittedList == null
|| permittedList.contains(imi.getPackageName());
final InputMethodPreference pref = new InputMethodPreference( final InputMethodPreference pref = new InputMethodPreference(
context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */, this); context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */,
isAllowedByOrganization, this);
mInputMethodPreferenceList.add(pref); mInputMethodPreferenceList.add(pref);
} }
final Collator collator = Collator.getInstance(); final Collator collator = Collator.getInstance();

View File

@@ -68,6 +68,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
private final boolean mHasPriorityInSorting; private final boolean mHasPriorityInSorting;
private final OnSavePreferenceListener mOnSaveListener; private final OnSavePreferenceListener mOnSaveListener;
private final InputMethodSettingValuesWrapper mInputMethodSettingValues; private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
private final boolean mIsAllowedByOrganization;
private AlertDialog mDialog = null; private AlertDialog mDialog = null;
@@ -78,14 +79,18 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
* @param imi The {@link InputMethodInfo} of this preference. * @param imi The {@link InputMethodInfo} of this preference.
* @param isImeEnabler true if this preference is the IME enabler that has enable/disable * @param isImeEnabler true if this preference is the IME enabler that has enable/disable
* switches for all available IMEs, not the list of enabled IMEs. * switches for all available IMEs, not the list of enabled IMEs.
* @param isAllowedByOrganization false if the IME has been disabled by a device or profile
owner.
* @param onSaveListener The listener called when this preference has been changed and needs * @param onSaveListener The listener called when this preference has been changed and needs
* to save the state to shared preference. * to save the state to shared preference.
*/ */
InputMethodPreference(final Context context, final InputMethodInfo imi, InputMethodPreference(final Context context, final InputMethodInfo imi,
final boolean isImeEnabler, final OnSavePreferenceListener onSaveListener) { final boolean isImeEnabler, final boolean isAllowedByOrganization,
final OnSavePreferenceListener onSaveListener) {
super(context); super(context);
setPersistent(false); setPersistent(false);
mImi = imi; mImi = imi;
mIsAllowedByOrganization = isAllowedByOrganization;
mOnSaveListener = onSaveListener; mOnSaveListener = onSaveListener;
if (!isImeEnabler) { if (!isImeEnabler) {
// Hide switch widget. // Hide switch widget.
@@ -178,7 +183,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
mImi, getContext()); mImi, getContext());
// Only when this preference has a switch and an input method should be always enabled, // Only when this preference has a switch and an input method should be always enabled,
// this preference should be disabled to prevent accidentally disabling an input method. // this preference should be disabled to prevent accidentally disabling an input method.
setEnabled(!(isAlwaysChecked && isImeEnabler())); setEnabled(!((isAlwaysChecked && isImeEnabler()) || (!mIsAllowedByOrganization)));
setChecked(mInputMethodSettingValues.isEnabledImi(mImi)); setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
setSummary(getSummaryString()); setSummary(getSummaryString());
} }
@@ -189,6 +194,9 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
private String getSummaryString() { private String getSummaryString() {
final Context context = getContext(); final Context context = getContext();
if (!mIsAllowedByOrganization) {
return context.getString(R.string.accessibility_feature_or_input_method_not_allowed);
}
final InputMethodManager imm = getInputMethodManager(); final InputMethodManager imm = getInputMethodManager();
final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true); final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
final ArrayList<CharSequence> subtypeLabels = new ArrayList<>(); final ArrayList<CharSequence> subtypeLabels = new ArrayList<>();