Merge "Don\'t show MIDI USB option if not supported"
am: c2a9cd03f7

* commit 'c2a9cd03f71b3b6b0af2f6faaf877fd9c75dd9fe':
  Don't show MIDI USB option if not supported
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b003e39..3d538a1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -671,7 +671,6 @@
                   android:excludeFromRecents="true">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.USER_DICTIONARY_INSERT" />
-                <action android:name="com.android.settings.USER_DICTIONARY_EDIT" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -1736,27 +1735,6 @@
         <activity android:name=".AppPicker" android:label="@string/select_application"
                 android:theme="@android:style/Theme.Material.Light.Dialog" />
 
-        <activity android:name="Settings$UsbSettingsActivity"
-                android:label="@string/storage_title_usb"
-                android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings$StorageSettingsActivity">
-            <intent-filter android:priority="1">
-                <action android:name="android.settings.STORAGE_USB_SETTINGS" />
-                <action android:name="com.android.settings.STORAGE_USB_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.deviceinfo.UsbSettings" />
-            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
-                android:resource="@id/storage_settings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
-        </activity>
-
         <!-- Keep compatibility with old shortcuts. -->
         <activity-alias android:name="UsbSettings"
                   android:exported="true"
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 3b3ce2f..fdc0914 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -114,6 +114,7 @@
     private boolean mUnavailable;
 
     private boolean mHideImsApn;
+    private boolean mAllowAddingApns;
 
     private final BroadcastReceiver mMobileStateReceiver = new BroadcastReceiver() {
         @Override
@@ -171,6 +172,7 @@
                 getSystemService(Context.CARRIER_CONFIG_SERVICE);
         PersistableBundle b = configManager.getConfig();
         mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL);
+        mAllowAddingApns = b.getBoolean(CarrierConfigManager.KEY_ALLOW_ADDING_APNS_BOOL);
     }
 
     @Override
@@ -235,16 +237,16 @@
         final String mccmnc = mSubscriptionInfo == null ? ""
             : tm.getSimOperator(mSubscriptionInfo.getSubscriptionId());
         Log.d(TAG, "mccmnc = " + mccmnc);
-        String where = "numeric=\""
-            + mccmnc
-            + "\" AND NOT (type='ia' AND (apn=\"\" OR apn IS NULL))";
+        StringBuilder where = new StringBuilder("numeric=\"" + mccmnc +
+                "\" AND NOT (type='ia' AND (apn=\"\" OR apn IS NULL)) AND user_visible!=0");
+
         if (mHideImsApn) {
-            where = where + " AND NOT (type='ims')";
+            where.append(" AND NOT (type='ims')");
         }
 
         Cursor cursor = getContentResolver().query(Telephony.Carriers.CONTENT_URI, new String[] {
-                "_id", "name", "apn", "type", "mvno_type", "mvno_match_data"}, where, null,
-                Telephony.Carriers.DEFAULT_SORT_ORDER);
+                "_id", "name", "apn", "type", "mvno_type", "mvno_match_data"}, where.toString(),
+                null, Telephony.Carriers.DEFAULT_SORT_ORDER);
 
         if (cursor != null) {
             IccRecords r = null;
@@ -326,10 +328,12 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         if (!mUnavailable) {
-            menu.add(0, MENU_NEW, 0,
-                    getResources().getString(R.string.menu_new))
-                    .setIcon(android.R.drawable.ic_menu_add)
-                    .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            if (mAllowAddingApns) {
+                menu.add(0, MENU_NEW, 0,
+                        getResources().getString(R.string.menu_new))
+                        .setIcon(android.R.drawable.ic_menu_add)
+                        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            }
             menu.add(0, MENU_RESTORE, 0,
                     getResources().getString(R.string.menu_restore))
                     .setIcon(android.R.drawable.ic_menu_upload);
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 387331b..f00d821 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1164,6 +1164,7 @@
         mCycleAdapter.clear();
 
         final Context context = mCycleSpinner.getContext();
+        NetworkStatsHistory.Entry entry = null;
 
         long historyStart = Long.MAX_VALUE;
         long historyEnd = Long.MIN_VALUE;
@@ -1186,9 +1187,20 @@
                 final long cycleStart = computeLastCycleBoundary(cycleEnd, policy);
                 Log.d(TAG, "generating cs=" + cycleStart + " to ce=" + cycleEnd + " waiting for hs="
                         + historyStart);
-                mCycleAdapter.add(new CycleItem(context, cycleStart, cycleEnd));
+
+                final boolean includeCycle;
+                if (mChartData != null) {
+                    entry = mChartData.network.getValues(cycleStart, cycleEnd, entry);
+                    includeCycle = (entry.rxBytes + entry.txBytes) > 0;
+                } else {
+                    includeCycle = true;
+                }
+
+                if (includeCycle) {
+                    mCycleAdapter.add(new CycleItem(context, cycleStart, cycleEnd));
+                    hasCycles = true;
+                }
                 cycleEnd = cycleStart;
-                hasCycles = true;
             }
 
             // one last cycle entry to modify policy cycle day
@@ -1200,7 +1212,18 @@
             long cycleEnd = historyEnd;
             while (cycleEnd > historyStart) {
                 final long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4);
-                mCycleAdapter.add(new CycleItem(context, cycleStart, cycleEnd));
+
+                final boolean includeCycle;
+                if (mChartData != null) {
+                    entry = mChartData.network.getValues(cycleStart, cycleEnd, entry);
+                    includeCycle = (entry.rxBytes + entry.txBytes) > 0;
+                } else {
+                    includeCycle = true;
+                }
+
+                if (includeCycle) {
+                    mCycleAdapter.add(new CycleItem(context, cycleStart, cycleEnd));
+                }
                 cycleEnd = cycleStart;
             }
 
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 7a6f165..ed1a970 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1077,9 +1077,9 @@
         boolean hasPreferred = hasPreferredActivities(pm, packageName)
                 || hasUsbDefaults(usbManager, packageName);
         int status = pm.getIntentVerificationStatus(packageName, UserHandle.myUserId());
+        // consider a visible current link-handling state to be any explicitly designated behavior
         boolean hasDomainURLsPreference =
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) ||
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+                status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
         return context.getString(hasPreferred || hasDomainURLsPreference
                 ? R.string.launch_defaults_some
                 : R.string.launch_defaults_none);
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index c885b02..6c2f241 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -17,14 +17,16 @@
 package com.android.settings.applications;
 
 import android.app.AlertDialog;
+import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IntentFilterVerificationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.preference.Preference;
-import android.preference.SwitchPreference;
 import android.util.ArraySet;
 import android.util.Log;
 import android.view.View;
@@ -52,8 +54,17 @@
     private static final String KEY_SUPPORTED_DOMAIN_URLS = "app_launch_supported_domain_urls";
     private static final String KEY_CLEAR_DEFAULTS = "app_launch_clear_defaults";
 
+    private static final Intent sBrowserIntent;
+    static {
+        sBrowserIntent = new Intent()
+                .setAction(Intent.ACTION_VIEW)
+                .addCategory(Intent.CATEGORY_BROWSABLE)
+                .setData(Uri.parse("http:"));
+    }
+
     private PackageManager mPm;
 
+    private boolean mIsBrowser;
     private boolean mHasDomainUrls;
     private DropDownPreference mAppLinkState;
     private AppDomainsPreference mAppDomainUrls;
@@ -64,62 +75,91 @@
         super.onCreate(savedInstanceState);
 
         addPreferencesFromResource(R.xml.installed_app_launch_settings);
+        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
+        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
+        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
 
         mPm = getActivity().getPackageManager();
 
+        mIsBrowser = isBrowserApp(mPackageName);
         mHasDomainUrls =
                 (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
-        List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
 
-        List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
-
-        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
-        CharSequence[] entries = getEntries(mPackageName, iviList, filters);
-        mAppDomainUrls.setTitles(entries);
-        mAppDomainUrls.setValues(new int[entries.length]);
-
-        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
-
+        if (!mIsBrowser) {
+            List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
+            List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
+            CharSequence[] entries = getEntries(mPackageName, iviList, filters);
+            mAppDomainUrls.setTitles(entries);
+            mAppDomainUrls.setValues(new int[entries.length]);
+        }
         buildStateDropDown();
     }
 
+    // An app is a "browser" if it has an activity resolution that wound up
+    // marked with the 'handleAllWebDataURI' flag.
+    private boolean isBrowserApp(String packageName) {
+        sBrowserIntent.setPackage(packageName);
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent,
+                PackageManager.MATCH_ALL, UserHandle.myUserId());
+        final int count = list.size();
+        for (int i = 0; i < count; i++) {
+            ResolveInfo info = list.get(i);
+            if (info.activityInfo != null && info.handleAllWebDataURI) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void buildStateDropDown() {
-        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
+        if (mIsBrowser) {
+            // Browsers don't show the app-link prefs
+            mAppLinkState.setShouldDisableView(true);
+            mAppLinkState.setEnabled(false);
+            mAppDomainUrls.setShouldDisableView(true);
+            mAppDomainUrls.setEnabled(false);
+        } else {
+            // Designed order of states in the dropdown:
+            //
+            // * always
+            // * ask
+            // * never
+            mAppLinkState.addItem(R.string.app_link_open_always,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
+            mAppLinkState.addItem(R.string.app_link_open_ask,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+            mAppLinkState.addItem(R.string.app_link_open_never,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
 
-        // Designed order of states in the dropdown:
-        //
-        // * always
-        // * ask
-        // * never
-        mAppLinkState.addItem(R.string.app_link_open_always,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
-        mAppLinkState.addItem(R.string.app_link_open_ask,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
-        mAppLinkState.addItem(R.string.app_link_open_never,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+            mAppLinkState.setEnabled(mHasDomainUrls);
+            if (mHasDomainUrls) {
+                // Present 'undefined' as 'ask' because the OS treats them identically for
+                // purposes of the UI (and does the right thing around pending domain
+                // verifications that might arrive after the user chooses 'ask' in this UI).
+                final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
+                mAppLinkState.setSelectedValue(
+                        (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
+                            ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
+                            : state);
 
-        mAppLinkState.setEnabled(mHasDomainUrls);
-        if (mHasDomainUrls) {
-            // Present 'undefined' as 'ask' because the OS treats them identically for
-            // purposes of the UI (and does the right thing around pending domain
-            // verifications that might arrive after the user chooses 'ask' in this UI).
-            final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
-            mAppLinkState.setSelectedValue(
-                    (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
-                        ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
-                        : state);
-
-            // Set the callback only after setting the initial selected item
-            mAppLinkState.setCallback(new Callback() {
-                @Override
-                public boolean onItemSelected(int pos, Object value) {
-                    return updateAppLinkState((Integer) value);
-                }
-            });
+                // Set the callback only after setting the initial selected item
+                mAppLinkState.setCallback(new Callback() {
+                    @Override
+                    public boolean onItemSelected(int pos, Object value) {
+                        return updateAppLinkState((Integer) value);
+                    }
+                });
+            }
         }
     }
 
     private boolean updateAppLinkState(final int newState) {
+        if (mIsBrowser) {
+            // We shouldn't get into this state, but if we do make sure
+            // not to cause any permanent mayhem.
+            return false;
+        }
+
         final int userId = UserHandle.myUserId();
         final int priorState = mPm.getIntentVerificationStatus(mPackageName, userId);
 
diff --git a/src/com/android/settings/applications/ClearDefaultsPreference.java b/src/com/android/settings/applications/ClearDefaultsPreference.java
index 8be4be0..bcb6a8a 100644
--- a/src/com/android/settings/applications/ClearDefaultsPreference.java
+++ b/src/com/android/settings/applications/ClearDefaultsPreference.java
@@ -93,9 +93,13 @@
             @Override
             public void onClick(View v) {
                 if (mUsbManager != null) {
+                    final int userId = UserHandle.myUserId();
                     mPm.clearPackagePreferredActivities(mPackageName);
+                    if (isDefaultBrowser(mPackageName)) {
+                        mPm.setDefaultBrowserPackageName(null, userId);
+                    }
                     try {
-                        mUsbManager.clearDefaults(mPackageName, UserHandle.myUserId());
+                        mUsbManager.clearDefaults(mPackageName, userId);
                     } catch (RemoteException e) {
                         Log.e(TAG, "mUsbManager.clearDefaults", e);
                     }
@@ -122,6 +126,7 @@
 
         TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
         boolean autoLaunchEnabled = Utils.hasPreferredActivities(mPm, mPackageName)
+                || isDefaultBrowser(mPackageName)
                 || Utils.hasUsbDefaults(mUsbManager, mPackageName);
         if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
             resetLaunchDefaultsUi(autoLaunchView);
@@ -165,6 +170,11 @@
         return true;
     }
 
+    private boolean isDefaultBrowser(String packageName) {
+        final String defaultBrowser = mPm.getDefaultBrowserPackageName(UserHandle.myUserId());
+        return packageName.equals(defaultBrowser);
+    }
+
     private void resetLaunchDefaultsUi(TextView autoLaunchView) {
         autoLaunchView.setText(R.string.auto_launch_disable_text);
         // Disable clear activities button
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index a6b35df..824cd18 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -704,6 +704,10 @@
      * @see android.view.View.OnClickListener#onClick(android.view.View)
      */
     public void onClick(View v) {
+        if (mAppEntry == null) {
+            setIntentAndFinish(true, true);
+            return;
+        }
         String packageName = mAppEntry.info.packageName;
         if(v == mUninstallButton) {
             if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
@@ -961,7 +965,6 @@
             mPermissionReceiver = null;
             final Resources res = getResources();
             CharSequence summary = null;
-            boolean enabled = false;
             if (counts != null) {
                 int totalCount = counts[1];
                 int additionalCounts = counts[2];
@@ -970,8 +973,6 @@
                     summary = res.getString(
                             R.string.runtime_permissions_summary_no_permissions_requested);
                 } else {
-                    enabled = true;
-
                     final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels));
                     if (additionalCounts > 0) {
                         // N additional permissions.
@@ -988,7 +989,6 @@
                 }
             }
             mPermissionsPreference.setSummary(summary);
-            mPermissionsPreference.setEnabled(enabled);
         }
     };
 }
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 5b06661..ba1d918 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -65,8 +65,10 @@
             PowerManager powerManager =
                     (PowerManager)context.getSystemService(Context.POWER_SERVICE);
             String deviceAddress = device != null ? device.getAddress() : null;
-            if (powerManager.isScreenOn() &&
-                    LocalBluetoothPreferences.shouldShowDialogInForeground(context, deviceAddress)) {
+            String deviceName = device != null ? device.getName() : null;
+            boolean shouldShowDialog= LocalBluetoothPreferences.shouldShowDialogInForeground(
+                        context, deviceAddress, deviceName);
+            if (powerManager.isInteractive() && shouldShowDialog) {
                 // Since the screen is on and the BT-related activity is in the foreground,
                 // just open the dialog
                 context.startActivity(pairingIntent);
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 074e0bd..fc6b876 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -107,6 +107,7 @@
             connectionAccessIntent.putExtra(BluetoothDevice.EXTRA_CLASS_NAME, mReturnClass);
 
             String deviceAddress = mDevice != null ? mDevice.getAddress() : null;
+            String deviceName = mDevice != null ? mDevice.getName() : null;
             String title = null;
             String message = null;
             PowerManager powerManager =
@@ -114,7 +115,7 @@
 
             if (powerManager.isScreenOn()
                     && LocalBluetoothPreferences.shouldShowDialogInForeground(
-                            context, deviceAddress)) {
+                            context, deviceAddress, deviceName)) {
                 context.startActivity(connectionAccessIntent);
             } else {
                 // Acquire wakelock so that LCD comes up since screen is off
@@ -134,27 +135,27 @@
                 deleteIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT,
                         BluetoothDevice.CONNECTION_ACCESS_NO);
                 deleteIntent.putExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE, mRequestType);
-                String deviceName = mDevice != null ? mDevice.getAliasName() : null;
+                String deviceAlias = mDevice != null ? mDevice.getAliasName() : null;
                 switch (mRequestType) {
                     case BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS:
                         title = context.getString(R.string.bluetooth_phonebook_request);
                         message = context.getString(R.string.bluetooth_pb_acceptance_dialog_text,
-                                deviceName, deviceName);
+                                deviceAlias, deviceAlias);
                         break;
                     case BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS:
                         title = context.getString(R.string.bluetooth_map_request);
                         message = context.getString(R.string.bluetooth_map_acceptance_dialog_text,
-                                deviceName, deviceName);
+                                deviceAlias, deviceAlias);
                         break;
                     case BluetoothDevice.REQUEST_TYPE_SIM_ACCESS:
                         title = context.getString(R.string.bluetooth_sap_request);
                         message = context.getString(R.string.bluetooth_sap_acceptance_dialog_text,
-                                deviceName, deviceName);
+                                deviceAlias, deviceAlias);
                         break;
                     default:
                         title = context.getString(R.string.bluetooth_connection_permission_request);
                         message = context.getString(R.string.bluetooth_connection_dialog_text,
-                                deviceName, deviceName);
+                                deviceAlias, deviceAlias);
                         break;
                 }
                 Notification notification = new Notification.Builder(context)
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothPreferences.java b/src/com/android/settings/bluetooth/LocalBluetoothPreferences.java
index 9f2553f..401b13c 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothPreferences.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothPreferences.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
@@ -62,10 +63,10 @@
     }
 
     static boolean shouldShowDialogInForeground(Context context,
-            String deviceAddress) {
+            String deviceAddress, String deviceName) {
         LocalBluetoothManager manager = Utils.getLocalBtManager(context);
         if (manager == null) {
-            if(DEBUG) Log.v(TAG, "manager == null - do not show dialog.");
+            if (DEBUG) Log.v(TAG, "manager == null - do not show dialog.");
             return false;
         }
 
@@ -115,6 +116,18 @@
                 }
             }
         }
+
+
+        if (!TextUtils.isEmpty(deviceName)) {
+            // If the device is a custom BT keyboard specifically for this device
+            String packagedKeyboardName = context.getString(
+                    com.android.internal.R.string.config_packagedKeyboardName);
+            if (deviceName.equals(packagedKeyboardName)) {
+                if (DEBUG) Log.v(TAG, "showing dialog for packaged keyboard");
+                return true;
+            }
+        }
+
         if (DEBUG) Log.v(TAG, "Found no reason to show the dialog - do not show dialog.");
         return false;
     }
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index b86f9c6..b52a0ad 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -205,8 +205,10 @@
             removePreferenceFromScreen(KEY_SERIAL_NUMBER);
         }
 
-        //Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
-        if (UserHandle.myUserId() != UserHandle.USER_OWNER) {
+        // Remove SimStatus and Imei for Secondary user as it access Phone b/19165700
+        // Also remove on Wi-Fi only devices.
+        if (UserHandle.myUserId() != UserHandle.USER_OWNER
+                || Utils.isWifiOnly(this)) {
             removePreferenceFromScreen(KEY_SIM_STATUS);
             removePreferenceFromScreen(KEY_IMEI_INFO);
         }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
index 6f89ff5..6f73ecd 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
@@ -137,6 +137,10 @@
         @Override
         protected void onPostExecute(Exception e) {
             final StorageWizardFormatProgress activity = mActivity;
+            if (activity.isDestroyed()) {
+                return;
+            }
+
             if (e != null) {
                 Log.e(TAG, "Failed to partition", e);
                 Toast.makeText(activity, e.getMessage(), Toast.LENGTH_LONG).show();
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
index 2901673..587f41c 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
@@ -56,7 +56,10 @@
         // The following will get the EXTRA_WORD and EXTRA_LOCALE fields that are in the intent.
         // We do need to add the action by hand, because UserDictionaryAddWordContents expects
         // it to be in the bundle, in the EXTRA_MODE key.
-        final Bundle args = intent.getExtras();
+        Bundle args = intent.getExtras();
+        if (args == null) {
+            args = new Bundle();
+        }
         args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, mode);
 
         if (null != savedInstanceState) {
@@ -74,6 +77,7 @@
 
     private void reportBackToCaller(final int resultCode, final Bundle result) {
         final Intent senderIntent = getIntent();
+        if (senderIntent.getExtras() == null) return;
         final Object listener = senderIntent.getExtras().get("listener");
         if (!(listener instanceof Messenger)) return; // This will work if listener is null too.
         final Messenger messenger = (Messenger)listener;
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index 80f9fcd..a6189a9 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.vpn2;
 
+import java.util.Arrays;
+
 import android.app.Dialog;
 import android.app.DialogFragment;
 import android.content.Context;
@@ -123,7 +125,18 @@
             disconnect(profile);
 
             // Delete from KeyStore
-            KeyStore.getInstance().delete(Credentials.VPN + profile.key, KeyStore.UID_SELF);
+            KeyStore keyStore = KeyStore.getInstance();
+            keyStore.delete(Credentials.VPN + profile.key, KeyStore.UID_SELF);
+
+            // If this was the current lockdown VPN, clear it.
+            if (Arrays.equals(profile.key.getBytes(), keyStore.get(Credentials.LOCKDOWN_VPN))) {
+                keyStore.delete(Credentials.LOCKDOWN_VPN);
+                try {
+                    mService.updateLockdownVpn();
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Failed to clear lockdown VPN configuration");
+                }
+            }
         }
         dismiss();
     }
diff --git a/src/com/android/settings/widget/ChartDataUsageView.java b/src/com/android/settings/widget/ChartDataUsageView.java
index cc9acd6..6fb805b 100644
--- a/src/com/android/settings/widget/ChartDataUsageView.java
+++ b/src/com/android/settings/widget/ChartDataUsageView.java
@@ -22,6 +22,7 @@
 import android.content.res.Resources;
 import android.net.NetworkPolicy;
 import android.net.NetworkStatsHistory;
+import android.net.TrafficStats;
 import android.os.Handler;
 import android.os.Message;
 import android.text.Spannable;
@@ -33,6 +34,7 @@
 import android.text.format.Time;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.MathUtils;
 import android.view.MotionEvent;
 import android.view.View;
 
@@ -535,6 +537,7 @@
 
         @Override
         public long buildLabel(Resources res, SpannableStringBuilder builder, long value) {
+            value = MathUtils.constrain(value, 0, TrafficStats.TB_IN_BYTES);
             final BytesResult result = Formatter.formatBytes(res, value,
                     Formatter.FLAG_SHORTER | Formatter.FLAG_CALCULATE_ROUNDED);
             setText(builder, sSpanSize, result.value, "^1");