diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7c4aa48439c..31f4768913f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -947,6 +947,11 @@ + + + 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 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 8ebed718265..e51f9a3f742 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 @@ public class LocaleListEditorTest { 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 @@ public class LocaleListEditorTest { 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 class LocaleListEditorTest { 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 @@ public class LocaleListEditorTest { 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 @@ public class LocaleListEditorTest { } 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 00000000000..ea4fee8d0d8 --- /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 mActivityController; + @Mock + private NotificationController mNotificationController; + @Mock + private ActivityResultLauncher 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(); + } +}