diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 998ecc5..13aba41 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -947,6 +947,11 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".localepicker.NotificationActionActivity"
+            android:excludeFromRecents="true"
+            android:theme="@android:style/Theme.NoDisplay">
+        </activity>
+
         <activity
             android:name=".Settings$LanguageAndInputSettingsActivity"
             android:label="@string/language_settings"
diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
index c66d65c..194a08f 100644
--- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java
+++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
@@ -29,7 +29,6 @@
 import android.os.Bundle;
 import android.os.LocaleList;
 import android.os.SystemClock;
-import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MenuItem;
@@ -52,8 +51,6 @@
     private static final String TAG = AppLocalePickerActivity.class.getSimpleName();
     private static final String CHANNEL_ID_SUGGESTION = "suggestion";
     private static final String CHANNEL_ID_SUGGESTION_TO_USER = "Locale suggestion";
-    private static final String EXTRA_SYSTEM_LOCALE_DIALOG_TYPE = "system_locale_dialog_type";
-    private static final String LOCALE_SUGGESTION = "locale_suggestion";
     static final String EXTRA_APP_LOCALE = "app_locale";
     static final String EXTRA_NOTIFICATION_ID = "notification_id";
 
@@ -194,7 +191,6 @@
             channel.setSound(/* sound */ null, /* audioAttributes */ null); // silent notification
             notificationManager.createNotificationChannel(channel);
         }
-
         final NotificationCompat.Builder builder =
                 new NotificationCompat.Builder(this, CHANNEL_ID_SUGGESTION)
                         .setSmallIcon(R.drawable.ic_settings_language)
@@ -213,8 +209,7 @@
             boolean isDeleteIntent) {
         Intent intent = isDeleteIntent
                 ? new Intent(this, NotificationCancelReceiver.class)
-                : new Intent(Settings.ACTION_LOCALE_SETTINGS)
-                        .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION)
+                : new Intent(this, NotificationActionActivity.class)
                         .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
 
         intent.putExtra(EXTRA_APP_LOCALE, locale)
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index 907b88a..328d47d 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -20,7 +20,6 @@
 
 import static com.android.settings.flags.Flags.localeNotificationEnabled;
 import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_APP_LOCALE;
-import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_NOTIFICATION_ID;
 import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_ADD_SYSTEM_LOCALE;
 import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_CONFIRM_SYSTEM_DEFAULT;
 
@@ -71,6 +70,8 @@
 @SearchIndexable
 public class LocaleListEditor extends RestrictedSettingsFragment implements View.OnTouchListener {
     protected static final String INTENT_LOCALE_KEY = "localeInfo";
+    protected static final String EXTRA_SYSTEM_LOCALE_DIALOG_TYPE = "system_locale_dialog_type";
+    protected static final String LOCALE_SUGGESTION = "locale_suggestion";
 
     private static final String TAG = LocaleListEditor.class.getSimpleName();
     private static final String CFGKEY_REMOVE_MODE = "localeRemoveMode";
@@ -81,11 +82,8 @@
     private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default";
     private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale";
     private static final String TAG_DIALOG_ADD_SYSTEM_LOCALE = "dialog_add_system_locale";
-    private static final String EXTRA_SYSTEM_LOCALE_DIALOG_TYPE = "system_locale_dialog_type";
-    private static final String LOCALE_SUGGESTION = "locale_suggestion";
     private static final int MENU_ID_REMOVE = Menu.FIRST + 1;
     private static final int REQUEST_LOCALE_PICKER = 0;
-    private static final int INVALID_NOTIFICATION_ID = -1;
 
     private LocaleDragAndDropAdapter mAdapter;
     private Menu mMenu;
@@ -282,9 +280,9 @@
         Intent intent = this.getIntent();
         String dialogType = intent.getStringExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE);
         String localeTag = intent.getStringExtra(EXTRA_APP_LOCALE);
-        int notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, INVALID_NOTIFICATION_ID);
+        String callingPackage = getActivity().getCallingPackage();
         if (!localeNotificationEnabled()
-                || !isValidNotificationId(localeTag, notificationId)
+                || !getContext().getPackageName().equals(callingPackage)
                 || !isValidDialogType(dialogType)
                 || !isValidLocale(localeTag)
                 || LocaleUtils.isInSystemLocale(localeTag)) {
@@ -293,13 +291,6 @@
         return true;
     }
 
-    private boolean isValidNotificationId(String localeTag, long id) {
-        if (id == -1) {
-            return false;
-        }
-        return id == getNotificationController().getNotificationId(localeTag);
-    }
-
     @VisibleForTesting
     NotificationController getNotificationController() {
         return NotificationController.getInstance(getContext());
@@ -328,7 +319,7 @@
     }
 
     private void showDialogForAddedLocale() {
-        Log.d(TAG, "Show confirmation dialog");
+        Log.d(TAG, "show confirmation dialog");
         Intent intent = this.getIntent();
         String dialogType = intent.getStringExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE);
         String appLocaleTag = intent.getStringExtra(EXTRA_APP_LOCALE);
diff --git a/src/com/android/settings/localepicker/NotificationActionActivity.java b/src/com/android/settings/localepicker/NotificationActionActivity.java
new file mode 100644
index 0000000..2f95f93
--- /dev/null
+++ b/src/com/android/settings/localepicker/NotificationActionActivity.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2023 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.settings.localepicker;
+
+import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_APP_LOCALE;
+import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_NOTIFICATION_ID;
+import static com.android.settings.localepicker.LocaleListEditor.EXTRA_SYSTEM_LOCALE_DIALOG_TYPE;
+import static com.android.settings.localepicker.LocaleListEditor.LOCALE_SUGGESTION;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * An Activity that launches the system locale settings page.
+ */
+public class NotificationActionActivity extends AppCompatActivity {
+    private static final String TAG = "NotificationActionActivity";
+    private static final int INVALID_NOTIFICATION_ID = -1;
+    private final ActivityResultLauncher<Intent> mStartForResult =
+            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+                    result -> {
+                    });
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+        int notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, INVALID_NOTIFICATION_ID);
+        String appLocale = intent.getStringExtra(EXTRA_APP_LOCALE);
+        if (TextUtils.isEmpty(appLocale) || notificationId == INVALID_NOTIFICATION_ID) {
+            finish();
+            return;
+        }
+        int savedNotificationID = getNotificationController(this).getNotificationId(appLocale);
+        if (savedNotificationID == notificationId) {
+            Intent actionIntent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
+            actionIntent.putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION);
+            actionIntent.putExtra(EXTRA_APP_LOCALE, appLocale);
+            actionIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            getLauncher().launch(actionIntent);
+            finish();
+            return;
+        }
+    }
+
+    @VisibleForTesting
+    protected NotificationController getNotificationController(Context context) {
+        return NotificationController.getInstance(context);
+    }
+
+    @VisibleForTesting
+    protected ActivityResultLauncher<Intent> getLauncher() {
+        return mStartForResult;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
index 8ebed71..e51f9a3 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
@@ -17,8 +17,9 @@
 package com.android.settings.localepicker;
 
 import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_APP_LOCALE;
-import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_NOTIFICATION_ID;
 import static com.android.settings.localepicker.LocaleDialogFragment.DIALOG_ADD_SYSTEM_LOCALE;
+import static com.android.settings.localepicker.LocaleListEditor.EXTRA_SYSTEM_LOCALE_DIALOG_TYPE;
+import static com.android.settings.localepicker.LocaleListEditor.LOCALE_SUGGESTION;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -96,7 +97,6 @@
     private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default";
     private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale";
     private static final String TAG_DIALOG_ADD_SYSTEM_LOCALE = "dialog_add_system_locale";
-    private static final String EXTRA_SYSTEM_LOCALE_DIALOG_TYPE = "system_locale_dialog_type";
     private static final int DIALOG_CONFIRM_SYSTEM_DEFAULT = 1;
     private static final int REQUEST_CONFIRM_SYSTEM_DEFAULT = 1;
 
@@ -151,7 +151,7 @@
         mContext = spy(RuntimeEnvironment.application);
         mLocaleListEditor = spy(new LocaleListEditor());
         when(mLocaleListEditor.getContext()).thenReturn(mContext);
-        mActivity = Robolectric.buildActivity(FragmentActivity.class).get();
+        mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
         when(mLocaleListEditor.getActivity()).thenReturn(mActivity);
         when(mLocaleListEditor.getNotificationController()).thenReturn(
                 mNotificationController);
@@ -402,7 +402,7 @@
     public void showDiallogForAddedLocale_invalidLocale_noDialog() {
         Intent intent = new Intent("ACTION")
                 .putExtra(EXTRA_APP_LOCALE, "ab-CD") // invalid locale
-                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, "locale_suggestion");
+                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION);
         mActivity.setIntent(intent);
 
         mLocaleListEditor.onViewStateRestored(null);
@@ -431,7 +431,7 @@
         LocaleList.setDefault(LocaleList.forLanguageTags("en-US,ar-AE-u-nu-arab"));
         Intent intent = new Intent("ACTION")
                 .putExtra(EXTRA_APP_LOCALE, "ar-AE")
-                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, "locale_suggestion");
+                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION);
         mActivity.setIntent(intent);
 
         mLocaleListEditor.onViewStateRestored(null);
@@ -441,18 +441,17 @@
     }
 
     private void initIntentAndResourceForLocaleDialog() {
-        int notificationId = 1000;
         Intent intent = new Intent("ACTION")
                 .putExtra(EXTRA_APP_LOCALE, "ja-JP")
-                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, "locale_suggestion")
-                .putExtra(EXTRA_NOTIFICATION_ID, notificationId);
+                .putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION);
 
         mActivity.setIntent(intent);
         String[] supportedLocales = new String[]{"en-US", "ja-JP"};
         View contentView = LayoutInflater.from(mActivity).inflate(R.layout.locale_dialog, null);
         doReturn(contentView).when(mLocaleListEditor).getLocaleDialogView();
-        when(mNotificationController.getNotificationId("ja-JP")).thenReturn(notificationId);
         when(mLocaleListEditor.getSupportedLocales()).thenReturn(supportedLocales);
+        when(mContext.getPackageName()).thenReturn("com.android.settings");
+        when(mActivity.getCallingPackage()).thenReturn("com.android.settings");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/localepicker/NotificationActionActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/NotificationActionActivityTest.java
new file mode 100644
index 0000000..ea4fee8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/localepicker/NotificationActionActivityTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2023 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.settings.localepicker;
+
+import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_APP_LOCALE;
+import static com.android.settings.localepicker.AppLocalePickerActivity.EXTRA_NOTIFICATION_ID;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Intent;
+
+import androidx.activity.result.ActivityResultLauncher;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
+
+@RunWith(RobolectricTestRunner.class)
+public class NotificationActionActivityTest {
+    private NotificationActionActivity mNotificationActivity;
+    private ActivityController<NotificationActionActivity> mActivityController;
+    @Mock
+    private NotificationController mNotificationController;
+    @Mock
+    private ActivityResultLauncher<Intent> mLauncher;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testOnCreate_launchSystemLanguageSettings() throws Exception {
+        String targetLocale = "ja-JP";
+        int notificationId = 123;
+        Intent intent = new Intent()
+                .putExtra(EXTRA_APP_LOCALE, targetLocale)
+                .putExtra(EXTRA_NOTIFICATION_ID, notificationId);
+
+        mActivityController = Robolectric.buildActivity(NotificationActionActivity.class, intent);
+        mNotificationActivity = spy(mActivityController.get());
+        doReturn(mNotificationController).when(mNotificationActivity).getNotificationController(
+                any());
+        doReturn(notificationId).when(mNotificationController).getNotificationId(eq(targetLocale));
+        doReturn(mLauncher).when(mNotificationActivity).getLauncher();
+
+        mNotificationActivity.onCreate(null);
+
+        verify(mLauncher).launch(any(Intent.class));
+        verify(mNotificationActivity).finish();
+    }
+}
