diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index b5ec202..1dd8524 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -129,6 +129,7 @@
 import com.android.dialer.simulator.SimulatorComponent;
 import com.android.dialer.smartdial.SmartDialNameMatcher;
 import com.android.dialer.smartdial.SmartDialPrefix;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PermissionsUtil;
@@ -637,7 +638,8 @@
         && !getSystemService(KeyguardManager.class).isKeyguardLocked()) {
       mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
     }
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this)
+    StorageComponent.get(this)
+        .unencryptedSharedPrefs()
         .edit()
         .putInt(KEY_LAST_TAB, mListsFragment.getCurrentTabIndex())
         .apply();
@@ -1117,7 +1119,8 @@
     } else if (isLastTabEnabled) {
       @TabIndex
       int tabIndex =
-          DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this)
+          StorageComponent.get(this)
+              .unencryptedSharedPrefs()
               .getInt(KEY_LAST_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
       // If voicemail tab is saved and its availability changes, we still move to the voicemail tab
       // but it is quickly removed and shown the contacts tab.
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
index 0a6f2c1..3ce837b 100644
--- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
+++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
@@ -33,7 +33,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.PerAccountSharedPreferences;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailComponent;
 
@@ -140,8 +140,6 @@
   static PerAccountSharedPreferences getSharedPreferences(
       Context context, PhoneAccountHandle phoneAccountHandle) {
     return new PerAccountSharedPreferences(
-        context,
-        phoneAccountHandle,
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context));
+        context, phoneAccountHandle, StorageComponent.get(context).unencryptedSharedPrefs());
   }
 }
diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
index fba3b86..6433355 100644
--- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java
+++ b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
@@ -37,7 +37,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.notification.NotificationChannelId;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.util.PermissionsUtil;
 import java.util.concurrent.TimeUnit;
 
@@ -187,7 +187,8 @@
   }
 
   public static long getLastEmergencyCallTimeMillis(Context context) {
-    return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    return StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
   }
 
@@ -210,7 +211,8 @@
       return;
     }
 
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
         .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
@@ -227,7 +229,8 @@
       return;
     }
     // Skip if the user has already received a notification for the most recent emergency call.
-    if (DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    if (StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .getBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)) {
       return;
     }
@@ -268,7 +271,8 @@
                 builder.build());
 
             // Record that the user has been notified for this emergency call.
-            DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+            StorageComponent.get(context)
+                .unencryptedSharedPrefs()
                 .edit()
                 .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
                 .apply();
diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java
index bad5d7f..eedf073 100644
--- a/java/com/android/dialer/callcomposer/CallComposerActivity.java
+++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java
@@ -73,8 +73,8 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.multimedia.MultimediaData;
 import com.android.dialer.protos.ProtoParsers;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.telecom.TelecomUtil;
-import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.UriUtils;
 import com.android.dialer.util.ViewUtil;
 import com.android.dialer.widget.DialerToolbar;
@@ -459,8 +459,7 @@
   }
 
   private void maybeShowPrivacyToast(MultimediaData data) {
-    SharedPreferences preferences =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this);
+    SharedPreferences preferences = StorageComponent.get(this).unencryptedSharedPrefs();
     // Show a toast for privacy purposes if this is the first time a user uses call composer.
     if (preferences.getBoolean(KEY_IS_FIRST_CALL_COMPOSE, true)) {
       int privacyMessage =
diff --git a/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java b/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java
index 5351698..d700fb6 100644
--- a/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java
+++ b/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java
@@ -24,8 +24,8 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.inject.ApplicationContext;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.strictmode.StrictModeUtils;
-import com.android.dialer.util.DialerUtils;
 import javax.inject.Inject;
 
 /**
@@ -115,6 +115,6 @@
   }
 
   private static SharedPreferences getSharedPrefs(Context appContext) {
-    return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(appContext);
+    return StorageComponent.get(appContext).unencryptedSharedPrefs();
   }
 }
diff --git a/java/com/android/dialer/postcall/PostCall.java b/java/com/android/dialer/postcall/PostCall.java
index 011fbc9..341db3b 100644
--- a/java/com/android/dialer/postcall/PostCall.java
+++ b/java/com/android/dialer/postcall/PostCall.java
@@ -36,6 +36,7 @@
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.performancereport.PerformanceReport;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.IntentUtil;
 
@@ -103,7 +104,8 @@
                 activity.getResources().getColor(R.color.dialer_snackbar_action_text_color));
     activeSnackbar.show();
     Logger.get(activity).logImpression(DialerImpression.Type.POST_CALL_PROMPT_USER_TO_SEND_MESSAGE);
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(activity)
+    StorageComponent.get(activity)
+        .unencryptedSharedPrefs()
         .edit()
         .remove(KEY_POST_CALL_CALL_DISCONNECT_TIME)
         .apply();
@@ -141,21 +143,24 @@
     activeSnackbar.show();
     Logger.get(activity)
         .logImpression(DialerImpression.Type.POST_CALL_PROMPT_USER_TO_VIEW_SENT_MESSAGE);
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(activity)
+    StorageComponent.get(activity)
+        .unencryptedSharedPrefs()
         .edit()
         .remove(KEY_POST_CALL_MESSAGE_SENT)
         .apply();
   }
 
   public static void onDisconnectPressed(Context context) {
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .putBoolean(KEY_POST_CALL_DISCONNECT_PRESSED, true)
         .apply();
   }
 
   public static void onCallDisconnected(Context context, String number, long callConnectedMillis) {
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .putLong(KEY_POST_CALL_CALL_CONNECT_TIME, callConnectedMillis)
         .putLong(KEY_POST_CALL_CALL_DISCONNECT_TIME, System.currentTimeMillis())
@@ -164,7 +169,8 @@
   }
 
   public static void onMessageSent(Context context, String number) {
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .putString(KEY_POST_CALL_CALL_NUMBER, number)
         .putBoolean(KEY_POST_CALL_MESSAGE_SENT, true)
@@ -177,7 +183,8 @@
    */
   public static void restartPerformanceRecordingIfARecentCallExist(Context context) {
     long disconnectTimeMillis =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+        StorageComponent.get(context)
+            .unencryptedSharedPrefs()
             .getLong(PostCall.KEY_POST_CALL_CALL_DISCONNECT_TIME, -1);
     if (disconnectTimeMillis != -1 && PerformanceReport.isRecording()) {
       PerformanceReport.startRecording();
@@ -187,7 +194,8 @@
   private static void clear(Context context) {
     activeSnackbar = null;
 
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .remove(KEY_POST_CALL_CALL_DISCONNECT_TIME)
         .remove(KEY_POST_CALL_CALL_NUMBER)
@@ -198,8 +206,7 @@
   }
 
   private static boolean shouldPromptUserToSendMessage(Context context) {
-    SharedPreferences manager =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context);
+    SharedPreferences manager = StorageComponent.get(context).unencryptedSharedPrefs();
     long disconnectTimeMillis = manager.getLong(KEY_POST_CALL_CALL_DISCONNECT_TIME, -1);
     long connectTimeMillis = manager.getLong(KEY_POST_CALL_CALL_CONNECT_TIME, -1);
 
@@ -220,13 +227,15 @@
   }
 
   private static boolean shouldPromptUserToViewSentMessage(Context context) {
-    return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    return StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .getBoolean(KEY_POST_CALL_MESSAGE_SENT, false);
   }
 
   @Nullable
   private static String getPhoneNumber(Context context) {
-    return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    return StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .getString(KEY_POST_CALL_CALL_NUMBER, null);
   }
 
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index c200b94..cd42a74 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -68,6 +68,7 @@
 import com.android.dialer.searchfragment.remote.RemoteContactsCursorLoader;
 import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader;
 import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader.Directory;
+import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.util.CallUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PermissionsUtil;
@@ -355,7 +356,8 @@
   // Should not be called before remote directories (not contacts) have finished loading.
   private void loadNearbyPlacesCursor() {
     if (!PermissionsUtil.hasLocationPermissions(getContext())
-        && !DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(getContext())
+        && !StorageComponent.get(getContext())
+            .unencryptedSharedPrefs()
             .getBoolean(KEY_LOCATION_PROMPT_DISMISSED, false)) {
       if (adapter != null && isRegularSearch() && !hasBeenDismissed()) {
         adapter.showLocationPermissionRequest(
diff --git a/java/com/android/dialer/storage/StorageComponent.java b/java/com/android/dialer/storage/StorageComponent.java
index 51afea7..067b994 100644
--- a/java/com/android/dialer/storage/StorageComponent.java
+++ b/java/com/android/dialer/storage/StorageComponent.java
@@ -25,7 +25,11 @@
 @Subcomponent
 public abstract class StorageComponent {
 
-  public abstract @DeviceProtected SharedPreferences deviceProtectedSharedPreferences();
+  /**
+   * Returns unencrypted default shared preferences. This method should not be used for private
+   * data.
+   */
+  public abstract SharedPreferences unencryptedSharedPrefs();
 
   public static StorageComponent get(Context context) {
     return ((StorageComponent.HasComponent)
diff --git a/java/com/android/dialer/storage/StorageModule.java b/java/com/android/dialer/storage/StorageModule.java
index 8c97980..3ee72c8 100644
--- a/java/com/android/dialer/storage/StorageModule.java
+++ b/java/com/android/dialer/storage/StorageModule.java
@@ -30,9 +30,7 @@
 
   @Provides
   @Singleton
-  @DeviceProtected
-  static SharedPreferences provideDeviceProtectedSharedPreferences(
-      @ApplicationContext Context appContext) {
+  static SharedPreferences provideUnencryptedSharedPrefs(@ApplicationContext Context appContext) {
     // #createDeviceProtectedStorageContext returns a new context each time, so we cache the shared
     // preferences object in order to avoid accessing disk for every operation.
     Context deviceProtectedContext = ContextCompat.createDeviceProtectedStorageContext(appContext);
diff --git a/java/com/android/dialer/strictmode/StrictModeUtils.java b/java/com/android/dialer/strictmode/StrictModeUtils.java
index 5ccd25d..c07138f 100644
--- a/java/com/android/dialer/strictmode/StrictModeUtils.java
+++ b/java/com/android/dialer/strictmode/StrictModeUtils.java
@@ -26,7 +26,7 @@
 import android.support.v4.os.UserManagerCompat;
 import com.android.dialer.buildtype.BuildType;
 import com.android.dialer.function.Supplier;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 
 /** Utilities for enforcing strict-mode in an app. */
 public final class StrictModeUtils {
@@ -115,7 +115,7 @@
     //   /data/user_de/0/com.android.dialer/shared_prefs/
 
     // <package_name>_preferences.xml
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(application);
+    StorageComponent.get(application).unencryptedSharedPrefs();
   }
 
   private StrictModeUtils() {}
diff --git a/java/com/android/dialer/util/DialerUtils.java b/java/com/android/dialer/util/DialerUtils.java
index f38c650..7f7b9da 100644
--- a/java/com/android/dialer/util/DialerUtils.java
+++ b/java/com/android/dialer/util/DialerUtils.java
@@ -21,14 +21,10 @@
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.graphics.Point;
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
 import android.telecom.TelecomManager;
 import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
@@ -36,9 +32,7 @@
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Toast;
-import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.telecom.TelecomUtil;
 import java.io.File;
 import java.util.Iterator;
@@ -223,20 +217,4 @@
     }
     return new File(parentDir, String.valueOf(fileId));
   }
-
-  /**
-   * Returns default preference for context accessing device protected storage. This is used when
-   * directBoot is enabled (before device unlocked after boot) since the default shared preference
-   * used normally is not available at this moment for N devices. Returns regular default shared
-   * preference for pre-N devices.
-   */
-  @NonNull
-  public static SharedPreferences getDefaultSharedPreferenceForDeviceProtectedStorageContext(
-      @NonNull Context context) {
-    Assert.isNotNull(context);
-    if (ContextCompat.isDeviceProtectedStorage(context)) {
-      return PreferenceManager.getDefaultSharedPreferences(context);
-    }
-    return StorageComponent.get(context.getApplicationContext()).deviceProtectedSharedPreferences();
-  }
 }
diff --git a/java/com/android/dialer/util/PermissionsUtil.java b/java/com/android/dialer/util/PermissionsUtil.java
index 02ea910..012b83f 100644
--- a/java/com/android/dialer/util/PermissionsUtil.java
+++ b/java/com/android/dialer/util/PermissionsUtil.java
@@ -40,6 +40,7 @@
 import android.support.v4.content.LocalBroadcastManager;
 import android.widget.Toast;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.storage.StorageComponent;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -221,7 +222,8 @@
    * @return true if we've already shown the camera privacy toast.
    */
   public static boolean hasCameraPrivacyToastShown(@NonNull Context context) {
-    return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    return StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .getBoolean(PREFERENCE_CAMERA_ALLOWED_BY_USER, false);
   }
 
@@ -232,7 +234,8 @@
   }
 
   public static void setCameraPrivacyToastShown(@NonNull Context context) {
-    DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
         .edit()
         .putBoolean(PREFERENCE_CAMERA_ALLOWED_BY_USER, true)
         .apply();
diff --git a/java/com/android/incallui/answer/impl/hint/AnswerHintFactory.java b/java/com/android/incallui/answer/impl/hint/AnswerHintFactory.java
index 94cf893..2ed4346 100644
--- a/java/com/android/incallui/answer/impl/hint/AnswerHintFactory.java
+++ b/java/com/android/incallui/answer/impl/hint/AnswerHintFactory.java
@@ -25,7 +25,7 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderBindings;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import com.android.incallui.util.AccessibilityUtil;
 
 /**
@@ -72,8 +72,7 @@
   }
 
   public static void increaseAnsweredCount(Context context) {
-    SharedPreferences sharedPreferences =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context);
+    SharedPreferences sharedPreferences = StorageComponent.get(context).unencryptedSharedPrefs();
     int answeredCount = sharedPreferences.getInt(ANSWERED_COUNT_PREFERENCE_KEY, 0);
     sharedPreferences.edit().putInt(ANSWERED_COUNT_PREFERENCE_KEY, answeredCount + 1).apply();
   }
@@ -92,7 +91,8 @@
     // If the user has gone through the process a few times we can assume they have learnt the
     // method.
     int answeredCount =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)
+        StorageComponent.get(context)
+            .unencryptedSharedPrefs()
             .getInt(ANSWERED_COUNT_PREFERENCE_KEY, 0);
     long threshold =
         ConfigProviderBindings.get(context).getLong(CONFIG_ANSWER_HINT_ANSWERED_THRESHOLD_KEY, 3);
diff --git a/java/com/android/incallui/answer/impl/hint/PawImageLoaderImpl.java b/java/com/android/incallui/answer/impl/hint/PawImageLoaderImpl.java
index 05358d8..31b1711 100644
--- a/java/com/android/incallui/answer/impl/hint/PawImageLoaderImpl.java
+++ b/java/com/android/incallui/answer/impl/hint/PawImageLoaderImpl.java
@@ -25,7 +25,7 @@
 import android.support.annotation.Nullable;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import com.android.incallui.answer.impl.hint.PawSecretCodeListener.PawType;
 
 /** Decrypt the event payload to be shown if in a specific time range and the key is received. */
@@ -37,8 +37,7 @@
   public Drawable loadPayload(@NonNull Context context) {
     Assert.isNotNull(context);
 
-    SharedPreferences preferences =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context);
+    SharedPreferences preferences = StorageComponent.get(context).unencryptedSharedPrefs();
     if (!preferences.getBoolean(PawSecretCodeListener.PAW_ENABLED_WITH_SECRET_CODE_KEY, false)) {
       return null;
     }
diff --git a/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java b/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java
index 871d80c..f6444e5 100644
--- a/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java
+++ b/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java
@@ -28,7 +28,7 @@
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression.Type;
 import com.android.dialer.logging.Logger;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import java.util.Random;
 
 /**
@@ -69,8 +69,7 @@
     if (!TextUtils.equals(secretCode, host)) {
       return;
     }
-    SharedPreferences preferences =
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context);
+    SharedPreferences preferences = StorageComponent.get(context).unencryptedSharedPrefs();
     boolean wasEnabled = preferences.getBoolean(PAW_ENABLED_WITH_SECRET_CODE_KEY, false);
     if (wasEnabled) {
       preferences.edit().putBoolean(PAW_ENABLED_WITH_SECRET_CODE_KEY, false).apply();
diff --git a/java/com/android/voicemail/impl/sync/VvmAccountManager.java b/java/com/android/voicemail/impl/sync/VvmAccountManager.java
index 2625fba..f458b2a 100644
--- a/java/com/android/voicemail/impl/sync/VvmAccountManager.java
+++ b/java/com/android/voicemail/impl/sync/VvmAccountManager.java
@@ -28,7 +28,7 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.PerAccountSharedPreferences;
 import com.android.dialer.common.concurrent.ThreadUtil;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.storage.StorageComponent;
 import com.android.voicemail.impl.OmtpConstants;
 import com.android.voicemail.impl.VisualVoicemailPreferences;
 import com.android.voicemail.impl.VoicemailStatus;
@@ -162,8 +162,6 @@
   private static PerAccountSharedPreferences getPreferenceForActivationState(
       Context context, PhoneAccountHandle phoneAccountHandle) {
     return new PerAccountSharedPreferences(
-        context,
-        phoneAccountHandle,
-        DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context));
+        context, phoneAccountHandle, StorageComponent.get(context).unencryptedSharedPrefs());
   }
 }
