Migrate LocaleNotification to main trunk
Bug: 248514263 Test: make RunSettingsRoboTests -j128 ROBOTEST_FILTER=AppLocalePickerActivityTest LocaleListEditorTest LocaleNotificationDataManagerTest NotificationCancelReceiverTest NotificationControllerTest Change-Id: Iac7ffd493485be8ebb10ae63e5ca4ea7a57c8c78
This commit is contained in:
@@ -18,13 +18,17 @@ package com.android.settings.localepicker;
|
||||
|
||||
import android.app.FragmentTransaction;
|
||||
import android.app.LocaleManager;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.LocaleList;
|
||||
import android.os.SystemClock;
|
||||
import android.os.SystemProperties;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
@@ -32,8 +36,7 @@ import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.android.internal.app.LocalePickerWithRegion;
|
||||
@@ -43,19 +46,23 @@ import com.android.settings.applications.AppLocaleUtil;
|
||||
import com.android.settings.applications.appinfo.AppLocaleDetails;
|
||||
import com.android.settings.core.SettingsBaseActivity;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class AppLocalePickerActivity extends SettingsBaseActivity
|
||||
implements LocalePickerWithRegion.LocaleSelectedListener, MenuItem.OnActionExpandListener {
|
||||
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 boolean ENABLED = false;
|
||||
static final String EXTRA_APP_LOCALE = "app_locale";
|
||||
private static final String PROP_SYSTEM_LOCALE_SUGGESTION = "android.system.locale.suggestion";
|
||||
private static final boolean ENABLED = false;
|
||||
static final String EXTRA_NOTIFICATION_ID = "notification_id";
|
||||
static final String PROP_SYSTEM_LOCALE_SUGGESTION = "android.system.locale.suggestion";
|
||||
|
||||
private String mPackageName;
|
||||
private LocalePickerWithRegion mLocalePickerWithRegion;
|
||||
private AppLocaleDetails mAppLocaleDetails;
|
||||
private View mAppLocaleDetailContainer;
|
||||
private NotificationController mNotificationController;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@@ -81,6 +88,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
|
||||
|
||||
setTitle(R.string.app_locale_picker_title);
|
||||
getActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
mNotificationController = NotificationController.getInstance(this);
|
||||
|
||||
mLocalePickerWithRegion = LocalePickerWithRegion.createLanguagePicker(
|
||||
this,
|
||||
@@ -146,52 +154,78 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
|
||||
if (!SystemProperties.getBoolean(PROP_SYSTEM_LOCALE_SUGGESTION, ENABLED)) {
|
||||
return;
|
||||
}
|
||||
String languageTag = localeInfo.getLocale().toLanguageTag();
|
||||
if (isInSystemLocale(languageTag) || localeInfo.isAppCurrentLocale()) {
|
||||
String localeTag = localeInfo.getLocale().toLanguageTag();
|
||||
if (LocaleUtils.isInSystemLocale(localeTag) || localeInfo.isAppCurrentLocale()) {
|
||||
return;
|
||||
}
|
||||
String intentAction = getString(R.string.config_app_locale_intent_action);
|
||||
if (!TextUtils.isEmpty(intentAction)) {
|
||||
try {
|
||||
PackageManager packageManager = getPackageManager();
|
||||
ApplicationInfo info = packageManager.getApplicationInfo(mPackageName,
|
||||
PackageManager.GET_META_DATA);
|
||||
Intent intent = new Intent(intentAction)
|
||||
.putExtra(Intent.EXTRA_UID, info.uid)
|
||||
.putExtra(EXTRA_APP_LOCALE, languageTag);
|
||||
if (intent.resolveActivity(packageManager) != null) {
|
||||
mStartForResult.launch(intent);
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.e(TAG, "Unable to find info for package: " + mPackageName);
|
||||
try {
|
||||
int uid = getPackageManager().getApplicationInfo(mPackageName,
|
||||
PackageManager.GET_META_DATA).uid;
|
||||
boolean launchNotification = mNotificationController.shouldTriggerNotification(
|
||||
uid, localeTag);
|
||||
if (launchNotification) {
|
||||
triggerNotification(
|
||||
mNotificationController.getNotificationId(localeTag),
|
||||
getString(R.string.title_system_locale_addition,
|
||||
localeInfo.getFullNameNative()),
|
||||
getString(R.string.desc_system_locale_addition),
|
||||
localeTag);
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.e(TAG, "Unable to find info for package: " + mPackageName);
|
||||
}
|
||||
}
|
||||
|
||||
// Invoke startActivityFroResult so that the calling package can be shared via the intent.
|
||||
private ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(),
|
||||
result -> {
|
||||
}
|
||||
);
|
||||
private void triggerNotification(
|
||||
int notificationId,
|
||||
String title,
|
||||
String description,
|
||||
String localeTag) {
|
||||
NotificationManager notificationManager = getSystemService(NotificationManager.class);
|
||||
final boolean channelExist =
|
||||
notificationManager.getNotificationChannel(CHANNEL_ID_SUGGESTION) != null;
|
||||
|
||||
/**
|
||||
* Checks if the localeTag is in the system locale. Since in the current design, the system
|
||||
* language list would not show two locales with the same language and region but different
|
||||
* numbering system. So, during the comparison, the extension has to be stripped.
|
||||
*
|
||||
* @param languageTag A language tag
|
||||
* @return true if the locale is in the system locale. Otherwise, false.
|
||||
*/
|
||||
private static boolean isInSystemLocale(String languageTag) {
|
||||
LocaleList systemLocales = LocaleList.getDefault();
|
||||
Locale locale = Locale.forLanguageTag(languageTag).stripExtensions();
|
||||
for (int i = 0; i < systemLocales.size(); i++) {
|
||||
if (locale.equals(systemLocales.get(i).stripExtensions())) {
|
||||
return true;
|
||||
}
|
||||
// Create an alert channel if it does not exist
|
||||
if (!channelExist) {
|
||||
NotificationChannel channel =
|
||||
new NotificationChannel(
|
||||
CHANNEL_ID_SUGGESTION,
|
||||
CHANNEL_ID_SUGGESTION_TO_USER,
|
||||
NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.setSound(/* sound */ null, /* audioAttributes */ null); // silent notification
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
return false;
|
||||
|
||||
final NotificationCompat.Builder builder =
|
||||
new NotificationCompat.Builder(this, CHANNEL_ID_SUGGESTION)
|
||||
.setSmallIcon(R.drawable.ic_settings_language)
|
||||
.setAutoCancel(true)
|
||||
.setContentTitle(title)
|
||||
.setContentText(description)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setContentIntent(
|
||||
createPendingIntent(localeTag, notificationId, false))
|
||||
.setDeleteIntent(
|
||||
createPendingIntent(localeTag, notificationId, true));
|
||||
notificationManager.notify(notificationId, builder.build());
|
||||
}
|
||||
|
||||
private PendingIntent createPendingIntent(String locale, int notificationId,
|
||||
boolean isDeleteIntent) {
|
||||
Intent intent = isDeleteIntent
|
||||
? new Intent(this, NotificationCancelReceiver.class)
|
||||
: new Intent(Settings.ACTION_LOCALE_SETTINGS)
|
||||
.putExtra(EXTRA_SYSTEM_LOCALE_DIALOG_TYPE, LOCALE_SUGGESTION)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
|
||||
intent.putExtra(EXTRA_APP_LOCALE, locale)
|
||||
.putExtra(EXTRA_NOTIFICATION_ID, notificationId);
|
||||
int flag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT;
|
||||
int elapsedTime = (int) SystemClock.elapsedRealtimeNanos();
|
||||
|
||||
return isDeleteIntent
|
||||
? PendingIntent.getBroadcast(this, elapsedTime, intent, flag)
|
||||
: PendingIntent.getActivity(this, elapsedTime, intent, flag);
|
||||
}
|
||||
|
||||
private View launchAppLocaleDetailsPage() {
|
||||
|
||||
Reference in New Issue
Block a user