Merge "Import translations. DO NOT MERGE" into jb-dev
diff --git a/res/layout/app_percentage_item.xml b/res/layout/app_percentage_item.xml
index e5710e4..949999a 100644
--- a/res/layout/app_percentage_item.xml
+++ b/res/layout/app_percentage_item.xml
@@ -18,8 +18,8 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingLeft="@*android:dimen/preference_item_padding_side"
-    android:paddingRight="@*android:dimen/preference_item_padding_side"
+    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
     android:paddingTop="8dip"
     android:paddingBottom="8dip"
     android:columnCount="3">
diff --git a/res/layout/data_usage_cycles.xml b/res/layout/data_usage_cycles.xml
index 136fec6..c9647c8 100644
--- a/res/layout/data_usage_cycles.xml
+++ b/res/layout/data_usage_cycles.xml
@@ -20,8 +20,8 @@
     android:layout_height="40dip"
     android:orientation="horizontal"
     android:gravity="center_vertical"
-    android:paddingLeft="@*android:dimen/preference_item_padding_side"
-    android:paddingRight="@*android:dimen/preference_item_padding_side">
+    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+    android:paddingRight="?android:attr/listPreferredItemPaddingRight">
 
     <TextView
         android:layout_width="wrap_content"
diff --git a/res/layout/data_usage_detail.xml b/res/layout/data_usage_detail.xml
index 639fcf5..0ce17d2 100644
--- a/res/layout/data_usage_detail.xml
+++ b/res/layout/data_usage_detail.xml
@@ -18,20 +18,22 @@
     android:id="@+id/app_detail"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:visibility="gone">
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="@*android:dimen/preference_item_padding_side"
-        android:layout_marginRight="@*android:dimen/preference_item_padding_side"
+        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
+        android:layout_marginRight="?android:attr/listPreferredItemPaddingRight"
         android:orientation="horizontal">
 
         <LinearLayout
             android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:layout_marginRight="@*android:dimen/preference_item_padding_inner"
+            android:layout_marginTop="8dip"
+            android:layout_marginRight="8dip"
             android:orientation="vertical">
 
             <ImageView
@@ -82,8 +84,8 @@
         android:id="@+id/app_settings"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="@*android:dimen/preference_item_padding_side"
-        android:layout_marginRight="@*android:dimen/preference_item_padding_side"
+        android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
+        android:layout_marginRight="?android:attr/listPreferredItemPaddingRight"
         android:layout_marginTop="16dip"
         android:layout_marginBottom="16dip"
         android:text="@string/data_usage_app_settings" />
diff --git a/res/layout/data_usage_header.xml b/res/layout/data_usage_header.xml
index a7b12b7..619956d 100644
--- a/res/layout/data_usage_header.xml
+++ b/res/layout/data_usage_header.xml
@@ -41,8 +41,8 @@
         android:id="@+id/usage_summary"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="@*android:dimen/preference_item_padding_side"
-        android:paddingRight="@*android:dimen/preference_item_padding_side"
+        android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+        android:paddingRight="?android:attr/listPreferredItemPaddingRight"
         android:paddingTop="8dip"
         android:paddingBottom="8dip"
         android:textAppearance="?android:attr/textAppearanceSmall" />
@@ -52,8 +52,8 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:visibility="gone"
-        android:paddingLeft="@*android:dimen/preference_item_padding_side"
-        android:paddingRight="@*android:dimen/preference_item_padding_side"
+        android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
+        android:paddingRight="?android:attr/listPreferredItemPaddingRight"
         android:paddingBottom="8dip"
         android:text="@string/data_usage_empty"
         android:textAppearance="?android:attr/textAppearanceSmall" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8ee96e4..b119f2a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3784,6 +3784,8 @@
     <string name="data_usage_metered_mobile">Mobile networks</string>
     <!-- Header for list of Wi-Fi networks. [CHAR LIMIT=32] -->
     <string name="data_usage_metered_wifi">Wi-Fi networks</string>
+    <!-- Body text prompting user to enable Wi-Fi to configure metered networks. [CHAR LIMIT=64] -->
+    <string name="data_usage_metered_wifi_disabled">To select metered Wi-Fi networks, turn Wi-Fi on.</string>
 
     <!-- Button at the bottom of the CryptKeeper screen to make an emergency call. -->
     <string name="cryptkeeper_emergency_call">Emergency call</string>
diff --git a/res/xml/data_usage_metered_prefs.xml b/res/xml/data_usage_metered_prefs.xml
index 7ec3059..a0c6df4 100644
--- a/res/xml/data_usage_metered_prefs.xml
+++ b/res/xml/data_usage_metered_prefs.xml
@@ -29,6 +29,14 @@
     <PreferenceCategory
         android:key="wifi"
         android:title="@string/data_usage_metered_wifi"
-        android:persistent="false" />
+        android:persistent="false">
+
+        <Preference
+            android:key="wifi_disabled"
+            android:summary="@string/data_usage_metered_wifi_disabled"
+            android:persistent="false"
+            android:selectable="false" />
+
+    </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 2739d91..928b45b 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -49,6 +49,7 @@
 import android.widget.TextView;
 
 import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.Phone;
 
 import java.util.List;
 
@@ -296,6 +297,7 @@
                 | StatusBarManager.DISABLE_HOME
                 | StatusBarManager.DISABLE_RECENT);
 
+        setAirplaneModeIfNecessary();
         mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
         // Check for (and recover) retained instance data
         final Object lastInstance = getLastNonConfigurationInstance();
@@ -607,6 +609,32 @@
     }
 
     /**
+     * Set airplane mode on the device if it isn't an LTE device.
+     * Full story: In minimal boot mode, we cannot save any state. In particular, we cannot save
+     * any incoming SMS's. So SMSs that are received here will be silently dropped to the floor.
+     * That is bad. Also, we cannot receive any telephone calls in this state. So to avoid
+     * both these problems, we turn the radio off. However, on certain networks turning on and
+     * off the radio takes a long time. In such cases, we are better off leaving the radio
+     * running so the latency of an E911 call is short.
+     * The behavior after this is:
+     * 1. Emergency dialing: the emergency dialer has logic to force the device out of
+     *    airplane mode and restart the radio.
+     * 2. Full boot: we read the persistent settings from the previous boot and restore the
+     *    radio to whatever it was before it restarted. This also happens when rebooting a
+     *    phone that has no encryption.
+     */
+    private final void setAirplaneModeIfNecessary() {
+        final boolean isLteDevice =
+                TelephonyManager.getDefault().getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE;
+        if (!isLteDevice) {
+            Log.d(TAG, "Going into airplane mode.");
+            final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+            intent.putExtra("state", true);
+            sendBroadcast(intent);
+        }
+    }
+
+    /**
      * Code to update the state of, and handle clicks from, the "Emergency call" button.
      *
      * This code is mostly duplicated from the corresponding code in
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 1255b6b..3b0ce59 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -394,9 +394,6 @@
         mUsageSummary = (TextView) mHeader.findViewById(R.id.usage_summary);
         mEmpty = (TextView) mHeader.findViewById(android.R.id.empty);
 
-        // only assign layout transitions once first layout is finished
-        mListView.getViewTreeObserver().addOnGlobalLayoutListener(mFirstLayoutListener);
-
         mAdapter = new DataUsageAdapter(mUidDetailProvider, mInsetSide);
         mListView.setOnItemClickListener(mListListener);
         mListView.setAdapter(mAdapter);
@@ -574,25 +571,22 @@
     }
 
     /**
-     * Listener to setup {@link LayoutTransition} after first layout pass.
+     * Build and assign {@link LayoutTransition} to various containers. Should
+     * only be assigned after initial layout is complete.
      */
-    private OnGlobalLayoutListener mFirstLayoutListener = new OnGlobalLayoutListener() {
-        @Override
-        public void onGlobalLayout() {
-            mListView.getViewTreeObserver().removeOnGlobalLayoutListener(mFirstLayoutListener);
+    private void ensureLayoutTransitions() {
+        // skip when already setup
+        if (mChart.getLayoutTransition() != null) return;
 
-            mTabsContainer.setLayoutTransition(buildLayoutTransition());
-            mHeader.setLayoutTransition(buildLayoutTransition());
-            mNetworkSwitchesContainer.setLayoutTransition(buildLayoutTransition());
+        mTabsContainer.setLayoutTransition(buildLayoutTransition());
+        mHeader.setLayoutTransition(buildLayoutTransition());
+        mNetworkSwitchesContainer.setLayoutTransition(buildLayoutTransition());
 
-            final LayoutTransition chartTransition = buildLayoutTransition();
-            chartTransition.setStartDelay(LayoutTransition.APPEARING, 0);
-            chartTransition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
-            chartTransition.setAnimator(LayoutTransition.APPEARING, null);
-            chartTransition.setAnimator(LayoutTransition.DISAPPEARING, null);
-            mChart.setLayoutTransition(chartTransition);
-        }
-    };
+        final LayoutTransition chartTransition = buildLayoutTransition();
+        chartTransition.disableTransitionType(LayoutTransition.APPEARING);
+        chartTransition.disableTransitionType(LayoutTransition.DISAPPEARING);
+        mChart.setLayoutTransition(chartTransition);
+    }
 
     private static LayoutTransition buildLayoutTransition() {
         final LayoutTransition transition = new LayoutTransition();
@@ -1176,6 +1170,9 @@
         }
 
         mUsageSummary.setText(getString(summaryRes, totalPhrase, rangePhrase));
+
+        // initial layout is finished above, ensure we have transitions
+        ensureLayoutTransitions();
     }
 
     private final LoaderCallbacks<ChartData> mChartDataCallbacks = new LoaderCallbacks<
diff --git a/src/com/android/settings/net/DataUsageMeteredSettings.java b/src/com/android/settings/net/DataUsageMeteredSettings.java
index fea8a12..69326bc 100644
--- a/src/com/android/settings/net/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/net/DataUsageMeteredSettings.java
@@ -48,6 +48,7 @@
 
     private PreferenceCategory mMobileCategory;
     private PreferenceCategory mWifiCategory;
+    private Preference mWifiDisabled;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -63,9 +64,9 @@
         addPreferencesFromResource(R.xml.data_usage_metered_prefs);
         mMobileCategory = (PreferenceCategory) findPreference("mobile");
         mWifiCategory = (PreferenceCategory) findPreference("wifi");
+        mWifiDisabled = findPreference("wifi_disabled");
 
         updateNetworks(context);
-
     }
 
     private void updateNetworks(Context context) {
@@ -76,15 +77,15 @@
             getPreferenceScreen().removePreference(mMobileCategory);
         }
 
-        if (hasWifiRadio(context)) {
-            mWifiCategory.removeAll();
+        mWifiCategory.removeAll();
+        if (hasWifiRadio(context) && mWifiManager.isWifiEnabled()) {
             for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
                 if (config.SSID != null) {
                     mWifiCategory.addPreference(buildWifiPref(context, config));
                 }
             }
         } else {
-            getPreferenceScreen().removePreference(mWifiCategory);
+            mWifiCategory.addPreference(mWifiDisabled);
         }
     }