Fix bug #16703191 APN settings shows back button even when you intent into it

- change a bit the way we recognize a SubSetting. Now we can pass the new
":settings:show_fragment_as_subsetting" Intent extra for forcing it.
- convert ApnSettings to a SettingsPreferenceFragment

Change-Id: I22167ad317530c0a58c4d522a72826f9d34ad2d3
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2d2f9b4..6cb227c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -295,10 +295,11 @@
             </intent-filter>
         </activity-alias>
 
-        <activity android:name="ApnSettings"
+        <activity android:name="Settings$ApnSettingsActivity"
                 android:label="@string/apn_settings"
-                android:configChanges="orientation|keyboardHidden|screenSize"
                 android:launchMode="singleTask"
+                android:taskAffinity="com.android.settings"
+                android:configChanges="orientation|keyboardHidden|screenSize"
                 android:parentActivityName="Settings$WirelessSettingsActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -308,6 +309,8 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.ApnSettings" />
         </activity>
 
         <activity android:name="Settings$BluetoothSettingsActivity"
diff --git a/res/layout/apn_disallowed_preference_screen.xml b/res/layout/apn_disallowed_preference_screen.xml
deleted file mode 100644
index 6ac8137..0000000
--- a/res/layout/apn_disallowed_preference_screen.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             android:id="@+id/listContainer"
-             android:layout_width="match_parent"
-             android:layout_height="match_parent">
-
-        <ListView android:id="@android:id/list"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:drawSelectorOnTop="false"
-                android:scrollbarStyle="insideOverlay"
-                android:background="@android:color/white"
-                android:cacheColorHint="@android:color/white"
-                android:fadingEdgeLength="16dip" />
-
-        <TextView android:id="@android:id/empty"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:gravity="center"
-                android:text="@string/apn_settings_not_available"
-                android:textAppearance="?android:attr/textAppearanceMedium" />
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/apn_preference_layout.xml b/res/layout/apn_preference_layout.xml
index 8938f29..f3ee453 100644
--- a/res/layout/apn_preference_layout.xml
+++ b/res/layout/apn_preference_layout.xml
@@ -18,6 +18,8 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:gravity="center_vertical">
 
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index ef79f2b..b8864f3 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -39,8 +39,12 @@
 import android.preference.PreferenceScreen;
 import android.provider.Telephony;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.android.internal.telephony.Phone;
@@ -50,7 +54,7 @@
 
 import java.util.ArrayList;
 
-public class ApnSettings extends PreferenceActivity implements
+public class ApnSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener {
     static final String TAG = "ApnSettings";
 
@@ -121,33 +125,47 @@
     }
 
     @Override
-    protected void onCreate(Bundle icicle) {
+    public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
 
+        mMobileStateFilter = new IntentFilter(
+                TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
+
+        setHasOptionsMenu(true);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        TextView empty = (TextView) getView().findViewById(android.R.id.empty);
+        if (empty != null) {
+            empty.setText(R.string.apn_settings_not_available);
+            getListView().setEmptyView(empty);
+        }
+
         if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
             mUnavailable = true;
-            setContentView(R.layout.apn_disallowed_preference_screen);
+            setPreferenceScreen(new PreferenceScreen(getActivity(), null));
             return;
         }
 
         addPreferencesFromResource(R.xml.apn_settings);
-        getListView().setItemsCanFocus(true);
 
-        mMobileStateFilter = new IntentFilter(
-                TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
+        getListView().setItemsCanFocus(true);
     }
 
     @Override
-    protected void onResume() {
+    public void onResume() {
         super.onResume();
 
         if (mUnavailable) {
             return;
         }
 
-        registerReceiver(mMobileStateReceiver, mMobileStateFilter);
+        getActivity().registerReceiver(mMobileStateReceiver, mMobileStateFilter);
 
         if (!mRestoreDefaultApnMode) {
             fillList();
@@ -157,18 +175,18 @@
     }
 
     @Override
-    protected void onPause() {
+    public void onPause() {
         super.onPause();
 
         if (mUnavailable) {
             return;
         }
 
-        unregisterReceiver(mMobileStateReceiver);
+        getActivity().unregisterReceiver(mMobileStateReceiver);
     }
 
     @Override
-    protected void onDestroy() {
+    public void onDestroy() {
         super.onDestroy();
 
         if (mRestoreDefaultApnThread != null) {
@@ -199,7 +217,7 @@
                 String key = cursor.getString(ID_INDEX);
                 String type = cursor.getString(TYPES_INDEX);
 
-                ApnPreference pref = new ApnPreference(this);
+                ApnPreference pref = new ApnPreference(getActivity());
 
                 pref.setKey(key);
                 pref.setTitle(name);
@@ -228,16 +246,18 @@
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        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);
-        return true;
+    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);
+            menu.add(0, MENU_RESTORE, 0,
+                    getResources().getString(R.string.menu_restore))
+                    .setIcon(android.R.drawable.ic_menu_upload);
+        }
+
+        super.onCreateOptionsMenu(menu, inflater);
     }
 
     @Override
@@ -329,9 +349,9 @@
                     fillList();
                     getPreferenceScreen().setEnabled(true);
                     mRestoreDefaultApnMode = false;
-                    dismissDialog(DIALOG_RESTORE_DEFAULTAPN);
+                    removeDialog(DIALOG_RESTORE_DEFAULTAPN);
                     Toast.makeText(
-                        ApnSettings.this,
+                        getActivity(),
                         getResources().getString(
                                 R.string.restore_default_apn_completed),
                         Toast.LENGTH_LONG).show();
@@ -362,20 +382,13 @@
     }
 
     @Override
-    protected Dialog onCreateDialog(int id) {
+    public Dialog onCreateDialog(int id) {
         if (id == DIALOG_RESTORE_DEFAULTAPN) {
-            ProgressDialog dialog = new ProgressDialog(this);
+            ProgressDialog dialog = new ProgressDialog(getActivity());
             dialog.setMessage(getResources().getString(R.string.restore_default_apn));
             dialog.setCancelable(false);
             return dialog;
         }
         return null;
     }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        if (id == DIALOG_RESTORE_DEFAULTAPN) {
-            getPreferenceScreen().setEnabled(false);
-        }
-    }
 }
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 123d4fe..b714d28 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -98,5 +98,6 @@
     public static class QuickLaunchSettingsActivity extends SettingsActivity { /* empty */ }
 
     public static class TopLevelSettings extends SettingsActivity { /* empty */ }
+    public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
 }
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index bf0d9a1..9f1600b 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -184,8 +184,13 @@
      * that fragment.
      */
     public static final String EXTRA_SHOW_FRAGMENT_TITLE = ":settings:show_fragment_title";
-    public static final String EXTRA_SHOW_FRAGMENT_TITLE_RESID = ":settings:show_fragment_title_resid";
-    public static final String EXTRA_SHOW_FRAGMENT_AS_SHORTCUT = ":settings:show_fragment_as_shortcut";
+    public static final String EXTRA_SHOW_FRAGMENT_TITLE_RESID =
+            ":settings:show_fragment_title_resid";
+    public static final String EXTRA_SHOW_FRAGMENT_AS_SHORTCUT =
+            ":settings:show_fragment_as_shortcut";
+
+    public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING =
+            ":settings:show_fragment_as_subsetting";
 
     private static final String META_DATA_KEY_FRAGMENT_CLASS =
         "com.android.settings.FRAGMENT_CLASS";
@@ -290,7 +295,8 @@
             NotificationAppList.class.getName(),
             AppNotificationSettings.class.getName(),
             OtherSoundSettings.class.getName(),
-            QuickLaunchSettings.class.getName()
+            QuickLaunchSettings.class.getName(),
+            ApnSettings.class.getName()
     };
 
 
@@ -495,12 +501,15 @@
         final String className = cn.getClassName();
 
         mIsShowingDashboard = className.equals(Settings.class.getName());
-        final boolean isSubSettings = className.equals(SubSettings.class.getName());
 
-        // If this is a sub settings or not the main Dashboard and not a Shortcut and an initial
-        // Fragment then apply the SubSettings theme for the ActionBar content insets
-        if (isSubSettings ||
-                (!mIsShowingDashboard && !mIsShortcut && (initialFragmentName != null))) {
+        // This is a "Sub Settings" when:
+        // - this is a real SubSettings
+        // - or :settings:show_fragment_as_subsetting is passed to the Intent
+        final boolean isSubSettings = className.equals(SubSettings.class.getName()) ||
+                intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
+
+        // If this is a sub settings, then apply the SubSettings Theme for the ActionBar content insets
+        if (isSubSettings) {
             // Check also that we are not a Theme Dialog as we don't want to override them
             final int themeResId = getThemeResId();
             if (themeResId != R.style.Theme_DialogWhenLarge &&
@@ -550,6 +559,9 @@
                 } else if (isSubSettings) {
                     mDisplayHomeAsUpEnabled = true;
                     mDisplaySearch = true;
+                } else {
+                    mDisplayHomeAsUpEnabled = false;
+                    mDisplaySearch = false;
                 }
                 setTitleFromIntent(intent);