Remove toggle switch on accessibility preference fragment detach

BUG: 13169998
Change-Id: Id6bac95feb53fec7bb56e6af5c7f5e407e8eba55
diff --git a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
index 324c595..49e31cf 100644
--- a/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
+++ b/src/com/android/settings/accessibility/CaptionPropertiesFragment.java
@@ -69,6 +69,7 @@
     private CaptioningManager mCaptioningManager;
     private SubtitleView mPreviewText;
     private View mPreviewWindow;
+    private ToggleSwitch mToggleSwitch;
 
     // Standard options.
     private LocalePreference mLocale;
@@ -124,13 +125,38 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
+        final boolean enabled = mCaptioningManager.isEnabled();
         mPreviewText = (SubtitleView) view.findViewById(R.id.preview_text);
+        mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
+
+        final Context context = view.getContext();
+        final int padding = context.getResources().getDimensionPixelSize(
+                R.dimen.action_bar_switch_padding);
+        mToggleSwitch = new ToggleSwitch(context);
+        mToggleSwitch.setPaddingRelative(0, 0, padding, 0);
+        mToggleSwitch.setCheckedInternal(enabled);
+
         mPreviewWindow = view.findViewById(R.id.preview_window);
 
-        installActionBarToggleSwitch();
+        getPreferenceScreen().setEnabled(enabled);
+
         refreshPreviewText();
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        installActionBarToggleSwitch();
+    }
+
+    @Override
+    public void onPause() {
+        removeActionBarToggleSwitch();
+
+        super.onPause();
+    }
+
     private void refreshPreviewText() {
         final Context context = getActivity();
         if (context == null) {
@@ -176,39 +202,41 @@
         }
     }
 
-    private void installActionBarToggleSwitch() {
-        final Activity activity = getActivity();
-        final ToggleSwitch toggleSwitch = new ToggleSwitch(activity);
-
-        final int padding = getResources().getDimensionPixelSize(
-                R.dimen.action_bar_switch_padding);
-        toggleSwitch.setPaddingRelative(0, 0, padding, 0);
-
-        final ActionBar actionBar = activity.getActionBar();
-        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
-
-        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
-                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
-                        Gravity.CENTER_VERTICAL | Gravity.END);
-        actionBar.setCustomView(toggleSwitch, params);
-
-        final boolean enabled = mCaptioningManager.isEnabled();
-        getPreferenceScreen().setEnabled(enabled);
-        mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
-        toggleSwitch.setCheckedInternal(enabled);
-        toggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() {
+    protected void onInstallActionBarToggleSwitch() {
+        mToggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() {
             @Override
             public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
                 toggleSwitch.setCheckedInternal(checked);
                 Settings.Secure.putInt(getActivity().getContentResolver(),
                         Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, checked ? 1 : 0);
                 getPreferenceScreen().setEnabled(checked);
-                mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE);
+                if (mPreviewText != null) {
+                    mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE);
+                }
                 return false;
             }
         });
     }
 
+    private void installActionBarToggleSwitch() {
+        final ActionBar ab = getActivity().getActionBar();
+        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
+                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
+                        Gravity.CENTER_VERTICAL | Gravity.END);
+        ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
+        ab.setCustomView(mToggleSwitch, params);
+
+        onInstallActionBarToggleSwitch();
+    }
+
+    private void removeActionBarToggleSwitch() {
+        mToggleSwitch.setOnBeforeCheckedChangeListener(null);
+
+        final ActionBar ab = getActivity().getActionBar();
+        ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM);
+        ab.setCustomView(null);
+    }
+
     private void initializeAllPreferences() {
         mLocale = (LocalePreference) findPreference(PREF_LOCALE);
         mFontSize = (ListPreference) findPreference(PREF_FONT_SIZE);
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index d56e37c..03f9072 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -18,6 +18,7 @@
 
 import android.app.ActionBar;
 import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
@@ -86,15 +87,28 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        onInstallActionBarToggleSwitch();
+
+        final Context context = view.getContext();
+        final int padding = context.getResources().getDimensionPixelSize(
+                R.dimen.action_bar_switch_padding);
+        mToggleSwitch = new ToggleSwitch(context);
+        mToggleSwitch.setPaddingRelative(0, 0, padding, 0);
+
         onProcessArguments(getArguments());
     }
 
     @Override
-    public void onDestroyView() {
-        getActivity().getActionBar().setCustomView(null);
-        mToggleSwitch.setOnBeforeCheckedChangeListener(null);
-        super.onDestroyView();
+    public void onResume() {
+        super.onResume();
+
+        installActionBarToggleSwitch();
+    }
+
+    @Override
+    public void onPause() {
+        removeActionBarToggleSwitch();
+
+        super.onPause();
     }
 
     protected abstract void onPreferenceToggled(String preferenceKey, boolean enabled);
@@ -108,21 +122,26 @@
     }
 
     protected void onInstallActionBarToggleSwitch() {
-        mToggleSwitch = createAndAddActionBarToggleSwitch(getActivity());
+        // Implement this to set a checked listener.
     }
 
-    private ToggleSwitch createAndAddActionBarToggleSwitch(Activity activity) {
-        ToggleSwitch toggleSwitch = new ToggleSwitch(activity);
-        final int padding = activity.getResources().getDimensionPixelSize(
-                R.dimen.action_bar_switch_padding);
-        toggleSwitch.setPaddingRelative(0, 0, padding, 0);
-        activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
-                ActionBar.DISPLAY_SHOW_CUSTOM);
-        activity.getActionBar().setCustomView(toggleSwitch,
-                new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT,
-                        ActionBar.LayoutParams.WRAP_CONTENT,
-                                Gravity.CENTER_VERTICAL | Gravity.END));
-        return toggleSwitch;
+    private void installActionBarToggleSwitch() {
+        final ActionBar ab = getActivity().getActionBar();
+        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
+                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
+                Gravity.CENTER_VERTICAL | Gravity.END);
+        ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
+        ab.setCustomView(mToggleSwitch, params);
+
+        onInstallActionBarToggleSwitch();
+    }
+
+    private void removeActionBarToggleSwitch() {
+        mToggleSwitch.setOnBeforeCheckedChangeListener(null);
+
+        final ActionBar ab = getActivity().getActionBar();
+        ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM);
+        ab.setCustomView(null);
     }
 
     public void setTitle(String title) {