diff --git a/java/com/android/dialer/app/DevicePolicyResources.java b/java/com/android/dialer/app/DevicePolicyResources.java
new file mode 100644
index 0000000..c783f0b
--- /dev/null
+++ b/java/com/android/dialer/app/DevicePolicyResources.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2022 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.
+ */
+
+package com.android.dialer.app;
+
+import android.app.admin.DevicePolicyManager;
+
+/**
+ * Class containing the required identifiers to update device management resources.
+ *
+ * <p>See {@link DevicePolicyManager#getDrawable} and {@link DevicePolicyManager#getString}.
+ */
+public class DevicePolicyResources {
+
+    private static final String PREFIX = "Dialer.";
+
+    /**
+     * The title of the in-call notification for an incoming work call.
+     */
+    public static final String NOTIFICATION_INCOMING_WORK_CALL_TITLE =
+            PREFIX + "NOTIFICATION_INCOMING_WORK_CALL_TITLE";
+
+    /**
+     * The title of the in-call notification for an ongoing work call.
+     */
+    public static final String NOTIFICATION_ONGOING_WORK_CALL_TITLE =
+            PREFIX + "NOTIFICATION_ONGOING_WORK_CALL_TITLE";
+
+    /**
+     * Missed call notification label, used when there's exactly one missed call from work
+     * contact.
+     */
+    public static final String NOTIFICATION_MISSED_WORK_CALL_TITLE =
+            PREFIX + "NOTIFICATION_MISSED_WORK_CALL_TITLE";
+
+    /**
+     * Label for notification indicating that call is being made over wifi.
+     */
+    public static final String NOTIFICATION_WIFI_WORK_CALL_LABEL =
+            PREFIX + "NOTIFICATION_WIFI_WORK_CALL_LABEL";
+}
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index ffa92d9..f2d2af8 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -15,7 +15,7 @@
  */
 package com.android.dialer.app.calllog;
 
-import static android.app.admin.DevicePolicyResources.Strings.Dialer.NOTIFICATION_MISSED_WORK_CALL_TITLE;
+import static com.android.dialer.app.DevicePolicyResources.NOTIFICATION_MISSED_WORK_CALL_TITLE;
 
 import android.app.Notification;
 import android.app.Notification.Builder;
@@ -172,7 +172,7 @@
           callLogNotificationsQueryHelper.getContactInfo(
               call.number, call.numberPresentation, call.countryIso);
       if (contactInfo.userType == ContactsUtils.USER_TYPE_WORK) {
-        titleText = context.getSystemService(DevicePolicyManager.class).getString(
+        titleText = context.getSystemService(DevicePolicyManager.class).getResources().getString(
                 NOTIFICATION_MISSED_WORK_CALL_TITLE,
                 () -> context.getString(R.string.notification_missedWorkCallTitle));
       } else {
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index c689fdb..3942851 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -16,11 +16,11 @@
 
 package com.android.incallui;
 
-import static android.app.admin.DevicePolicyResources.Strings.Dialer.NOTIFICATION_INCOMING_WORK_CALL_TITLE;
-import static android.app.admin.DevicePolicyResources.Strings.Dialer.NOTIFICATION_ONGOING_WORK_CALL_TITLE;
-import static android.app.admin.DevicePolicyResources.Strings.Dialer.NOTIFICATION_WIFI_WORK_CALL_LABEL;
 import static android.telecom.Call.Details.PROPERTY_HIGH_DEF_AUDIO;
 import static com.android.contacts.common.compat.CallCompat.Details.PROPERTY_ENTERPRISE_CALL;
+import static com.android.dialer.app.DevicePolicyResources.NOTIFICATION_INCOMING_WORK_CALL_TITLE;
+import static com.android.dialer.app.DevicePolicyResources.NOTIFICATION_ONGOING_WORK_CALL_TITLE;
+import static com.android.dialer.app.DevicePolicyResources.NOTIFICATION_WIFI_WORK_CALL_LABEL;
 import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST;
 import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_SPEAKEASY_CALL;
 import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_VIDEO_INCOMING_CALL;
@@ -737,7 +737,7 @@
   private String getOngoingCallNotificationMessage(boolean isWorkCall) {
     if (isWorkCall) {
       DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-      return dpm.getString(NOTIFICATION_ONGOING_WORK_CALL_TITLE, () ->
+      return dpm.getResources().getString(NOTIFICATION_ONGOING_WORK_CALL_TITLE, () ->
               context.getString(R.string.notification_ongoing_work_call));
     } else {
       return context.getString(R.string.notification_ongoing_call);
@@ -747,7 +747,7 @@
   private String getIncomingCallNotificationMessage(boolean isWorkCall) {
     if (isWorkCall) {
       DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-      return dpm.getString(NOTIFICATION_INCOMING_WORK_CALL_TITLE, () ->
+      return dpm.getResources().getString(NOTIFICATION_INCOMING_WORK_CALL_TITLE, () ->
               context.getString(R.string.notification_incoming_work_call));
     } else {
       return context.getString(R.string.notification_incoming_call);
@@ -757,7 +757,7 @@
   private String getWifiBrand(boolean isWorkCall) {
     if (isWorkCall) {
       DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-      return dpm.getString(NOTIFICATION_WIFI_WORK_CALL_LABEL, () ->
+      return dpm.getResources().getString(NOTIFICATION_WIFI_WORK_CALL_LABEL, () ->
               context.getString(R.string.notification_call_wifi_work_brand));
     } else {
       return context.getString(R.string.notification_call_wifi_brand);
