Merge "Set activity title from preference screen title."
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 1202d13..7203e24 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -55,6 +55,7 @@
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.backup.BackupSettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.instrumentation.SharedPreferencesLogger;
@@ -209,8 +210,12 @@
 
     @Override
     public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
-        startPreferencePanel(caller, pref.getFragment(), pref.getExtras(), -1, pref.getTitle(),
-                null, 0);
+        if (InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
+            startPreferencePanel(caller, pref.getFragment(), pref.getExtras(), -1, null, null, 0);
+        } else {
+            startPreferencePanel(caller, pref.getFragment(), pref.getExtras(), -1, pref.getTitle(),
+                    null, 0);
+        }
         return true;
     }
 
@@ -629,7 +634,7 @@
         if (titleRes < 0) {
             if (titleText != null) {
                 title = titleText.toString();
-            } else {
+            } else if (!InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
                 // There not much we can do in that case
                 title = "";
             }
diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
index a5d0715..9ab1a01 100644
--- a/src/com/android/settings/core/InstrumentedPreferenceFragment.java
+++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
@@ -16,8 +16,15 @@
 
 package com.android.settings.core;
 
+import android.annotation.Nullable;
+import android.annotation.StringRes;
 import android.content.Context;
 import android.os.Bundle;
+import android.support.annotation.XmlRes;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
 
 import com.android.settings.core.instrumentation.Instrumentable;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
@@ -32,6 +39,9 @@
 public abstract class InstrumentedPreferenceFragment extends ObservablePreferenceFragment
         implements Instrumentable {
 
+    private static final String TAG = "InstrumentedPrefFrag";
+    private static final String FEATURE_FLAG_USE_PREFERENCE_SCREEN_TITLE =
+            "settings_use_preference_screen_title";
     protected MetricsFeatureProvider mMetricsFeatureProvider;
 
     // metrics placeholder value. Only use this for development.
@@ -47,6 +57,17 @@
     }
 
     @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (usePreferenceScreenTitle()) {
+            final int title = getTitle();
+            if (title != -1) {
+                getActivity().setTitle(title);
+            }
+        }
+    }
+
+    @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
@@ -62,6 +83,16 @@
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
     }
 
+    @Override
+    public void addPreferencesFromResource(@XmlRes int preferencesResId) {
+        super.addPreferencesFromResource(preferencesResId);
+        updateActivityTitleWithScreenTitle(getPreferenceScreen());
+    }
+
+    public static boolean usePreferenceScreenTitle() {
+        return FeatureFlagUtils.isEnabled(FEATURE_FLAG_USE_PREFERENCE_SCREEN_TITLE);
+    }
+
     protected final Context getPrefContext() {
         return getPreferenceManager().getContext();
     }
@@ -69,4 +100,27 @@
     protected final VisibilityLoggerMixin getVisibilityLogger() {
         return mVisibilityLoggerMixin;
     }
+
+    /**
+     * Return the resource id of the title to be used for the fragment. This is for preference
+     * fragments that do not have an explicit preference screen xml, and hence the title need to be
+     * specified separately. Do not use this method if the title is already specified in the
+     * preference screen.
+     */
+    @StringRes
+    protected int getTitle() {
+        return -1;
+    }
+
+    private void updateActivityTitleWithScreenTitle(PreferenceScreen screen) {
+        if (usePreferenceScreenTitle() && screen != null) {
+            final CharSequence title = screen.getTitle();
+            if (!TextUtils.isEmpty(title)) {
+                getActivity().setTitle(title);
+            } else {
+                Log.w(TAG, "Screen title missing for fragment " + this.getClass().getName());
+            }
+        }
+    }
+
 }