diff --git a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
index ab8f18a..63ccb6e 100644
--- a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
+++ b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java
@@ -19,7 +19,6 @@
 import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
-import android.app.Activity;
 import android.app.Dialog;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
@@ -60,10 +59,17 @@
         return false;
     };
 
-    public static Dialog createCapabilitiesDialog(Activity parentActivity,
+    /**
+     * Gets a content View for a dialog to confirm that they want to enable a service.
+     *
+     * @param context A valid context
+     * @param info The info about a service
+     * @return A content view suitable for viewing
+     */
+    public static Dialog createCapabilitiesDialog(Context context,
             AccessibilityServiceInfo info, View.OnClickListener listener) {
-        final AlertDialog ad = new AlertDialog.Builder(parentActivity)
-                .setView(createEnableDialogContentView(parentActivity, info, listener))
+        final AlertDialog ad = new AlertDialog.Builder(context)
+                .setView(createEnableDialogContentView(context, info, listener))
                 .create();
 
         Window window = ad.getWindow();
@@ -77,7 +83,7 @@
     }
 
     /**
-     * Return whether the device is encrypted with legacy full disk encryption. Newer devices
+     * Returns whether the device is encrypted with legacy full disk encryption. Newer devices
      * should be using File Based Encryption.
      *
      * @return true if device is encrypted
@@ -86,13 +92,6 @@
         return StorageManager.isNonDefaultBlockEncrypted();
     }
 
-    /**
-     * Get a content View for a dialog to confirm that they want to enable a service.
-     *
-     * @param context A valid context
-     * @param info The info about a service
-     * @return A content view suitable for viewing
-     */
     private static View createEnableDialogContentView(Context context,
             AccessibilityServiceInfo info, View.OnClickListener listener) {
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index bae6775..fcdd010 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -23,7 +23,6 @@
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.ContentResolver;
-import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
@@ -98,7 +97,7 @@
     @Override
     public void onPreferenceToggled(String preferenceKey, boolean enabled) {
         ComponentName toggledService = ComponentName.unflattenFromString(preferenceKey);
-        AccessibilityUtils.setAccessibilityServiceState(getActivity(), toggledService, enabled);
+        AccessibilityUtils.setAccessibilityServiceState(getPrefContext(), toggledService, enabled);
     }
 
     // IMPORTANT: Refresh the info since there are dynamically changing
@@ -129,7 +128,7 @@
                     return null;
                 }
                 mDialog = AccessibilityServiceWarning
-                        .createCapabilitiesDialog(getActivity(), info,
+                        .createCapabilitiesDialog(getPrefContext(), info,
                                 this::onDialogButtonFromToggleClicked);
                 break;
             }
@@ -139,17 +138,17 @@
                     return null;
                 }
                 mDialog = AccessibilityServiceWarning
-                        .createCapabilitiesDialog(getActivity(), info,
+                        .createCapabilitiesDialog(getPrefContext(), info,
                                 this::onDialogButtonFromShortcutClicked);
                 break;
             }
             case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL: {
-                if (AccessibilityUtil.isGestureNavigateEnabled(getContext())) {
+                if (AccessibilityUtil.isGestureNavigateEnabled(getPrefContext())) {
                     mDialog = AccessibilityGestureNavigationTutorial
-                            .showGestureNavigationTutorialDialog(getActivity());
+                            .showGestureNavigationTutorialDialog(getPrefContext());
                 } else {
                     mDialog = AccessibilityGestureNavigationTutorial
-                            .showAccessibilityButtonTutorialDialog(getActivity());
+                            .showAccessibilityButtonTutorialDialog(getPrefContext());
                 }
                 break;
             }
@@ -185,7 +184,7 @@
     }
 
     private void updateSwitchBarToggleSwitch() {
-        final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getActivity())
+        final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getPrefContext())
                 .contains(mComponentName);
         mSwitchBar.setCheckedInternal(checked);
     }
@@ -220,8 +219,8 @@
     }
 
     private boolean isServiceSupportAccessibilityButton() {
-        final AccessibilityManager ams = (AccessibilityManager) getContext().getSystemService(
-                Context.ACCESSIBILITY_SERVICE);
+        final AccessibilityManager ams = getPrefContext().getSystemService(
+                AccessibilityManager.class);
         final List<AccessibilityServiceInfo> services = ams.getInstalledAccessibilityServiceList();
 
         for (AccessibilityServiceInfo info : services) {
@@ -268,17 +267,17 @@
 
     @Override
     public void onCheckboxClicked(ShortcutPreference preference) {
-        final int shortcutTypes = getUserShortcutType(getContext(), UserShortcutType.SOFTWARE);
+        final int shortcutTypes = getUserShortcutType(getPrefContext(), UserShortcutType.SOFTWARE);
         if (preference.getChecked()) {
             if (!getArguments().getBoolean(AccessibilitySettings.EXTRA_CHECKED)) {
                 preference.setChecked(false);
                 showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_SHORTCUT);
             } else {
-                AccessibilityUtil.optInAllValuesToSettings(getContext(), shortcutTypes,
+                AccessibilityUtil.optInAllValuesToSettings(getPrefContext(), shortcutTypes,
                         mComponentName);
             }
         } else {
-            AccessibilityUtil.optOutAllValuesFromSettings(getContext(), shortcutTypes,
+            AccessibilityUtil.optOutAllValuesFromSettings(getPrefContext(), shortcutTypes,
                     mComponentName);
             getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, false);
         }
@@ -370,8 +369,8 @@
     private void onAllowButtonFromShortcutClicked() {
         mShortcutPreference.setChecked(true);
 
-        final int shortcutTypes = getUserShortcutType(getContext(), UserShortcutType.SOFTWARE);
-        AccessibilityUtil.optInAllValuesToSettings(getContext(), shortcutTypes, mComponentName);
+        final int shortcutTypes = getUserShortcutType(getPrefContext(), UserShortcutType.SOFTWARE);
+        AccessibilityUtil.optInAllValuesToSettings(getPrefContext(), shortcutTypes, mComponentName);
 
         mDialog.dismiss();
     }
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index ddc9424..409b395 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -114,7 +114,7 @@
         final int resId = getPreferenceScreenResId();
         if (resId <= 0) {
             PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(
-                    getActivity());
+                    getPrefContext());
             setPreferenceScreen(preferenceScreen);
         }
     }
@@ -143,7 +143,7 @@
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         if (mImageUri != null) {
             final AnimatedImagePreference animatedImagePreference = new AnimatedImagePreference(
-                    preferenceScreen.getContext());
+                    getPrefContext());
             animatedImagePreference.setImageUri(mImageUri);
             animatedImagePreference.setDividerAllowedAbove(true);
             preferenceScreen.addPreference(animatedImagePreference);
@@ -158,7 +158,7 @@
 
         // Show the "Settings" menu as if it were a preference screen.
         if (mSettingsTitle != null && mSettingsIntent != null) {
-            mSettingsPreference = new Preference(preferenceScreen.getContext());
+            mSettingsPreference = new Preference(getPrefContext());
             mSettingsPreference.setTitle(mSettingsTitle);
             mSettingsPreference.setIconSpaceReserved(true);
             mSettingsPreference.setIntent(mSettingsIntent);
@@ -177,7 +177,7 @@
 
             if (mStaticDescription != null) {
                 final StaticTextPreference staticTextPreference = new StaticTextPreference(
-                        preferenceScreen.getContext());
+                        getPrefContext());
                 staticTextPreference.setSummary(mStaticDescription);
                 staticTextPreference.setSelectable(/* selectable= */ false);
                 footerCategory.addPreference(staticTextPreference);
@@ -189,7 +189,7 @@
                 unsupportedTagList.add(ANCHOR_TAG);
 
                 final HtmlTextPreference htmlTextPreference = new HtmlTextPreference(
-                        preferenceScreen.getContext());
+                        getPrefContext());
                 htmlTextPreference.setSummary(mHtmlDescription);
                 htmlTextPreference.setImageGetter(mImageGetter);
                 htmlTextPreference.setUnsupportedTagList(unsupportedTagList);
@@ -234,10 +234,10 @@
     public Dialog onCreateDialog(int dialogId) {
         switch (dialogId) {
             case DialogEnums.EDIT_SHORTCUT:
-                final CharSequence dialogTitle = getActivity().getString(
+                final CharSequence dialogTitle = getPrefContext().getString(
                         R.string.accessibility_shortcut_edit_dialog_title, mPackageName);
-                Dialog dialog = AccessibilityEditDialogUtils.showEditShortcutDialog(getActivity(),
-                        dialogTitle, this::callOnAlertDialogCheckboxClicked);
+                Dialog dialog = AccessibilityEditDialogUtils.showEditShortcutDialog(
+                        getPrefContext(), dialogTitle, this::callOnAlertDialogCheckboxClicked);
                 initializeDialogCheckBox(dialog);
                 return dialog;
             default:
@@ -258,37 +258,35 @@
     /** Denotes the dialog emuns for show dialog */
     @Retention(RetentionPolicy.SOURCE)
     protected @interface DialogEnums {
-        int UNKNOWN = 0;
-
         /** OPEN: Settings > Accessibility > Any toggle service > Shortcut > Settings. */
         int EDIT_SHORTCUT = 1;
 
         /** OPEN: Settings > Accessibility > Magnification > Shortcut > Settings. */
-        int MAGNIFICATION_EDIT_SHORTCUT = 2;
+        int MAGNIFICATION_EDIT_SHORTCUT = 1001;
 
         /**
          * OPEN: Settings > Accessibility > Magnification > Toggle user service in gesture
          * navigation.
          */
-        int GESTURE_NAVIGATION_TUTORIAL = 1001;
+        int GESTURE_NAVIGATION_TUTORIAL = 1002;
 
         /**
          * OPEN: Settings > Accessibility > Magnification > Toggle user service in button
          * navigation.
          */
-        int ACCESSIBILITY_BUTTON_TUTORIAL = 1002;
+        int ACCESSIBILITY_BUTTON_TUTORIAL = 1003;
 
         /** OPEN: Settings > Accessibility > Downloaded toggle service > Toggle user service. */
-        int ENABLE_WARNING_FROM_TOGGLE = 1003;
+        int ENABLE_WARNING_FROM_TOGGLE = 1004;
 
         /** OPEN: Settings > Accessibility > Downloaded toggle service > Shortcut checkbox. */
-        int ENABLE_WARNING_FROM_SHORTCUT = 1004;
+        int ENABLE_WARNING_FROM_SHORTCUT = 1005;
 
         /**
          * OPEN: Settings > Accessibility > Downloaded toggle service > Toggle user service > Show
          * launch tutorial.
          */
-        int LAUNCH_ACCESSIBILITY_TUTORIAL = 1005;
+        int LAUNCH_ACCESSIBILITY_TUTORIAL = 1006;
     }
 
     @Override
@@ -364,7 +362,7 @@
 
     private Drawable getDrawableFromUri(Uri imageUri) {
         if (mImageGetterCacheView == null) {
-            mImageGetterCacheView = new ImageView(getContext());
+            mImageGetterCacheView = new ImageView(getPrefContext());
         }
 
         mImageGetterCacheView.setAdjustViewBounds(true);
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 8873da1..b82a344 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -241,16 +241,17 @@
         switch (dialogId) {
             case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
                 return AccessibilityGestureNavigationTutorial
-                        .showGestureNavigationTutorialDialog(getActivity());
+                        .showGestureNavigationTutorialDialog(getPrefContext());
             case DialogEnums.ACCESSIBILITY_BUTTON_TUTORIAL:
                 return AccessibilityGestureNavigationTutorial
-                        .showAccessibilityButtonTutorialDialog(getActivity());
+                        .showAccessibilityButtonTutorialDialog(getPrefContext());
             case DialogEnums.MAGNIFICATION_EDIT_SHORTCUT:
-                final CharSequence dialogTitle = getActivity().getText(
+                final CharSequence dialogTitle = getPrefContext().getText(
                         R.string.accessibility_shortcut_edit_dialog_title_magnification);
                 final AlertDialog dialog =
                         AccessibilityEditDialogUtils.showMagnificationEditShortcutDialog(
-                                getActivity(), dialogTitle, this::callOnAlertDialogCheckboxClicked);
+                                getPrefContext(), dialogTitle,
+                                this::callOnAlertDialogCheckboxClicked);
                 initializeDialogCheckBox(dialog);
                 return dialog;
         }
@@ -425,7 +426,7 @@
         if (enabled && TextUtils.equals(
                 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
                 preferenceKey)) {
-            showDialog(AccessibilityUtil.isGestureNavigateEnabled(getContext())
+            showDialog(AccessibilityUtil.isGestureNavigateEnabled(getPrefContext())
                     ? DialogEnums.GESTURE_NAVIGATION_TUTORIAL
                     : DialogEnums.ACCESSIBILITY_BUTTON_TUTORIAL);
         }
@@ -457,11 +458,11 @@
 
     @Override
     public void onCheckboxClicked(ShortcutPreference preference) {
-        final int shortcutTypes = getUserShortcutType(getContext(), UserShortcutType.SOFTWARE);
+        final int shortcutTypes = getUserShortcutType(getPrefContext(), UserShortcutType.SOFTWARE);
         if (preference.getChecked()) {
-            optInAllMagnificationValuesToSettings(getContext(), shortcutTypes);
+            optInAllMagnificationValuesToSettings(getPrefContext(), shortcutTypes);
         } else {
-            optOutAllMagnificationValuesFromSettings(getContext(), shortcutTypes);
+            optOutAllMagnificationValuesFromSettings(getPrefContext(), shortcutTypes);
         }
     }
 
@@ -483,31 +484,19 @@
     }
 
     private void initShortcutPreference() {
-        final PreferenceScreen preferenceScreen = getPreferenceScreen();
-        mShortcutPreference = new ShortcutPreference(
-                preferenceScreen.getContext(), null);
+        mShortcutPreference = new ShortcutPreference(getPrefContext(), null);
         mShortcutPreference.setPersistent(false);
-        mShortcutPreference.setKey(getShortcutPreferenceKey());
+        mShortcutPreference.setKey(KEY_SHORTCUT_PREFERENCE);
         mShortcutPreference.setTitle(R.string.accessibility_magnification_shortcut_title);
         mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
         mShortcutPreference.setOnClickListener(this);
     }
 
     private void updateShortcutPreference() {
-        final PreferenceScreen preferenceScreen = getPreferenceScreen();
-        final ShortcutPreference shortcutPreference = preferenceScreen.findPreference(
-                getShortcutPreferenceKey());
-
-        if (shortcutPreference != null) {
-            final int shortcutTypes = getUserShortcutType(getContext(), UserShortcutType.SOFTWARE);
-            shortcutPreference.setChecked(
-                    hasMagnificationValuesInSettings(getContext(), shortcutTypes));
-            shortcutPreference.setSummary(getShortcutTypeSummary(getContext()));
-        }
-    }
-
-    private String getShortcutPreferenceKey() {
-        return KEY_SHORTCUT_PREFERENCE;
+        final int shortcutTypes = getUserShortcutType(getPrefContext(), UserShortcutType.SOFTWARE);
+        mShortcutPreference.setChecked(
+                hasMagnificationValuesInSettings(getPrefContext(), shortcutTypes));
+        mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
     }
 
     private void updateConfigurationWarningIfNeeded() {
