Merge "Update Tether Settings for new UMS behavior."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4499cc1..a2e84c5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1686,9 +1686,21 @@
     <!-- Manage applications, title for dialog when killing persistent apps-->
     <!-- Manage applications, text for Move button when move is in progress -->
     <string name="moving">Moving</string>
+
+    <!-- Manage applications, text for move error messages -->
+    <string name="insufficient_storage">There is not enough storage left.</string>
+    <string name="does_not_exist">The application does not exist.</string>
+    <string name="app_forward_locked">The application is forward locked</string>
+    <string name="invalid_location">The specified install location is not valid.</string>
+    <string name="system_package">System updates cannot be installed on external media.</string>
+
     <string name="force_stop_dlg_title">Force Stop</string>
     <!-- Manage applications, text for dialog when killing persistent apps-->
     <string name="force_stop_dlg_text">This application will be restarted right way. Are you sure you want to force stop?</string>
+    <!-- Manage applications, text for dialog when moving an app -->
+    <string name="move_app_failed_dlg_title">Move Application</string>
+    <!-- Manage applications, text for dialog moving an app -->
+    <string name="move_app_failed_dlg_text">Failed to move application. <xliff:g id="reason">%1$s</xliff:g></string>
     <!-- Manage applications, application installation location title -->
     <string name="app_install_location_title">Preferred install location</string>
     <!-- Manage applications. application installation location summary -->
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 276a22f..b2debd2 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -105,6 +105,8 @@
         if (!accessibilityServices.isEmpty()) {
             if (serviceState == 1) {
                 mToggleCheckBox.setChecked(true);
+            } else {
+                setAccessibilityServicePreferencesState(false);
             }
             mToggleCheckBox.setEnabled(true);
         } else {
@@ -127,6 +129,24 @@
         persistEnabledAccessibilityServices();
     }
 
+    /**
+     * Sets the state of the preferences for enabling/disabling
+     * AccessibilityServices.
+     *
+     * @param isEnabled If to enable or disable the preferences.
+     */
+    private void setAccessibilityServicePreferencesState(boolean isEnabled) {
+        if (mAccessibilityServicesCategory == null) {
+            return;
+        }
+
+        int count = mAccessibilityServicesCategory.getPreferenceCount();
+        for (int i = 0; i < count; i++) {
+            Preference pref = mAccessibilityServicesCategory.getPreference(i);
+            pref.setEnabled(isEnabled);
+        }
+    }
+
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         final String key = preference.getKey();
@@ -150,6 +170,7 @@
         if (preference.isChecked()) {
             Settings.Secure.putInt(getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_ENABLED, 1);
+            setAccessibilityServicePreferencesState(true);
         } else {
             final CheckBoxPreference checkBoxPreference = preference;
             AlertDialog dialog = (new AlertDialog.Builder(this))
@@ -162,6 +183,7 @@
                         public void onClick(DialogInterface dialog, int which) {
                             Settings.Secure.putInt(getContentResolver(),
                                 Settings.Secure.ACCESSIBILITY_ENABLED, 0);
+                            setAccessibilityServicePreferencesState(false);
                         }
                 })
                 .setNegativeButton(android.R.string.cancel,
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 3e3d848..44acf95 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -54,7 +54,7 @@
     private static final String KEY_UI_STAGE = "ui_stage";
     private TextView mPasswordEntry;
     private int mPasswordMinLength = 4;
-    private int mPasswordMaxLength = 8;
+    private int mPasswordMaxLength = 16;
     private LockPatternUtils mLockPatternUtils;
     private int mRequestedMode = LockPatternUtils.MODE_PIN;
     private ChooseLockSettingsHelper mChooseLockSettingsHelper;
@@ -109,8 +109,8 @@
         super.onCreate(savedInstanceState);
         mLockPatternUtils = new LockPatternUtils(this);
         mRequestedMode = getIntent().getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, mRequestedMode);
-        mPasswordMinLength = getIntent().getIntExtra("password_min_length", mPasswordMinLength);
-        mPasswordMaxLength = getIntent().getIntExtra("password_max_length", mPasswordMaxLength);
+        mPasswordMinLength = getIntent().getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength);
+        mPasswordMaxLength = getIntent().getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength);
         int minMode = mLockPatternUtils.getRequestedPasswordMode();
         if (mRequestedMode < minMode) {
             mRequestedMode = minMode;
diff --git a/src/com/android/settings/InstalledAppDetails.java b/src/com/android/settings/InstalledAppDetails.java
index a6c2c16..5ddd1fd 100644
--- a/src/com/android/settings/InstalledAppDetails.java
+++ b/src/com/android/settings/InstalledAppDetails.java
@@ -84,6 +84,7 @@
     private Button mForceStopButton;
     private Button mClearDataButton;
     private Button mMoveAppButton;
+    private int mMoveErrorCode;
     
     PackageStats mSizeInfo;
     private PackageManager mPm;
@@ -113,6 +114,7 @@
     private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
     private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
     private static final int DLG_FORCE_STOP = DLG_BASE + 5;
+    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
     
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
@@ -188,6 +190,22 @@
         initMoveButton();
     }
 
+    private CharSequence getMoveErrMsg(int errCode) {
+        switch (errCode) {
+            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
+                return getString(R.string.insufficient_storage);
+            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
+                return getString(R.string.does_not_exist);
+            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
+                return getString(R.string.app_forward_locked);
+            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
+                return getString(R.string.invalid_location);
+            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
+                return getString(R.string.system_package);
+        }
+        return null;
+    }
+
     private void initMoveButton() {
         String pkgName = mAppInfo.packageName;
         boolean dataOnly = false;
@@ -465,14 +483,18 @@
                 mAppInfo = mPm.getApplicationInfo(packageName,
                         PackageManager.GET_UNINSTALLED_PACKAGES);
                 initMoveButton();
+                // Refresh size info
+                mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
             } catch (NameNotFoundException e) {
                 // TODO error handling
             }
         } else {
-            // TODO Present a dialog indicating failure.
+            initMoveButton();
+            mMoveErrorCode = result;
+            showDialogInner(DLG_MOVE_FAILED);
         }
     }
-    
+
     /*
      * Private method to initiate clearing user data when the user clicks the clear data 
      * button for a system package
@@ -573,6 +595,15 @@
             })
             .setNegativeButton(R.string.dlg_cancel, null)
             .create();
+            case DLG_MOVE_FAILED:
+                CharSequence msg = getString(R.string.move_app_failed_dlg_text,
+                        getMoveErrMsg(mMoveErrorCode));
+                return new AlertDialog.Builder(this)
+                .setTitle(getString(R.string.move_app_failed_dlg_title))
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setMessage(msg)
+                .setNeutralButton(R.string.dlg_ok, null)
+                .create();
         }
         return null;
     }