Show persistent notification for page-agnostic mode

When device enters page-agnostic mode using 16KB developer
options, show notification to user using boot receiver and service.
On clicked on notification, show detailed instructions on how to
get back to production mode. Removing OEM carrier unlock allowed
condition.

Bug: 295035851
Bug: 338139755
Bug: 302600682
Test: m Settings && adb install -r $ANDROID_PRODUCT_OUT/system_ext/priv-app/Settings/Settings.apk
Change-Id: Ib7a57af4c6151d2a8da1ec94130532d10b1679aa
This commit is contained in:
Pawan Wagh
2024-05-03 20:20:56 +00:00
parent 14d4df602b
commit a697fba513
7 changed files with 384 additions and 67 deletions

View File

@@ -0,0 +1,119 @@
/*
* Copyright (C) 2024 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.development;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.settings.R;
public class PageAgnosticNotificationService extends Service {
private static final String NOTIFICATION_CHANNEL_ID =
"com.android.settings.development.PageAgnosticNotificationService";
private static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
@Nullable
@Override
public IBinder onBind(@NonNull Intent intent) {
return null;
}
// create a notification channel to post persistent notification
private void createNotificationChannel() {
NotificationChannel channel =
new NotificationChannel(
NOTIFICATION_CHANNEL_ID,
getString(R.string.page_agnostic_notification_channel_name),
NotificationManager.IMPORTANCE_HIGH);
mNotificationManager = getSystemService(NotificationManager.class);
if (mNotificationManager != null) {
mNotificationManager.createNotificationChannel(channel);
}
}
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}
private Notification buildNotification() {
// Get the title and text according to page size
boolean isIn16kbMode = Enable16kUtils.isUsing16kbPages();
String title =
isIn16kbMode
? getString(R.string.page_agnostic_16k_pages_title)
: getString(R.string.page_agnostic_4k_pages_title);
String text =
isIn16kbMode
? getString(R.string.page_agnostic_16k_pages_text_short)
: getString(R.string.page_agnostic_4k_pages_text_short);
Intent notifyIntent = new Intent(this, PageAgnosticWarningActivity.class);
// Set the Activity to start in a new, empty task.
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Create the PendingIntent.
PendingIntent notifyPendingIntent =
PendingIntent.getActivity(
this,
0,
notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Notification.Action action =
new Notification.Action.Builder(
R.drawable.empty_icon,
getString(R.string.page_agnostic_notification_action),
notifyPendingIntent)
.build();
Notification.Builder builder =
new Notification.Builder(this, NOTIFICATION_CHANNEL_ID)
.setContentTitle(title)
.setContentText(text)
.setOngoing(true)
.setSmallIcon(R.drawable.ic_settings_24dp)
.setStyle(new Notification.BigTextStyle().bigText(text))
.setContentIntent(notifyPendingIntent)
.addAction(action);
return builder.build();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Notification notification = buildNotification();
if (mNotificationManager != null) {
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
// When clicked on notification, show dialog with full text
return Service.START_NOT_STICKY;
}
}