OSDN Git Service

Disable non-permitted accessibility services and IMEs
authorKenny Guy <kennyguy@google.com>
Thu, 21 Aug 2014 12:20:21 +0000 (13:20 +0100)
committerKenny Guy <kennyguy@google.com>
Thu, 21 Aug 2014 16:15:49 +0000 (17:15 +0100)
Bug: 14469005
Change-Id: I4986f035318854c27ecb92bbe2f0c977d53b6361

res/values/strings.xml
src/com/android/settings/accessibility/AccessibilitySettings.java
src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
src/com/android/settings/inputmethod/InputMethodPreference.java

index 317e6ca..6e962d1 100644 (file)
     <string name="accessibility_feature_state_on">On</string>
     <!-- Summary for the disabled state of an accessibility feature. [CHAR LIMIT=10] -->
     <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] -->
     <string name="captioning_preview_title">Preview</string>
index 36025a6..eff5fb6 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.accessibility;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.ActivityManagerNative;
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -28,6 +29,7 @@ import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -197,11 +199,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
 
     private int mLongPressTimeoutDefault;
 
+    private DevicePolicyManager mDpm;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.accessibility_settings);
         initializeAllPreferences();
+        mDpm = (DevicePolicyManager) (getActivity()
+                .getSystemService(Context.DEVICE_POLICY_SERVICE));
     }
 
     @Override
@@ -434,7 +440,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
                 accessibilityManager.getInstalledAccessibilityServiceList();
         Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
                 getActivity());
-
+        List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
+                UserHandle.myUserId());
         final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
 
@@ -454,11 +461,26 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
             preference.setTitle(title);
             final boolean serviceEnabled = accessibilityEnabled
                     && enabledServices.contains(componentName);
+            String serviceEnabledString;
             if (serviceEnabled) {
-                preference.setSummary(getString(R.string.accessibility_feature_state_on));
+                serviceEnabledString = getString(R.string.accessibility_feature_state_on);
             } 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.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
index f18694c..d0bc0cc 100644 (file)
@@ -18,6 +18,7 @@ package com.android.settings.inputmethod;
 
 import android.app.Activity;
 import android.app.Fragment;
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -34,6 +35,7 @@ import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.UserHandle;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -102,6 +104,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
     private SettingsObserver mSettingsObserver;
     private Intent mIntentWaitingForResult;
     private InputMethodSettingValuesWrapper mInputMethodSettingValues;
+    private DevicePolicyManager mDpm;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -175,6 +178,8 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
 
         mHandler = new Handler();
         mSettingsObserver = new SettingsObserver(mHandler, activity);
+        mDpm = (DevicePolicyManager) (getActivity().
+                getSystemService(Context.DEVICE_POLICY_SERVICE));
     }
 
     private void updateInputMethodSelectorSummary(int value) {
@@ -403,6 +408,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
                 mKeyboardSettingsCategory.removePreference(pref);
             }
             mInputMethodPreferenceList.clear();
+            List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
             final Context context = getActivity();
             final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
                     ? mInputMethodSettingValues.getInputMethodList()
@@ -410,8 +416,11 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
             final int N = (imis == null ? 0 : imis.size());
             for (int i = 0; i < N; ++i) {
                 final InputMethodInfo imi = imis.get(i);
+                final boolean isAllowedByOrganization = permittedList == null
+                        || permittedList.contains(imi.getPackageName());
                 final InputMethodPreference pref = new InputMethodPreference(
-                        context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */, this);
+                        context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */,
+                        isAllowedByOrganization, this);
                 mInputMethodPreferenceList.add(pref);
             }
             final Collator collator = Collator.getInstance();
index 111f79b..5cf5d6a 100755 (executable)
@@ -68,6 +68,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
     private final boolean mHasPriorityInSorting;
     private final OnSavePreferenceListener mOnSaveListener;
     private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
+    private final boolean mIsAllowedByOrganization;
 
     private AlertDialog mDialog = null;
 
@@ -78,14 +79,18 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
      * @param imi The {@link InputMethodInfo} of this preference.
      * @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.
+     * @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
      *     to save the state to shared preference.
      */
     InputMethodPreference(final Context context, final InputMethodInfo imi,
-            final boolean isImeEnabler, final OnSavePreferenceListener onSaveListener) {
+            final boolean isImeEnabler, final boolean isAllowedByOrganization,
+            final OnSavePreferenceListener onSaveListener) {
         super(context);
         setPersistent(false);
         mImi = imi;
+        mIsAllowedByOrganization = isAllowedByOrganization;
         mOnSaveListener = onSaveListener;
         if (!isImeEnabler) {
             // Hide switch widget.
@@ -178,7 +183,7 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
                 mImi, getContext());
         // 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.
-        setEnabled(!(isAlwaysChecked && isImeEnabler()));
+        setEnabled(!((isAlwaysChecked && isImeEnabler()) || (!mIsAllowedByOrganization)));
         setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
         setSummary(getSummaryString());
     }
@@ -189,6 +194,9 @@ class InputMethodPreference extends SwitchPreference implements OnPreferenceClic
 
     private String getSummaryString() {
         final Context context = getContext();
+        if (!mIsAllowedByOrganization) {
+            return context.getString(R.string.accessibility_feature_or_input_method_not_allowed);
+        }
         final InputMethodManager imm = getInputMethodManager();
         final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
         final ArrayList<CharSequence> subtypeLabels = new ArrayList<>();