Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c2440aa authored by Allen Su's avatar Allen Su Committed by Android (Google) Code Review
Browse files

Merge "Fix notificaiton not working in work profile" into main

parents 226a244a 7b31a7a6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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"
+1 −6
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.net.Uri;
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 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
    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 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
            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 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
            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)
+5 −14
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import static android.os.UserManager.DISALLOW_CONFIG_LOCALE;

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 @@ import java.util.Locale;
@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 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View
    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 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View
        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 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View
        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 @@ public class LocaleListEditor extends RestrictedSettingsFragment implements View
    }

    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);
+77 −0
Original line number Diff line number Diff line
/*
 * 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;
    }
}
+8 −9
Original line number Diff line number Diff line
@@ -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
Loading