Merge "feat(HCT): Notification 'open settings' action behavoir" into main

This commit is contained in:
Jean Chen
2024-12-27 01:36:09 -08:00
committed by Android (Google) Code Review
2 changed files with 58 additions and 16 deletions

View File

@@ -54,6 +54,9 @@ public class HighContrastTextMigrationReceiver extends BroadcastReceiver {
static final String ACTION_RESTORED =
"com.android.settings.accessibility.ACTION_HIGH_CONTRAST_TEXT_RESTORED";
@VisibleForTesting
static final String ACTION_OPEN_SETTINGS =
"com.android.settings.accessibility.ACTION_OPEN_HIGH_CONTRAST_TEXT_SETTINGS";
@VisibleForTesting
static final int NOTIFICATION_ID = 1;
@Retention(RetentionPolicy.SOURCE)
@@ -74,7 +77,16 @@ public class HighContrastTextMigrationReceiver extends BroadcastReceiver {
return;
}
if (ACTION_RESTORED.equals(intent.getAction())) {
if (ACTION_OPEN_SETTINGS.equals(intent.getAction())) {
// Close notification drawer before opening the HCT setting.
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
Intent settingsIntent = createHighContrastTextSettingsIntent(context);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(settingsIntent);
context.getSystemService(NotificationManager.class).cancel(NOTIFICATION_ID);
} else if (ACTION_RESTORED.equals(intent.getAction())) {
Log.i(TAG, "HCT attempted to be restored from backup; showing notification for userId: "
+ context.getUserId());
Settings.Secure.putInt(context.getContentResolver(),
@@ -125,21 +137,20 @@ public class HighContrastTextMigrationReceiver extends BroadcastReceiver {
R.string.accessibility_notification_high_contrast_text_content))
.setFlag(Notification.FLAG_NO_CLEAR, true);
Intent settingsIntent = new Intent(Settings.ACTION_TEXT_READING_SETTINGS);
settingsIntent.setPackage(context.getPackageName());
Intent settingsIntent = createHighContrastTextSettingsIntent(context);
if (settingsIntent.resolveActivity(context.getPackageManager()) != null) {
Bundle fragmentArgs = new Bundle();
fragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY,
TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
settingsIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs);
PendingIntent settingsPendingIntent = PendingIntent.getActivity(context,
/* requestCode = */ 0, settingsIntent, PendingIntent.FLAG_IMMUTABLE);
Intent actionIntent = new Intent(context, HighContrastTextMigrationReceiver.class);
actionIntent.setAction(ACTION_OPEN_SETTINGS);
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0,
actionIntent, PendingIntent.FLAG_IMMUTABLE);
Notification.Action settingsAction = new Notification.Action.Builder(
/* icon= */ null,
context.getString(
R.string.accessibility_notification_high_contrast_text_action),
settingsPendingIntent
actionPendingIntent
).build();
notificationBuilder
@@ -156,4 +167,14 @@ public class HighContrastTextMigrationReceiver extends BroadcastReceiver {
notificationManager.createNotificationChannel(notificationChannel);
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
private Intent createHighContrastTextSettingsIntent(Context context) {
Intent settingsIntent = new Intent(Settings.ACTION_TEXT_READING_SETTINGS);
settingsIntent.setPackage(context.getPackageName());
Bundle fragmentArgs = new Bundle();
fragmentArgs.putString(EXTRA_FRAGMENT_ARG_KEY,
TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
settingsIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs);
return settingsIntent;
}
}

View File

@@ -20,6 +20,7 @@ import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENT
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.ACTION_RESTORED;
import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.ACTION_OPEN_SETTINGS;
import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.NOTIFICATION_CHANNEL;
import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.NOTIFICATION_ID;
import static com.android.settings.accessibility.HighContrastTextMigrationReceiver.PromptState.PROMPT_SHOWN;
@@ -28,9 +29,9 @@ import static com.android.settings.accessibility.HighContrastTextMigrationReceiv
import static com.google.common.truth.Truth.assertThat;
import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -54,10 +55,13 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.shadows.ShadowNotification;
import org.robolectric.shadows.ShadowNotificationManager;
import org.robolectric.shadows.ShadowPackageManager;
import java.util.List;
/** Tests for {@link HighContrastTextMigrationReceiver}. */
@RunWith(RobolectricTestRunner.class)
public class HighContrastTextMigrationReceiverTest {
@@ -66,6 +70,7 @@ public class HighContrastTextMigrationReceiverTest {
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
private HighContrastTextMigrationReceiver mReceiver;
private ShadowApplication mShadowApplication;
private ShadowNotificationManager mShadowNotificationManager;
@Before
@@ -73,6 +78,7 @@ public class HighContrastTextMigrationReceiverTest {
NotificationManager notificationManager =
mContext.getSystemService(NotificationManager.class);
mShadowNotificationManager = Shadows.shadowOf(notificationManager);
mShadowApplication = Shadows.shadowOf((Application) mContext);
// Setup Settings app as a system app
ShadowPackageManager shadowPm = Shadows.shadowOf(mContext.getPackageManager());
@@ -187,6 +193,28 @@ public class HighContrastTextMigrationReceiverTest {
verifyNotificationNotSent();
}
@Test
@EnableFlags(Flags.FLAG_HIGH_CONTRAST_TEXT_SMALL_TEXT_RECT)
public void onReceive_openSettingsIntent_openHighContrastTextPreference() {
Intent intent = new Intent(ACTION_OPEN_SETTINGS);
mReceiver.onReceive(mContext, intent);
List<Intent> broadcastIntents = mShadowApplication.getBroadcastIntents();
assertThat(broadcastIntents.size()).isEqualTo(1);
assertThat(broadcastIntents.get(0).getAction())
.isEqualTo(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
Intent startedActivitie = mShadowApplication.getNextStartedActivity();
assertThat(startedActivitie).isNotNull();
Bundle fragmentArgs = startedActivitie.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
assertThat(fragmentArgs).isNotNull();
assertThat(fragmentArgs.getString(EXTRA_FRAGMENT_ARG_KEY))
.isEqualTo(TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
Notification notification = mShadowNotificationManager.getNotification(NOTIFICATION_ID);
assertThat(notification).isNull();
}
private void verifyNotificationNotSent() {
Notification notification = mShadowNotificationManager.getNotification(NOTIFICATION_ID);
assertThat(notification).isNull();
@@ -210,13 +238,6 @@ public class HighContrastTextMigrationReceiverTest {
assertThat(notification.actions.length).isEqualTo(1);
assertThat(notification.actions[0].title.toString()).isEqualTo(
mContext.getString(R.string.accessibility_notification_high_contrast_text_action));
PendingIntent pendingIntent = notification.actions[0].actionIntent;
Intent settingsIntent = Shadows.shadowOf(pendingIntent).getSavedIntent();
Bundle fragmentArgs = settingsIntent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
assertThat(fragmentArgs).isNotNull();
assertThat(fragmentArgs.getString(EXTRA_FRAGMENT_ARG_KEY))
.isEqualTo(TextReadingPreferenceFragment.HIGH_TEXT_CONTRAST_KEY);
}
private void assertPromptStateAndHctState(