Merge "If a device identifier is specified, bring up keyboard layouts dialog." into lmp-dev
diff --git a/res/drawable/default_preference_background.xml b/res/drawable/default_preference_background.xml
index bea5d3d..7f7b560 100644
--- a/res/drawable/default_preference_background.xml
+++ b/res/drawable/default_preference_background.xml
@@ -15,15 +15,8 @@
 -->
 
 <inset xmlns:android="http://schemas.android.com/apk/res/android"
-        android:insetLeft="0dip"
-        android:insetTop="0dip"
-        android:insetRight="0dip"
-        android:insetBottom="0dip">
+    android:inset="0dip">
 
-    <shape android:shape="rectangle">
-
-        <solid android:color="@color/default_preference_background_color" />
-
-    </shape>
+    <color android:color="?android:attr/colorBackground" />
 
 </inset>
diff --git a/res/drawable/preference_background.xml b/res/drawable/preference_background.xml
index f47bcf5..7f7b560 100644
--- a/res/drawable/preference_background.xml
+++ b/res/drawable/preference_background.xml
@@ -15,13 +15,8 @@
 -->
 
 <inset xmlns:android="http://schemas.android.com/apk/res/android"
-        android:insetLeft="0dip"
-        android:insetTop="0dip"
-        android:insetRight="0dip"
-        android:insetBottom="0dip">
+    android:inset="0dip">
 
-    <shape android:shape="rectangle">
-        <solid android:color="@color/preference_background_color" />
-    </shape>
+    <color android:color="?android:attr/colorBackground" />
 
 </inset>
diff --git a/res/drawable/search_panel_list_background.xml b/res/drawable/search_panel_list_background.xml
index a31e322..7f7b560 100644
--- a/res/drawable/search_panel_list_background.xml
+++ b/res/drawable/search_panel_list_background.xml
@@ -15,15 +15,8 @@
 -->
 
 <inset xmlns:android="http://schemas.android.com/apk/res/android"
-        android:insetLeft="0dip"
-        android:insetTop="0dip"
-        android:insetRight="0dip"
-        android:insetBottom="0dip">
+    android:inset="0dip">
 
-    <shape android:shape="rectangle">
-
-        <solid android:color="@color/search_panel_list_background_color" />
-
-    </shape>
+    <color android:color="?android:attr/colorBackground" />
 
 </inset>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 1c299f5..246a13f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -73,13 +73,6 @@
     <color name="switchbar_background_color">#ff37474f</color>
     <color name="switch_accent_color">#ff7fcac3</color>
 
-    <color name="default_preference_background_color">@*android:color/background_material_light</color>
-    <color name="preference_background_color">@color/default_preference_background_color</color>
-    <color name="search_panel_list_background_color">@color/default_preference_background_color</color>
-
-    <color name="setup_wizard_preference_background_color_dark">@*android:color/background_material_dark</color>
-    <color name="setup_wizard_preference_background_color_light">@*android:color/background_material_light</color>
-
     <color name="wifi_divider">#ffe0e0e0</color>
 
 </resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index e9d4297..b4fb388 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -42,7 +42,7 @@
         <item name="setup_divider_color">@color/setup_divider_color_dark</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal_teal</item>
-        <item name="preferenceBackgroundColor">@color/setup_wizard_preference_background_color_dark</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
     </style>
 
     <style name="SetupWizardWifiTheme.Light" parent="android:Theme.Material.Light.NoActionBar">
@@ -59,7 +59,7 @@
         <item name="setup_divider_color">@color/setup_divider_color_light</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal_teal</item>
-        <item name="preferenceBackgroundColor">@color/setup_wizard_preference_background_color_light</item>
+        <item name="preferenceBackgroundColor">?android:attr/colorBackground</item>
     </style>
 
     <style name="Theme.WifiDialog" parent="@*android:style/Theme.Material.Dialog.Alert">
@@ -145,6 +145,9 @@
     </style>
 
     <style name="Theme.DialogWhenLarge" parent="@android:style/Theme.Material.Light.DialogWhenLarge">
+        <!-- Explicitly override the background color. -->
+        <item name="android:colorBackground">@android:color/white</item>
+
         <!-- Used by the ActionBar -->
         <item name="android:colorPrimary">@color/theme_primary</item>
         <!-- Used by the StatusBar -->
@@ -179,6 +182,9 @@
     <style name="Theme.AlertDialog" parent="@*android:style/Theme.Material.Light.Dialog.Alert">
         <item name="android:windowSoftInputMode">adjustResize</item>
 
+        <!-- Explicitly override the background color. -->
+        <item name="android:colorBackground">@android:color/white</item>
+
         <!-- Used by the ActionBar -->
         <item name="android:colorPrimary">@color/theme_primary</item>
         <!-- Used by the StatusBar -->
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 84758d8..d04f6ac 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -96,6 +96,7 @@
         private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
         private ChooseLockSettingsHelper mChooseLockSettingsHelper;
         private Stage mUiStage = Stage.Introduction;
+        private boolean mDone = false;
         private TextView mHeaderText;
         private String mFirstPin;
         private KeyboardView mKeyboardView;
@@ -229,6 +230,7 @@
                     updateStage(mUiStage);
                 }
             }
+            mDone = false;
             if (activity instanceof SettingsActivity) {
                 final SettingsActivity sa = (SettingsActivity) activity;
                 int id = mIsAlphaMode ? R.string.lockpassword_choose_your_password_header
@@ -389,6 +391,8 @@
         }
 
         private void handleNext() {
+            if (mDone) return;
+
             final String pin = mPasswordEntry.getText().toString();
             if (TextUtils.isEmpty(pin)) {
                 return;
@@ -409,6 +413,7 @@
                     mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
                     getActivity().setResult(RESULT_FINISHED);
                     getActivity().finish();
+                    mDone = true;
                     startActivity(RedactionInterstitial.createStartIntent(getActivity()));
                 } else {
                     CharSequence tmp = mPasswordEntry.getText();
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 9b3ce0a..c218c8d 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -290,6 +290,7 @@
         }
 
         private Stage mUiStage = Stage.Introduction;
+        private boolean mDone = false;
 
         private Runnable mClearPatternRunnable = new Runnable() {
             public void run() {
@@ -363,6 +364,7 @@
                 }
                 updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
             }
+            mDone = false;
             return view;
         }
 
@@ -519,6 +521,7 @@
         }
 
         private void saveChosenPatternAndFinish() {
+            if (mDone) return;
             LockPatternUtils utils = mChooseLockSettingsHelper.utils();
             final boolean lockVirgin = !utils.isPatternEverChosen();
 
@@ -533,6 +536,7 @@
 
             getActivity().setResult(RESULT_FINISHED);
             getActivity().finish();
+            mDone = true;
             startActivity(RedactionInterstitial.createStartIntent(getActivity()));
         }
     }
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 013fd3a..adc1b2d 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -155,6 +155,13 @@
     }
 
     private class DecryptTask extends AsyncTask<String, Void, Integer> {
+        private void hide(int id) {
+            View view = findViewById(id);
+            if (view != null) {
+                view.setVisibility(View.GONE);
+            }
+        }
+
         @Override
         protected Integer doInBackground(String... params) {
             final IMountService service = getMountService();
@@ -175,9 +182,18 @@
                     mLockPatternView.removeCallbacks(mClearPatternRunnable);
                     mLockPatternView.postDelayed(mClearPatternRunnable, RIGHT_PATTERN_CLEAR_TIMEOUT_MS);
                 }
+                hide(R.id.passwordEntry);
+                hide(R.id.switch_ime_button);
+                hide(R.id.lockPattern);
+                hide(R.id.status);
+                hide(R.id.owner_info);
+                hide(R.id.emergencyCallButton);
             } else if (failedAttempts == MAX_FAILED_ATTEMPTS) {
                 // Factory reset the device.
-                sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+                Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+                intent.putExtra(Intent.EXTRA_REASON, "CryptKeeper.MAX_FAILED_ATTEMPTS");
+                sendBroadcast(intent);
             } else if (failedAttempts == -1) {
                 // Right password, but decryption failed. Tell user bad news ...
                 setContentView(R.layout.crypt_keeper_progress);
@@ -536,7 +552,7 @@
      * @param corrupt true if userdata is corrupt, false if encryption failed
      *        partway through
      */
-    private void showFactoryReset(boolean corrupt) {
+    private void showFactoryReset(final boolean corrupt) {
         // Hide the encryption-bot to make room for the "factory reset" button
         findViewById(R.id.encroid).setVisibility(View.GONE);
 
@@ -547,7 +563,11 @@
                 @Override
             public void onClick(View v) {
                 // Factory reset the device.
-                sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+                Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+                intent.putExtra(Intent.EXTRA_REASON,
+                        "CryptKeeper.showFactoryReset() corrupt=" + corrupt);
+                sendBroadcast(intent);
             }
         });
 
diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java
index 40c2324..3521aa3 100644
--- a/src/com/android/settings/MasterClearConfirm.java
+++ b/src/com/android/settings/MasterClearConfirm.java
@@ -105,10 +105,14 @@
     private void doMasterClear() {
         if (mEraseSdCard) {
             Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET);
+            intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
             intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME);
             getActivity().startService(intent);
         } else {
-            getActivity().sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+            Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+            intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+            intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
+            getActivity().sendBroadcast(intent);
             // Intent handling is asynchronous -- assume it will happen soon.
         }
     }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index ffb55d6..3ca85ea 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -1177,8 +1177,9 @@
                     } else {
                         // Only show if NFC is on and we have the HCE feature
                         NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
-                        if (!adapter.isEnabled() || !getPackageManager().hasSystemFeature(
-                                PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+                        if (adapter == null || !adapter.isEnabled() ||
+                                !getPackageManager().hasSystemFeature(
+                                        PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
                             removeTile = true;
                         }
                     }
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index de9fac7..08cfc58 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -613,6 +613,8 @@
             int titleResId, CharSequence title, boolean isShortcut, UserHandle userHandle) {
         Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResId,
                 title, isShortcut);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
         context.startActivityAsUser(intent, userHandle);
     }
 
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 3c0d9e9..8a183da 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -361,20 +361,9 @@
 
         for (int i = 0; i < accountTypes.length; i++) {
             final String accountType = accountTypes[i];
-            if (mAuthoritiesCount > 0) {
-                // Skip showing any account that does not have any of the requested authorities
-                final ArrayList<String> authoritiesForType = helper.getAuthoritiesForAccountType(
-                        accountType);
-                boolean show = false;
-                for (int j = 0; j < mAuthoritiesCount; j++) {
-                    if (authoritiesForType.contains(mAuthorities[j])) {
-                        show = true;
-                        break;
-                    }
-                }
-                if (!show) {
-                    continue;
-                }
+            // Skip showing any account that does not have any of the requested authorities
+            if (!accountTypeHasAnyRequestedAuthorities(helper, accountType)) {
+                continue;
             }
             final CharSequence label = helper.getLabelForType(getActivity(), accountType);
             if (label == null) {
@@ -418,6 +407,26 @@
         return accountTypePreferences;
     }
 
+    private boolean accountTypeHasAnyRequestedAuthorities(AuthenticatorHelper helper,
+            String accountType) {
+        if (mAuthoritiesCount == 0) {
+            // No authorities required
+            return true;
+        }
+        final ArrayList<String> authoritiesForType = helper.getAuthoritiesForAccountType(
+                accountType);
+        if (authoritiesForType == null) {
+            Log.d(TAG, "No sync authorities for account type: " + accountType);
+            return false;
+        }
+        for (int j = 0; j < mAuthoritiesCount; j++) {
+            if (authoritiesForType.contains(mAuthorities[j])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private class AccountPreference extends Preference implements OnPreferenceClickListener {
         /**
          * Title of the tile that is shown to the user.
diff --git a/src/com/android/settings/accounts/AuthenticatorHelper.java b/src/com/android/settings/accounts/AuthenticatorHelper.java
index 6cebf5f..cc8a6d5 100644
--- a/src/com/android/settings/accounts/AuthenticatorHelper.java
+++ b/src/com/android/settings/accounts/AuthenticatorHelper.java
@@ -190,10 +190,10 @@
                 mEnabledAccountTypes.add(account.type);
             }
         }
+        buildAccountTypeToAuthoritiesMap();
         if (mListeningToAccountUpdates) {
             mListener.onAccountsUpdate(mUserHandle);
         }
-        buildAccountTypeToAuthoritiesMap();
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index 36a2444..9dca029 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -259,8 +259,14 @@
         args.putIntArray(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
         args.putDoubleArray(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
 
-        caller.startPreferencePanelAsUser(PowerUsageDetail.class.getName(), args,
-                R.string.details_title, null, new UserHandle(userId));
+        // This is a workaround, see b/17523189
+        if (userId == UserHandle.myUserId()) {
+            caller.startPreferencePanel(PowerUsageDetail.class.getName(), args,
+                    R.string.details_title, null, null, 0);
+        } else {
+            caller.startPreferencePanelAsUser(PowerUsageDetail.class.getName(), args,
+                    R.string.details_title, null, new UserHandle(userId));
+        }
     }
 
     public static final int ACTION_DISPLAY_SETTINGS = 1;
@@ -644,8 +650,9 @@
         if (mPackages == null) return;
         ActivityManager am = (ActivityManager)getActivity().getSystemService(
                 Context.ACTIVITY_SERVICE);
+        final int userId = UserHandle.getUserId(mUid);
         for (int i = 0; i < mPackages.length; i++) {
-            am.forceStopPackage(mPackages[i]);
+            am.forceStopPackageAsUser(mPackages[i], userId);
         }
         checkForceStop();
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 5325ed3..5887519 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -185,7 +185,7 @@
                     .setAlphabeticShortcut('t');
         }
         MenuItem refresh = menu.add(0, MENU_STATS_REFRESH, 0, R.string.menu_stats_refresh)
-                .setIcon(R.drawable.ic_menu_refresh_holo_dark)
+                .setIcon(com.android.internal.R.drawable.ic_menu_refresh)
                 .setAlphabeticShortcut('r');
         refresh.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
                 MenuItem.SHOW_AS_ACTION_WITH_TEXT);
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index dda8d9e..8e71819 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -435,11 +435,12 @@
         StringBuilder visibility = new StringBuilder();
         StringBuilder scans24GHz = null;
         StringBuilder scans5GHz = null;
+        String bssid = null;
 
         long now = System.currentTimeMillis();
 
         if (mInfo != null) {
-            String bssid = mInfo.getBSSID();
+            bssid = mInfo.getBSSID();
             if (bssid != null) {
                 visibility.append(" ").append(bssid);
             }
@@ -489,10 +490,17 @@
                     }
                     if (n5 < 4) {
                         if (scans5GHz == null) scans5GHz = new StringBuilder();
-
                         scans5GHz.append(" {").append(result.BSSID);
+                        if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*");
                         scans5GHz.append("=").append(result.frequency);
-                        scans5GHz.append(",").append(result.level).append("}");
+                        scans5GHz.append(",").append(result.level);
+                        if (result.autoJoinStatus != 0) {
+                            scans5GHz.append(",st=").append(result.autoJoinStatus);
+                        }
+                        if (result.numIpConfigFailures != 0) {
+                            scans5GHz.append(",ipf=").append(result.numIpConfigFailures);
+                        }
+                        scans5GHz.append("}");
                         n5++;
                     }
                 } else if (result.frequency >= LOWER_FREQ_24GHZ
@@ -503,8 +511,16 @@
                     if (n24 < 4) {
                         if (scans24GHz == null) scans24GHz = new StringBuilder();
                         scans24GHz.append(" {").append(result.BSSID);
+                        if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*");
                         scans24GHz.append("=").append(result.frequency);
-                        scans24GHz.append(",").append(result.level).append("}");
+                        scans24GHz.append(",").append(result.level);
+                        if (result.autoJoinStatus != 0) {
+                            scans24GHz.append(",st=").append(result.autoJoinStatus);
+                        }
+                        if (result.numIpConfigFailures != 0) {
+                            scans24GHz.append(",ipf=").append(result.numIpConfigFailures);
+                        }
+                        scans24GHz.append("}");
                         n24++;
                     }
                 }
@@ -573,9 +589,15 @@
             summary.append(Summary.get(context, mState));
         } else if (mConfig != null && ((mConfig.status == WifiConfiguration.Status.DISABLED &&
                 mConfig.disableReason != WifiConfiguration.DISABLED_UNKNOWN_REASON)
-               || mConfig.autoJoinStatus >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE)) {
-            if (mConfig.autoJoinStatus >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE) {
-                summary.append(context.getString(R.string.wifi_disabled_password_failure));
+               || mConfig.autoJoinStatus
+                >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE)) {
+            if (mConfig.autoJoinStatus
+                    >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE) {
+                if (mConfig.disableReason == WifiConfiguration.DISABLED_DHCP_FAILURE) {
+                    summary.append(context.getString(R.string.wifi_disabled_network_failure));
+                } else {
+                    summary.append(context.getString(R.string.wifi_disabled_password_failure));
+                }
             } else {
                 switch (mConfig.disableReason) {
                     case WifiConfiguration.DISABLED_AUTH_FAILURE:
@@ -586,9 +608,9 @@
                         summary.append(context.getString(R.string.wifi_disabled_network_failure));
                         break;
                     case WifiConfiguration.DISABLED_UNKNOWN_REASON:
-                        //this state is not useful anymore as auto-join may attempt joining
-                        //those networks
+                    case WifiConfiguration.DISABLED_ASSOCIATION_REJECT:
                         summary.append(context.getString(R.string.wifi_disabled_generic));
+                        break;
                 }
             }
         } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index 8426439..0952941 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -105,8 +105,6 @@
             mListeningToOnSwitchChange = true;
         }
         mSwitchBar.show();
-
-        mContext.registerReceiver(mReceiver, mIntentFilter);
     }
 
     public void teardownSwitchBar() {
@@ -115,8 +113,6 @@
             mListeningToOnSwitchChange = false;
         }
         mSwitchBar.hide();
-
-        mContext.unregisterReceiver(mReceiver);
     }
 
     public void resume(Context context) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 258c220..6c58bc1 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -829,6 +829,9 @@
                 }
             }
             for (WifiConfiguration config : configs) {
+                if (config.selfAdded && config.numAssociation == 0) {
+                    continue;
+                }
                 AccessPoint accessPoint = new AccessPoint(context, config);
                 if (lastInfo != null && lastState != null) {
                     accessPoint.update(lastInfo, lastState);