Merge "Do not set the divider pos during adjust ime and minimized interaction" into oc-dev
diff --git a/api/current.txt b/api/current.txt
index 6023aab..ac97b54 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -26513,7 +26513,6 @@
method public boolean isTdlsSupported();
method public boolean isWifiEnabled();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -26526,29 +26525,17 @@
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -33907,7 +33894,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
diff --git a/api/removed.txt b/api/removed.txt
index 9baafeb..49b72e15 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -72,7 +72,6 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 67b6e82..a2c2771 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -29038,7 +29038,6 @@
method public boolean isWifiEnabled();
method public boolean isWifiScannerSupported();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -29055,10 +29054,6 @@
method public boolean startScan(android.os.WorkSource);
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int CHANGE_REASON_ADDED = 0; // 0x0
@@ -29066,14 +29061,8 @@
field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
field public static final java.lang.String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
field public static final java.lang.String EXTRA_CHANGE_REASON = "changeReason";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
@@ -29081,10 +29070,8 @@
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_AP_STATE = "wifi_state";
field public static final java.lang.String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
field public static final java.lang.String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
@@ -36821,7 +36808,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
diff --git a/api/system-removed.txt b/api/system-removed.txt
index b1a29e7..48f62b1 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -70,7 +70,6 @@
public class DevicePolicyManager {
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index d3cb4c9..1cad48e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -26622,7 +26622,6 @@
method public boolean isTdlsSupported();
method public boolean isWifiEnabled();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -26635,29 +26634,17 @@
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -34044,7 +34031,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
@@ -45743,6 +45729,7 @@
method public boolean isAttachedToWindow();
method public boolean isClickable();
method public boolean isContextClickable();
+ method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public boolean isDirty();
method public boolean isDrawingCacheEnabled();
method public boolean isDuplicateParentStateEnabled();
diff --git a/api/test-removed.txt b/api/test-removed.txt
index 9baafeb..49b72e15 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -72,7 +72,6 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index dca7ea6..3689d5e 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -16,12 +16,16 @@
#define LOG_TAG "BootAnimation"
+#include <stdint.h>
+#include <inttypes.h>
+
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <sys/resource.h>
#include <utils/Log.h>
+#include <utils/SystemClock.h>
#include <utils/threads.h>
#include "BootAnimation.h"
@@ -47,6 +51,26 @@
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
+ // TODO: replace this with better waiting logic in future, b/35253872
+ int64_t waitStartTime = elapsedRealtime();
+ sp<IServiceManager> sm = defaultServiceManager();
+ const String16 name("SurfaceFlinger");
+ const int SERVICE_WAIT_SLEEP_MS = 100;
+ const int LOG_PER_RETRIES = 10;
+ int retry = 0;
+ while (sm->checkService(name) == nullptr) {
+ retry++;
+ if ((retry % LOG_PER_RETRIES) == 0) {
+ ALOGW("Waiting for SurfaceFlinger, waited for %" PRId64 " ms",
+ elapsedRealtime() - waitStartTime);
+ }
+ usleep(SERVICE_WAIT_SLEEP_MS * 1000);
+ };
+ int64_t totalWaited = elapsedRealtime() - waitStartTime;
+ if (totalWaited > SERVICE_WAIT_SLEEP_MS) {
+ ALOGI("Waiting for SurfaceFlinger took %" PRId64 " ms", totalWaited);
+ }
+
// create the boot animation object
sp<BootAnimation> boot = new BootAnimation();
diff --git a/cmds/idmap/create.cpp b/cmds/idmap/create.cpp
index c13d318..524db14 100644
--- a/cmds/idmap/create.cpp
+++ b/cmds/idmap/create.cpp
@@ -221,3 +221,9 @@
return create_and_write_idmap(target_apk_path, overlay_apk_path, fd, true) == 0 ?
EXIT_SUCCESS : EXIT_FAILURE;
}
+
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd)
+{
+ return !is_idmap_stale_fd(target_apk_path, overlay_apk_path, fd) ?
+ EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/cmds/idmap/idmap.cpp b/cmds/idmap/idmap.cpp
index 3a237ff..8f86ed8 100644
--- a/cmds/idmap/idmap.cpp
+++ b/cmds/idmap/idmap.cpp
@@ -16,6 +16,7 @@
idmap --scan target-package-name-to-look-for path-to-target-apk dir-to-hold-idmaps \\\
dir-to-scan [additional-dir-to-scan [additional-dir-to-scan [...]]]\n\
idmap --inspect idmap \n\
+ idmap --verify target overlay fd \n\
\n\
DESCRIPTION \n\
Idmap files play an integral part in the runtime resource overlay framework. An idmap \n\
@@ -57,6 +58,9 @@
--inspect: decode the binary format of 'idmap' (path) and display the contents in a \n\
debug-friendly format. \n\
\n\
+ --verify: verify if idmap corresponding to file descriptor 'fd' (integer) is made from \n\
+ target package 'target' (path to apk) and overlay package 'overlay'. \n\
+\n\
EXAMPLES \n\
Create an idmap file: \n\
\n\
@@ -167,6 +171,29 @@
return idmap_create_path(target_apk_path, overlay_apk_path, idmap_path);
}
+ int maybe_verify_fd(const char *target_apk_path, const char *overlay_apk_path,
+ const char *idmap_str)
+ {
+ char *endptr;
+ int idmap_fd = strtol(idmap_str, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr, "error: failed to parse file descriptor argument %s\n", idmap_str);
+ return -1;
+ }
+
+ if (!verify_file_readable(target_apk_path)) {
+ ALOGD("error: failed to read apk %s: %s\n", target_apk_path, strerror(errno));
+ return -1;
+ }
+
+ if (!verify_file_readable(overlay_apk_path)) {
+ ALOGD("error: failed to read apk %s: %s\n", overlay_apk_path, strerror(errno));
+ return -1;
+ }
+
+ return idmap_verify_fd(target_apk_path, overlay_apk_path, idmap_fd);
+ }
+
int maybe_scan(const char *target_package_name, const char *target_apk_path,
const char *idmap_dir, const android::Vector<const char *> *overlay_dirs)
{
@@ -235,6 +262,10 @@
return maybe_create_path(argv[2], argv[3], argv[4]);
}
+ if (argc == 5 && !strcmp(argv[1], "--verify")) {
+ return maybe_verify_fd(argv[2], argv[3], argv[4]);
+ }
+
if (argc >= 6 && !strcmp(argv[1], "--scan")) {
android::Vector<const char *> v;
for (int i = 5; i < argc; i++) {
diff --git a/cmds/idmap/idmap.h b/cmds/idmap/idmap.h
index 8d4210b..5962108 100644
--- a/cmds/idmap/idmap.h
+++ b/cmds/idmap/idmap.h
@@ -25,6 +25,8 @@
int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
+
// Regarding target_package_name: the idmap_scan implementation should
// be able to extract this from the manifest in target_apk_path,
// simplifying the external API.
diff --git a/compiled-classes-phone b/compiled-classes-phone
index 1a19b2c..cf4b28b 100644
--- a/compiled-classes-phone
+++ b/compiled-classes-phone
@@ -144,17 +144,19 @@
android.animation.TypeEvaluator
android.animation.ValueAnimator
android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$57$vZ1qb742P9hE4drBY-TrOZB_qKo
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.-$Lambda$71$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
-android.app.-$Lambda$76$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$2
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$3
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
+android.app.-$Lambda$vZ1qb742P9hE4drBY-TrOZB_qKo
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0$1
android.app.ActionBar
android.app.ActionBar$LayoutParams
-android.app.ActionBar$OnMenuVisibilityListener
-android.app.ActionBar$Tab
-android.app.ActionBar$TabListener
android.app.Activity
android.app.Activity$HostCallbacks
android.app.ActivityManager
@@ -163,6 +165,7 @@
android.app.ActivityManager$MemoryInfo
android.app.ActivityManager$MemoryInfo$1
android.app.ActivityManager$OnUidImportanceListener
+android.app.ActivityManager$ProcessErrorStateInfo
android.app.ActivityManager$RecentTaskInfo
android.app.ActivityManager$RecentTaskInfo$1
android.app.ActivityManager$RunningAppProcessInfo
@@ -185,12 +188,13 @@
android.app.ActivityManagerInternal
android.app.ActivityManagerInternal$SleepToken
android.app.ActivityOptions
+android.app.ActivityOptions$1
+android.app.ActivityOptions$1$1
android.app.ActivityOptions$OnAnimationFinishedListener
android.app.ActivityOptions$OnAnimationStartedListener
android.app.ActivityThread
android.app.ActivityThread$1
android.app.ActivityThread$2
-android.app.ActivityThread$3
android.app.ActivityThread$ActivityClientRecord
android.app.ActivityThread$ActivityConfigChangeData
android.app.ActivityThread$AppBindData
@@ -199,7 +203,6 @@
android.app.ActivityThread$ContextCleanupInfo
android.app.ActivityThread$CreateServiceData
android.app.ActivityThread$DropBoxReporter
-android.app.ActivityThread$DumpComponentInfo
android.app.ActivityThread$EventLoggingReporter
android.app.ActivityThread$GcIdler
android.app.ActivityThread$H
@@ -214,8 +217,12 @@
android.app.ActivityThread$ResultData
android.app.ActivityThread$ServiceArgsData
android.app.ActivityThread$StopInfo
+android.app.ActivityTransitionCoordinator
+android.app.ActivityTransitionCoordinator$ContinueTransitionListener
+android.app.ActivityTransitionCoordinator$FixedEpicenterCallback
+android.app.ActivityTransitionCoordinator$GhostViewListeners
+android.app.ActivityTransitionCoordinator$SharedElementOriginalState
android.app.ActivityTransitionState
-android.app.AlarmManager
android.app.AlarmManager$AlarmClockInfo
android.app.AlarmManager$ListenerWrapper
android.app.AlarmManager$OnAlarmListener
@@ -233,8 +240,10 @@
android.app.Application
android.app.Application$ActivityLifecycleCallbacks
android.app.ApplicationErrorReport
+android.app.ApplicationErrorReport$AnrInfo
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationErrorReport$ParcelableCrashInfo
+android.app.ApplicationErrorReport$ParcelableCrashInfo$1
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
android.app.ApplicationPackageManager$MoveCallbackDelegate
@@ -248,20 +257,28 @@
android.app.ContentProviderHolder$1
android.app.ContextImpl
android.app.ContextImpl$ApplicationContentResolver
-android.app.DatePickerDialog
android.app.DatePickerDialog$OnDateSetListener
+android.app.DexLoadReporter
android.app.Dialog
android.app.Dialog$ListenersHandler
android.app.DialogFragment
android.app.DownloadManager
android.app.DownloadManager$CursorTranslator
android.app.DownloadManager$Query
-android.app.DownloadManager$Request
+android.app.EnterTransitionCoordinator
+android.app.EnterTransitionCoordinator$1
+android.app.EnterTransitionCoordinator$2
+android.app.EnterTransitionCoordinator$3
+android.app.EnterTransitionCoordinator$4
+android.app.EnterTransitionCoordinator$5
+android.app.EnterTransitionCoordinator$6
+android.app.ExitTransitionCoordinator
+android.app.ExitTransitionCoordinator$10
+android.app.ExitTransitionCoordinator$3
+android.app.ExitTransitionCoordinator$9
android.app.Fragment
android.app.Fragment$1
android.app.Fragment$AnimationInfo
-android.app.Fragment$OnStartEnterTransitionListener
-android.app.Fragment$SavedState
android.app.FragmentContainer
android.app.FragmentController
android.app.FragmentHostCallback
@@ -271,20 +288,14 @@
android.app.FragmentManager$OnBackStackChangedListener
android.app.FragmentManagerImpl
android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$2
android.app.FragmentManagerImpl$AnimateOnHWLayerIfNeededListener
android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentManagerImpl$PopBackStackState
-android.app.FragmentManagerImpl$StartEnterTransitionListener
android.app.FragmentManagerState
android.app.FragmentManagerState$1
android.app.FragmentState
android.app.FragmentState$1
android.app.FragmentTransaction
android.app.FragmentTransition
-android.app.FragmentTransition$3
-android.app.FragmentTransition$4
-android.app.FragmentTransition$5
android.app.FragmentTransition$FragmentContainerTransition
android.app.IActivityContainer
android.app.IActivityContainer$Stub
@@ -295,8 +306,10 @@
android.app.IActivityManager$Stub$Proxy
android.app.IAlarmCompleteListener
android.app.IAlarmCompleteListener$Stub
+android.app.IAlarmCompleteListener$Stub$Proxy
android.app.IAlarmListener
android.app.IAlarmListener$Stub
+android.app.IAlarmListener$Stub$Proxy
android.app.IAlarmManager
android.app.IAlarmManager$Stub
android.app.IAlarmManager$Stub$Proxy
@@ -306,6 +319,9 @@
android.app.IApplicationThread
android.app.IApplicationThread$Stub
android.app.IApplicationThread$Stub$Proxy
+android.app.IInstantAppResolver
+android.app.IInstantAppResolver$Stub
+android.app.IInstantAppResolver$Stub$Proxy
android.app.IInstrumentationWatcher
android.app.IInstrumentationWatcher$Stub
android.app.INotificationManager
@@ -334,6 +350,7 @@
android.app.IUiModeManager$Stub$Proxy
android.app.IUidObserver
android.app.IUidObserver$Stub
+android.app.IUidObserver$Stub$Proxy
android.app.IUserSwitchObserver
android.app.IUserSwitchObserver$Stub
android.app.IUserSwitchObserver$Stub$Proxy
@@ -343,6 +360,10 @@
android.app.IWallpaperManagerCallback
android.app.IWallpaperManagerCallback$Stub
android.app.IWallpaperManagerCallback$Stub$Proxy
+android.app.InstantAppResolverService
+android.app.InstantAppResolverService$1
+android.app.InstantAppResolverService$InstantAppResolutionCallback
+android.app.InstantAppResolverService$ServiceHandler
android.app.Instrumentation
android.app.IntentReceiverLeaked
android.app.IntentService
@@ -354,7 +375,6 @@
android.app.ListFragment$1
android.app.ListFragment$2
android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
android.app.LoadedApk$ReceiverDispatcher
android.app.LoadedApk$ReceiverDispatcher$Args
android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -384,25 +404,29 @@
android.app.Notification$InboxStyle
android.app.Notification$MediaStyle
android.app.Notification$MessagingStyle
-android.app.Notification$MessagingStyle$Message
android.app.Notification$StandardTemplateParams
android.app.Notification$Style
+android.app.Notification$TvExtender
android.app.Notification$WearableExtender
android.app.NotificationChannel
android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
android.app.NotificationManager
android.app.NotificationManager$Policy
android.app.NotificationManager$Policy$1
android.app.OnActivityPausedListener
+android.app.PackageInstallObserver
+android.app.PackageInstallObserver$1
android.app.PendingIntent
android.app.PendingIntent$1
android.app.PendingIntent$CanceledException
android.app.PendingIntent$FinishedDispatcher
android.app.PendingIntent$OnFinished
android.app.PendingIntent$OnMarshaledListener
-android.app.PictureInPictureArgs
-android.app.PictureInPictureArgs$1
-android.app.Presentation
+android.app.PictureInPictureParams
+android.app.PictureInPictureParams$1
+android.app.PictureInPictureParams$Builder
android.app.ProfilerInfo
android.app.ProgressDialog
android.app.QueuedWork
@@ -410,24 +434,23 @@
android.app.ReceiverRestrictedContext
android.app.RemoteAction
android.app.RemoteAction$1
-android.app.RemoteAction$2
-android.app.RemoteAction$OnActionListener
android.app.RemoteInput
android.app.RemoteInput$1
-android.app.RemoteInput$Builder
android.app.ResourcesManager
android.app.ResourcesManager$1
android.app.ResourcesManager$ActivityResources
android.app.ResultInfo
android.app.ResultInfo$1
android.app.RetailDemoModeServiceInternal
-android.app.SearchManager
android.app.SearchableInfo
android.app.SearchableInfo$1
android.app.Service
android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
android.app.SharedElementCallback
android.app.SharedElementCallback$1
+android.app.SharedElementCallback$OnSharedElementsReadyListener
android.app.SharedPreferencesImpl
android.app.SharedPreferencesImpl$1
android.app.SharedPreferencesImpl$2
@@ -517,22 +540,27 @@
android.app.SystemServiceRegistry$78
android.app.SystemServiceRegistry$79
android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
android.app.SystemServiceRegistry$9
android.app.SystemServiceRegistry$CachedServiceFetcher
android.app.SystemServiceRegistry$ServiceFetcher
android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
android.app.SystemServiceRegistry$StaticServiceFetcher
-android.app.TaskStackBuilder
android.app.TaskStackListener
android.app.TimePickerDialog$OnTimeSetListener
android.app.UiModeManager
android.app.UserSwitchObserver
-android.app.VoiceInteractor$PickOptionRequest$Option
+android.app.Vr2dDisplayProperties
+android.app.VrManager
android.app.WaitResult
android.app.WallpaperInfo
-android.app.WallpaperInfo$1
android.app.WallpaperManager
android.app.WallpaperManager$Globals
+android.app.admin.DeviceAdminInfo
+android.app.admin.DeviceAdminInfo$1
+android.app.admin.DeviceAdminInfo$PolicyInfo
android.app.admin.DevicePolicyManager
android.app.admin.DevicePolicyManagerInternal
android.app.admin.DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener
@@ -549,9 +577,9 @@
android.app.admin.SystemUpdatePolicy
android.app.admin.SystemUpdatePolicy$1
android.app.assist.AssistContent
-android.app.assist.AssistContent$1
android.app.assist.AssistStructure
android.app.assist.AssistStructure$1
+android.app.assist.AssistStructure$AutofillOverlay
android.app.assist.AssistStructure$ParcelTransferReader
android.app.assist.AssistStructure$ParcelTransferWriter
android.app.assist.AssistStructure$SendChannel
@@ -577,13 +605,13 @@
android.app.backup.IBackupManager
android.app.backup.IBackupManager$Stub
android.app.backup.IBackupManager$Stub$Proxy
+android.app.backup.IBackupManagerMonitor
android.app.backup.IBackupObserver
android.app.backup.IFullBackupRestoreObserver
android.app.backup.IRestoreSession
android.app.backup.ISelectBackupTransportCallback
android.app.backup.RestoreDescription
android.app.backup.RestoreSet
-android.app.backup.SharedPreferencesBackupHelper
android.app.job.IJobCallback
android.app.job.IJobCallback$Stub
android.app.job.IJobCallback$Stub$Proxy
@@ -602,8 +630,11 @@
android.app.job.JobParameters$1
android.app.job.JobScheduler
android.app.job.JobService
-android.app.job.JobService$JobHandler
-android.app.job.JobService$JobInterface
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
+android.app.job.JobWorkItem
android.app.trust.IStrongAuthTracker
android.app.trust.IStrongAuthTracker$Stub
android.app.trust.IStrongAuthTracker$Stub$Proxy
@@ -617,9 +648,15 @@
android.app.trust.TrustManager$1
android.app.trust.TrustManager$2
android.app.trust.TrustManager$TrustListener
+android.app.usage.CacheQuotaHint
+android.app.usage.CacheQuotaHint$1
+android.app.usage.CacheQuotaHint$Builder
android.app.usage.ConfigurationStats
android.app.usage.ConfigurationStats$1
android.app.usage.ExternalStorageStats
+android.app.usage.ICacheQuotaService
+android.app.usage.ICacheQuotaService$Stub
+android.app.usage.ICacheQuotaService$Stub$Proxy
android.app.usage.IStorageStatsManager
android.app.usage.IStorageStatsManager$Stub
android.app.usage.IUsageStatsManager
@@ -642,26 +679,29 @@
android.appwidget.AppWidgetHost$UpdateHandler
android.appwidget.AppWidgetHostView
android.appwidget.AppWidgetHostView$1
+android.appwidget.AppWidgetHostView$ParcelableSparseArray
+android.appwidget.AppWidgetHostView$ParcelableSparseArray$1
android.appwidget.AppWidgetManager
android.appwidget.AppWidgetProvider
android.appwidget.AppWidgetProviderInfo
android.appwidget.AppWidgetProviderInfo$1
+android.appwidget.PendingHostUpdate
+android.appwidget.PendingHostUpdate$1
android.bluetooth.BluetoothA2dp
android.bluetooth.BluetoothA2dp$1
android.bluetooth.BluetoothA2dp$2
android.bluetooth.BluetoothActivityEnergyInfo
-android.bluetooth.BluetoothActivityEnergyInfo$1
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothAdapter$1
-android.bluetooth.BluetoothClass
-android.bluetooth.BluetoothClass$1
+android.bluetooth.BluetoothAdapter$BluetoothStateChangeCallback
android.bluetooth.BluetoothCodecConfig
android.bluetooth.BluetoothCodecConfig$1
android.bluetooth.BluetoothCodecStatus
-android.bluetooth.BluetoothCodecStatus$1
android.bluetooth.BluetoothDevice
android.bluetooth.BluetoothDevice$1
android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothGatt
+android.bluetooth.BluetoothGattCallback
android.bluetooth.BluetoothGattCharacteristic
android.bluetooth.BluetoothGattDescriptor
android.bluetooth.BluetoothGattService
@@ -742,25 +782,21 @@
android.bluetooth.IBluetoothStateChangeCallback$Stub
android.bluetooth.IBluetoothStateChangeCallback$Stub$Proxy
android.bluetooth.OobData
-android.bluetooth.SdpMasRecord
-android.bluetooth.SdpMnsRecord
-android.bluetooth.SdpOppOpsRecord
-android.bluetooth.SdpPseRecord
-android.bluetooth.SdpRecord
-android.bluetooth.SdpSapsRecord
android.bluetooth.UidTraffic
android.bluetooth.UidTraffic$1
android.bluetooth.le.AdvertiseData
-android.bluetooth.le.AdvertiseSettings
+android.bluetooth.le.AdvertisingSetParameters
+android.bluetooth.le.BluetoothLeAdvertiser
android.bluetooth.le.BluetoothLeScanner
android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper
android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1
-android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$2
android.bluetooth.le.BluetoothLeUtils
-android.bluetooth.le.IAdvertiserCallback
+android.bluetooth.le.IAdvertisingSetCallback
+android.bluetooth.le.IPeriodicAdvertisingCallback
android.bluetooth.le.IScannerCallback
android.bluetooth.le.IScannerCallback$Stub
android.bluetooth.le.IScannerCallback$Stub$Proxy
+android.bluetooth.le.PeriodicAdvertisingParameters
android.bluetooth.le.ScanCallback
android.bluetooth.le.ScanFilter
android.bluetooth.le.ScanFilter$1
@@ -771,6 +807,11 @@
android.bluetooth.le.ScanSettings
android.bluetooth.le.ScanSettings$1
android.bluetooth.le.ScanSettings$Builder
+android.companion.AssociationRequest
+android.companion.CompanionDeviceManager
+android.companion.ICompanionDeviceManager
+android.companion.ICompanionDeviceManager$Stub
+android.companion.IFindDeviceCallback
android.content.AbstractThreadedSyncAdapter
android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
android.content.AbstractThreadedSyncAdapter$SyncThread
@@ -812,14 +853,12 @@
android.content.ContentResolver
android.content.ContentResolver$1
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$OpenResourceIdResult
android.content.ContentResolver$ParcelFileDescriptorInner
android.content.ContentUris
android.content.ContentValues
android.content.ContentValues$1
android.content.Context
android.content.ContextWrapper
-android.content.CursorEntityIterator
android.content.CursorLoader
android.content.DialogInterface
android.content.DialogInterface$OnCancelListener
@@ -828,9 +867,6 @@
android.content.DialogInterface$OnKeyListener
android.content.DialogInterface$OnMultiChoiceClickListener
android.content.DialogInterface$OnShowListener
-android.content.Entity
-android.content.Entity$NamedContentValues
-android.content.EntityIterator
android.content.IClipboard
android.content.IClipboard$Stub
android.content.IClipboard$Stub$Proxy
@@ -846,7 +882,6 @@
android.content.IIntentSender$Stub$Proxy
android.content.IOnPrimaryClipChangedListener
android.content.IOnPrimaryClipChangedListener$Stub
-android.content.IOnPrimaryClipChangedListener$Stub$Proxy
android.content.IRestrictionsManager
android.content.IRestrictionsManager$Stub
android.content.IRestrictionsManager$Stub$Proxy
@@ -862,17 +897,19 @@
android.content.Intent
android.content.Intent$1
android.content.Intent$FilterComparison
+android.content.Intent$ShortcutIconResource
+android.content.Intent$ShortcutIconResource$1
android.content.IntentFilter
android.content.IntentFilter$1
android.content.IntentFilter$AuthorityEntry
android.content.IntentFilter$MalformedMimeTypeException
android.content.IntentSender
+android.content.IntentSender$1
android.content.IntentSender$SendIntentException
android.content.Loader
android.content.Loader$ForceLoadContentObserver
android.content.Loader$OnLoadCanceledListener
android.content.Loader$OnLoadCompleteListener
-android.content.MutableContextWrapper
android.content.OperationApplicationException
android.content.PeriodicSync
android.content.PeriodicSync$1
@@ -908,16 +945,21 @@
android.content.UndoOperation
android.content.UndoOwner
android.content.UriMatcher
-android.content.UriPermission
+android.content.om.IOverlayManager
+android.content.om.IOverlayManager$Stub
+android.content.om.OverlayInfo
android.content.pm.ActivityInfo
android.content.pm.ActivityInfo$1
android.content.pm.ActivityInfo$WindowLayout
android.content.pm.ApplicationInfo
android.content.pm.ApplicationInfo$1
+android.content.pm.AuxiliaryResolveInfo
+android.content.pm.BaseParceledListSlice
+android.content.pm.BaseParceledListSlice$1
+android.content.pm.ChangedPackages
android.content.pm.ComponentInfo
android.content.pm.ConfigurationInfo
android.content.pm.ConfigurationInfo$1
-android.content.pm.EphemeralResponse
android.content.pm.FallbackCategoryProvider
android.content.pm.FeatureGroupInfo
android.content.pm.FeatureGroupInfo$1
@@ -935,9 +977,13 @@
android.content.pm.IOtaDexopt
android.content.pm.IOtaDexopt$Stub
android.content.pm.IPackageDataObserver
+android.content.pm.IPackageDataObserver$Stub
+android.content.pm.IPackageDataObserver$Stub$Proxy
android.content.pm.IPackageDeleteObserver
android.content.pm.IPackageDeleteObserver2
+android.content.pm.IPackageInstallObserver
android.content.pm.IPackageInstallObserver2
+android.content.pm.IPackageInstallObserver2$Stub
android.content.pm.IPackageInstaller
android.content.pm.IPackageInstaller$Stub
android.content.pm.IPackageInstaller$Stub$Proxy
@@ -945,6 +991,8 @@
android.content.pm.IPackageInstallerCallback$Stub
android.content.pm.IPackageInstallerCallback$Stub$Proxy
android.content.pm.IPackageInstallerSession
+android.content.pm.IPackageInstallerSession$Stub
+android.content.pm.IPackageInstallerSession$Stub$Proxy
android.content.pm.IPackageManager
android.content.pm.IPackageManager$Stub
android.content.pm.IPackageManager$Stub$Proxy
@@ -953,16 +1001,17 @@
android.content.pm.IPackageMoveObserver$Stub$Proxy
android.content.pm.IPackageStatsObserver
android.content.pm.IPackageStatsObserver$Stub
-android.content.pm.IPackageStatsObserver$Stub$Proxy
android.content.pm.IShortcutService
android.content.pm.IShortcutService$Stub
android.content.pm.IShortcutService$Stub$Proxy
+android.content.pm.InstantAppRequest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest$1
android.content.pm.InstrumentationInfo
android.content.pm.InstrumentationInfo$1
android.content.pm.IntentFilterVerificationInfo
android.content.pm.IntentFilterVerificationInfo$1
android.content.pm.KeySet
-android.content.pm.LabeledIntent
android.content.pm.LauncherActivityInfo
android.content.pm.LauncherApps
android.content.pm.LauncherApps$1
@@ -974,12 +1023,15 @@
android.content.pm.PackageInfo
android.content.pm.PackageInfo$1
android.content.pm.PackageInfoLite
+android.content.pm.PackageInfoLite$1
android.content.pm.PackageInstaller
android.content.pm.PackageInstaller$Session
android.content.pm.PackageInstaller$SessionCallback
android.content.pm.PackageInstaller$SessionCallbackDelegate
android.content.pm.PackageInstaller$SessionInfo
+android.content.pm.PackageInstaller$SessionInfo$1
android.content.pm.PackageInstaller$SessionParams
+android.content.pm.PackageInstaller$SessionParams$1
android.content.pm.PackageItemInfo
android.content.pm.PackageManager
android.content.pm.PackageManager$MoveCallback
@@ -994,6 +1046,8 @@
android.content.pm.PackageParser$Activity$1
android.content.pm.PackageParser$ActivityIntentInfo
android.content.pm.PackageParser$ApkLite
+android.content.pm.PackageParser$Callback
+android.content.pm.PackageParser$CallbackImpl
android.content.pm.PackageParser$Component
android.content.pm.PackageParser$IntentInfo
android.content.pm.PackageParser$NewPermissionInfo
@@ -1016,11 +1070,9 @@
android.content.pm.PackageParser$SplitNameComparator
android.content.pm.PackageParser$SplitPermissionInfo
android.content.pm.PackageStats
-android.content.pm.PackageStats$1
android.content.pm.PackageUserState
android.content.pm.ParceledListSlice
android.content.pm.ParceledListSlice$1
-android.content.pm.ParceledListSlice$2
android.content.pm.PathPermission
android.content.pm.PathPermission$1
android.content.pm.PermissionGroupInfo
@@ -1038,6 +1090,7 @@
android.content.pm.RegisteredServicesCacheListener
android.content.pm.ResolveInfo
android.content.pm.ResolveInfo$1
+android.content.pm.SELinuxUtil
android.content.pm.ServiceInfo
android.content.pm.ServiceInfo$1
android.content.pm.SharedLibraryInfo
@@ -1050,6 +1103,8 @@
android.content.pm.ShortcutServiceInternal$ShortcutChangeListener
android.content.pm.Signature
android.content.pm.Signature$1
+android.content.pm.StringParceledListSlice
+android.content.pm.StringParceledListSlice$1
android.content.pm.UserInfo
android.content.pm.UserInfo$1
android.content.pm.VerifierDeviceIdentity
@@ -1057,15 +1112,9 @@
android.content.pm.VersionedPackage
android.content.pm.VersionedPackage$1
android.content.pm.XmlSerializerAndParser
-android.content.pm.permission.IRuntimePermissionPresenter
-android.content.pm.permission.IRuntimePermissionPresenter$Stub
-android.content.pm.permission.IRuntimePermissionPresenter$Stub$Proxy
-android.content.pm.permission.RuntimePermissionPresentationInfo
-android.content.pm.permission.RuntimePermissionPresentationInfo$1
-android.content.pm.permission.RuntimePermissionPresenter
-android.content.pm.permission.RuntimePermissionPresenter$OnResultCallback
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService$1
+android.content.pm.split.DefaultSplitAssetLoader
+android.content.pm.split.SplitAssetLoader
+android.content.pm.split.SplitDependencyLoader$IllegalDependencyException
android.content.res.AssetFileDescriptor
android.content.res.AssetFileDescriptor$1
android.content.res.AssetFileDescriptor$AutoCloseInputStream
@@ -1074,6 +1123,7 @@
android.content.res.ColorStateList
android.content.res.ColorStateList$1
android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
android.content.res.CompatibilityInfo
android.content.res.CompatibilityInfo$1
android.content.res.CompatibilityInfo$2
@@ -1139,9 +1189,9 @@
android.database.MergeCursor$1
android.database.Observable
android.database.SQLException
+android.database.StaleDataException
android.database.sqlite.DatabaseObjectNotClosedException
android.database.sqlite.SQLiteAbortException
-android.database.sqlite.SQLiteAccessPermException
android.database.sqlite.SQLiteCantOpenDatabaseException
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteConnection
@@ -1150,7 +1200,6 @@
android.database.sqlite.SQLiteConnection$PreparedStatement
android.database.sqlite.SQLiteConnection$PreparedStatementCache
android.database.sqlite.SQLiteConnectionPool
-android.database.sqlite.SQLiteConnectionPool$1
android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus
android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter
android.database.sqlite.SQLiteConstraintException
@@ -1193,17 +1242,17 @@
android.ddm.DdmHandleThread
android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
-android.drm.DrmErrorEvent
-android.drm.DrmEvent
-android.drm.DrmInfoEvent
-android.drm.DrmManagerClient
-android.drm.DrmManagerClient$EventHandler
-android.drm.DrmManagerClient$InfoHandler
android.drm.DrmManagerClient$OnErrorListener
android.drm.DrmManagerClient$OnEventListener
android.drm.DrmManagerClient$OnInfoListener
android.drm.DrmOutputStream
-android.drm.DrmSupportInfo
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
android.graphics.BaseCanvas
android.graphics.Bitmap
android.graphics.Bitmap$1
@@ -1224,6 +1273,14 @@
android.graphics.ColorFilter
android.graphics.ColorMatrix
android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Adaptation
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
android.graphics.ComposePathEffect
android.graphics.ComposeShader
android.graphics.CornerPathEffect
@@ -1297,13 +1354,15 @@
android.graphics.TableMaskFilter
android.graphics.TemporaryBuffer
android.graphics.Typeface
+android.graphics.Typeface$Builder
android.graphics.Xfermode
android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
+android.graphics.drawable.AdaptiveIconDrawable$ChildDrawable
+android.graphics.drawable.AdaptiveIconDrawable$LayerState
android.graphics.drawable.Animatable
android.graphics.drawable.Animatable2
-android.graphics.drawable.AnimatedRotateDrawable
-android.graphics.drawable.AnimatedRotateDrawable$1
-android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState
+android.graphics.drawable.Animatable2$AnimationCallback
android.graphics.drawable.AnimatedStateListDrawable
android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState
android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition
@@ -1312,6 +1371,7 @@
android.graphics.drawable.AnimatedStateListDrawable$Transition
android.graphics.drawable.AnimatedVectorDrawable
android.graphics.drawable.AnimatedVectorDrawable$1
+android.graphics.drawable.AnimatedVectorDrawable$2
android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState
android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator
android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimator
@@ -1342,11 +1402,10 @@
android.graphics.drawable.Icon$1
android.graphics.drawable.InsetDrawable
android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
android.graphics.drawable.LayerDrawable
android.graphics.drawable.LayerDrawable$ChildDrawable
android.graphics.drawable.LayerDrawable$LayerState
-android.graphics.drawable.LevelListDrawable
-android.graphics.drawable.LevelListDrawable$LevelListState
android.graphics.drawable.NinePatchDrawable
android.graphics.drawable.NinePatchDrawable$NinePatchState
android.graphics.drawable.PaintDrawable
@@ -1407,23 +1466,14 @@
android.graphics.drawable.shapes.RectShape
android.graphics.drawable.shapes.RoundRectShape
android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
android.graphics.pdf.PdfDocument
android.graphics.pdf.PdfEditor
android.graphics.pdf.PdfRenderer
android.hardware.Camera
-android.hardware.Camera$AutoFocusCallback
-android.hardware.Camera$AutoFocusMoveCallback
android.hardware.Camera$CameraInfo
android.hardware.Camera$ErrorCallback
-android.hardware.Camera$EventHandler
android.hardware.Camera$Face
-android.hardware.Camera$FaceDetectionListener
-android.hardware.Camera$OnZoomChangeListener
-android.hardware.Camera$Parameters
-android.hardware.Camera$PictureCallback
-android.hardware.Camera$PreviewCallback
-android.hardware.Camera$ShutterCallback
-android.hardware.Camera$Size
android.hardware.CameraStatus
android.hardware.CameraStatus$1
android.hardware.ConsumerIrManager
@@ -1443,6 +1493,7 @@
android.hardware.ISerialManager
android.hardware.ISerialManager$Stub
android.hardware.Sensor
+android.hardware.SensorAdditionalInfo
android.hardware.SensorEvent
android.hardware.SensorEventListener
android.hardware.SensorManager
@@ -1474,7 +1525,6 @@
android.hardware.camera2.CameraManager$CameraManagerGlobal$2
android.hardware.camera2.CameraManager$CameraManagerGlobal$3
android.hardware.camera2.CameraManager$CameraManagerGlobal$4
-android.hardware.camera2.CameraManager$CameraManagerGlobal$5
android.hardware.camera2.CameraManager$TorchCallback
android.hardware.camera2.CameraMetadata
android.hardware.camera2.CaptureFailure
@@ -1515,7 +1565,6 @@
android.hardware.camera2.impl.CameraDeviceImpl
android.hardware.camera2.impl.CameraDeviceImpl$1
android.hardware.camera2.impl.CameraDeviceImpl$10
-android.hardware.camera2.impl.CameraDeviceImpl$11
android.hardware.camera2.impl.CameraDeviceImpl$2
android.hardware.camera2.impl.CameraDeviceImpl$3
android.hardware.camera2.impl.CameraDeviceImpl$4
@@ -1527,7 +1576,6 @@
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$2
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$3
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$4
-android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$6
android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallback
android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallbackHolder
android.hardware.camera2.impl.CameraDeviceImpl$FrameNumberTracker
@@ -1762,18 +1810,44 @@
android.hardware.radio.V1_0.Call
android.hardware.radio.V1_0.CardStatus
android.hardware.radio.V1_0.CdmaSignalStrength
+android.hardware.radio.V1_0.CellIdentity
+android.hardware.radio.V1_0.CellIdentityCdma
+android.hardware.radio.V1_0.CellIdentityGsm
+android.hardware.radio.V1_0.CellIdentityLte
+android.hardware.radio.V1_0.CellIdentityTdscdma
+android.hardware.radio.V1_0.CellIdentityWcdma
+android.hardware.radio.V1_0.CellInfo
+android.hardware.radio.V1_0.CellInfoCdma
+android.hardware.radio.V1_0.CellInfoGsm
+android.hardware.radio.V1_0.CellInfoLte
+android.hardware.radio.V1_0.CellInfoTdscdma
+android.hardware.radio.V1_0.CellInfoType
+android.hardware.radio.V1_0.CellInfoWcdma
+android.hardware.radio.V1_0.DataRegStateResult
android.hardware.radio.V1_0.EvdoSignalStrength
android.hardware.radio.V1_0.GsmSignalStrength
+android.hardware.radio.V1_0.HardwareConfig
android.hardware.radio.V1_0.IRadio
android.hardware.radio.V1_0.IRadio$Proxy
android.hardware.radio.V1_0.IRadioIndication
android.hardware.radio.V1_0.IRadioIndication$Stub
android.hardware.radio.V1_0.IRadioResponse
android.hardware.radio.V1_0.IRadioResponse$Stub
+android.hardware.radio.V1_0.LceStatusInfo
android.hardware.radio.V1_0.LteSignalStrength
+android.hardware.radio.V1_0.RadioCapability
android.hardware.radio.V1_0.RadioResponseInfo
+android.hardware.radio.V1_0.RegState
android.hardware.radio.V1_0.SignalStrength
android.hardware.radio.V1_0.TdScdmaSignalStrength
+android.hardware.radio.V1_0.VoiceRegStateResult
+android.hardware.radio.V1_0.WcdmaSignalStrength
+android.hardware.radio.deprecated.V1_0.IOemHook
+android.hardware.radio.deprecated.V1_0.IOemHook$Proxy
+android.hardware.radio.deprecated.V1_0.IOemHookIndication
+android.hardware.radio.deprecated.V1_0.IOemHookIndication$Stub
+android.hardware.radio.deprecated.V1_0.IOemHookResponse
+android.hardware.radio.deprecated.V1_0.IOemHookResponse$Stub
android.hardware.soundtrigger.IRecognitionStatusCallback
android.hardware.soundtrigger.IRecognitionStatusCallback$Stub
android.hardware.soundtrigger.KeyphraseEnrollmentInfo
@@ -1815,22 +1889,23 @@
android.hardware.usb.UsbPortStatus
android.hardware.usb.UsbPortStatus$1
android.hardware.usb.UsbRequest
+android.hidl.base.V1_0.DebugInfo
android.hidl.base.V1_0.IBase
+android.hidl.manager.V1_0.IServiceManager
+android.hidl.manager.V1_0.IServiceManager$Proxy
+android.hidl.manager.V1_0.IServiceNotification
+android.hidl.manager.V1_0.IServiceNotification$Stub
android.icu.impl.BMPSet
android.icu.impl.CacheBase
android.icu.impl.CacheValue
android.icu.impl.CacheValue$NullValue
android.icu.impl.CacheValue$SoftValue
android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarAstronomer
-android.icu.impl.CalendarAstronomer$2
-android.icu.impl.CalendarAstronomer$CoordFunc
-android.icu.impl.CalendarAstronomer$Equatorial
-android.icu.impl.CalendarAstronomer$MoonAge
-android.icu.impl.CalendarAstronomer$SolarLongitude
android.icu.impl.CalendarUtil
android.icu.impl.CalendarUtil$CalendarPreferences
-android.icu.impl.CaseMap$StringContextIterator
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$GreekUpper
+android.icu.impl.CaseMapImpl$StringContextIterator
android.icu.impl.CharTrie
android.icu.impl.CharacterIteration
android.icu.impl.ClassLoaderUtil
@@ -1909,7 +1984,6 @@
android.icu.impl.JavaTimeZone
android.icu.impl.LocaleDisplayNamesImpl
android.icu.impl.LocaleDisplayNamesImpl$Cache
-android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextSink
android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextUsage
android.icu.impl.LocaleDisplayNamesImpl$DataTable
android.icu.impl.LocaleDisplayNamesImpl$DataTables
@@ -2056,6 +2130,8 @@
android.icu.text.BreakIteratorFactory
android.icu.text.BreakIteratorFactory$BFService
android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
android.icu.text.CollationKey
android.icu.text.Collator
android.icu.text.Collator$ServiceShim
@@ -2066,6 +2142,7 @@
android.icu.text.CurrencyMetaInfo
android.icu.text.CurrencyMetaInfo$CurrencyDigits
android.icu.text.CurrencyMetaInfo$CurrencyFilter
+android.icu.text.CurrencyPluralInfo
android.icu.text.DateFormat
android.icu.text.DateFormat$BooleanAttribute
android.icu.text.DateFormat$Field
@@ -2103,14 +2180,17 @@
android.icu.text.DigitList
android.icu.text.DisplayContext
android.icu.text.DisplayContext$Type
+android.icu.text.Edits
android.icu.text.IDNA
android.icu.text.LanguageBreakEngine
-android.icu.text.ListFormatter
-android.icu.text.ListFormatter$Cache
-android.icu.text.ListFormatter$FormattedListBuilder
android.icu.text.ListFormatter$Style
android.icu.text.LocaleDisplayNames
android.icu.text.LocaleDisplayNames$DialectHandling
+android.icu.text.MeasureFormat
+android.icu.text.MeasureFormat$FormatWidth
+android.icu.text.MeasureFormat$ImmutableNumberFormat
+android.icu.text.MeasureFormat$MeasureFormatData
+android.icu.text.MeasureFormat$UnitDataSink
android.icu.text.Normalizer
android.icu.text.Normalizer$FCDMode
android.icu.text.Normalizer$Mode
@@ -2118,7 +2198,6 @@
android.icu.text.Normalizer$NFCMode
android.icu.text.Normalizer$NFCModeImpl
android.icu.text.Normalizer$NFDMode
-android.icu.text.Normalizer$NFDModeImpl
android.icu.text.Normalizer$NFKCMode
android.icu.text.Normalizer$NFKDMode
android.icu.text.Normalizer$NFKDModeImpl
@@ -2212,7 +2291,6 @@
android.icu.util.CharsTrie
android.icu.util.CharsTrie$Entry
android.icu.util.CharsTrie$Iterator
-android.icu.util.ChineseCalendar
android.icu.util.Currency
android.icu.util.Currency$1
android.icu.util.Currency$CurrencyUsage
@@ -2220,11 +2298,8 @@
android.icu.util.CurrencyAmount
android.icu.util.Freezable
android.icu.util.GregorianCalendar
-android.icu.util.HebrewCalendar
android.icu.util.ICUException
-android.icu.util.IndianCalendar
-android.icu.util.IslamicCalendar
-android.icu.util.IslamicCalendar$CalculationType
+android.icu.util.ICUUncheckedIOException
android.icu.util.LocaleData
android.icu.util.Measure
android.icu.util.MeasureUnit
@@ -2263,9 +2338,10 @@
android.inputmethodservice.InputMethodService$Insets
android.inputmethodservice.InputMethodService$SettingsObserver
android.inputmethodservice.SoftInputWindow
-android.inputmethodservice.SoftInputWindow$Callback
android.location.Address
android.location.Address$1
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
android.location.Country
android.location.Country$1
android.location.CountryDetector
@@ -2273,6 +2349,7 @@
android.location.CountryDetector$ListenerTransport$1
android.location.CountryListener
android.location.Criteria
+android.location.Criteria$1
android.location.Geocoder
android.location.GeocoderParams
android.location.GeocoderParams$1
@@ -2288,6 +2365,8 @@
android.location.GpsStatus$1
android.location.GpsStatus$Listener
android.location.GpsStatus$SatelliteIterator
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
android.location.ICountryDetector
android.location.ICountryDetector$Stub
android.location.ICountryDetector$Stub$Proxy
@@ -2346,6 +2425,8 @@
android.media.AudioDevicePortConfig
android.media.AudioFocusInfo
android.media.AudioFocusInfo$1
+android.media.AudioFocusRequest
+android.media.AudioFocusRequest$Builder
android.media.AudioFormat
android.media.AudioFormat$1
android.media.AudioFormat$Builder
@@ -2356,6 +2437,7 @@
android.media.AudioManager$1
android.media.AudioManager$2
android.media.AudioManager$3
+android.media.AudioManager$FocusRequestInfo
android.media.AudioManager$NativeEventHandlerDelegate
android.media.AudioManager$NativeEventHandlerDelegate$1
android.media.AudioManager$OnAmPortUpdateListener
@@ -2377,8 +2459,6 @@
android.media.AudioPortEventHandler
android.media.AudioPortEventHandler$1
android.media.AudioRecord
-android.media.AudioRecordingConfiguration
-android.media.AudioRecordingConfiguration$1
android.media.AudioRoutesInfo
android.media.AudioRoutesInfo$1
android.media.AudioRouting
@@ -2392,8 +2472,6 @@
android.media.BufferingParams$1
android.media.CamcorderProfile
android.media.CameraProfile
-android.media.Cea708CaptionRenderer
-android.media.ClosedCaptionRenderer
android.media.DecoderCapabilities
android.media.DeniedByServerException
android.media.EncoderCapabilities
@@ -2422,10 +2500,6 @@
android.media.IMediaRouterService
android.media.IMediaRouterService$Stub
android.media.IMediaRouterService$Stub$Proxy
-android.media.IMediaScannerListener
-android.media.IMediaScannerListener$Stub
-android.media.IMediaScannerService
-android.media.IMediaScannerService$Stub
android.media.IPlaybackConfigDispatcher
android.media.IPlaybackConfigDispatcher$Stub
android.media.IPlayer
@@ -2477,15 +2551,17 @@
android.media.MediaCodecInfo$VideoCapabilities
android.media.MediaCodecList
android.media.MediaCrypto
+android.media.MediaCryptoException
+android.media.MediaDescrambler
android.media.MediaDescription
android.media.MediaDescription$1
android.media.MediaDescription$Builder
android.media.MediaDrm
android.media.MediaDrm$Certificate
-android.media.MediaDrm$CryptoSession
android.media.MediaDrm$EventHandler
android.media.MediaDrm$KeyRequest
android.media.MediaDrm$MediaDrmStateException
+android.media.MediaDrm$OnEventListener
android.media.MediaDrm$ProvisionRequest
android.media.MediaDrmException
android.media.MediaExtractor
@@ -2497,23 +2573,20 @@
android.media.MediaMetadata
android.media.MediaMetadata$1
android.media.MediaMetadata$Builder
-android.media.MediaMetadataEditor
android.media.MediaMetadataRetriever
android.media.MediaMuxer
android.media.MediaPlayer
android.media.MediaPlayer$1
android.media.MediaPlayer$2
-android.media.MediaPlayer$3
-android.media.MediaPlayer$3$1
+android.media.MediaPlayer$4
+android.media.MediaPlayer$4$1
android.media.MediaPlayer$EventHandler
-android.media.MediaPlayer$OnBufferingUpdateListener
android.media.MediaPlayer$OnCompletionListener
android.media.MediaPlayer$OnErrorListener
android.media.MediaPlayer$OnInfoListener
android.media.MediaPlayer$OnPreparedListener
android.media.MediaPlayer$OnSeekCompleteListener
android.media.MediaPlayer$OnSubtitleDataListener
-android.media.MediaPlayer$OnVideoSizeChangedListener
android.media.MediaPlayer$TimeProvider
android.media.MediaPlayer$TimeProvider$EventHandler
android.media.MediaPlayer$TrackInfo
@@ -2521,7 +2594,6 @@
android.media.MediaRecorder
android.media.MediaRecorder$EventHandler
android.media.MediaRecorder$OnErrorListener
-android.media.MediaRecorder$OnInfoListener
android.media.MediaRouter
android.media.MediaRouter$Callback
android.media.MediaRouter$CallbackInfo
@@ -2534,9 +2606,7 @@
android.media.MediaRouter$Static$1
android.media.MediaRouter$Static$Client
android.media.MediaRouter$Static$Client$1
-android.media.MediaRouter$UserRouteInfo
android.media.MediaRouter$VolumeCallback
-android.media.MediaRouter$VolumeCallbackInfo
android.media.MediaRouter$VolumeChangeReceiver
android.media.MediaRouter$WifiDisplayStatusChangedReceiver
android.media.MediaRouterClientState
@@ -2544,38 +2614,25 @@
android.media.MediaRouterClientState$RouteInfo
android.media.MediaRouterClientState$RouteInfo$1
android.media.MediaScanner
-android.media.MediaScanner$FileEntry
-android.media.MediaScanner$MediaBulkDeleter
-android.media.MediaScanner$MyMediaScannerClient
-android.media.MediaScannerClient
android.media.MediaScannerConnection
-android.media.MediaScannerConnection$1
-android.media.MediaScannerConnection$ClientProxy
-android.media.MediaScannerConnection$MediaScannerConnectionClient
android.media.MediaScannerConnection$OnScanCompletedListener
android.media.MediaSync
android.media.MediaTimeProvider
android.media.MediaTimeProvider$OnMediaTimeListener
-android.media.Metadata
android.media.MiniThumbFile
android.media.NotProvisionedException
android.media.PlaybackParams
android.media.PlaybackParams$1
android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
android.media.PlayerBase$PlayerIdCard
android.media.PlayerBase$PlayerIdCard$1
+android.media.PlayerProxy
android.media.Rating
android.media.Rating$1
-android.media.RemoteControlClient
-android.media.RemoteControlClient$MetadataEditor
-android.media.RemoteControlClient$OnMetadataUpdateListener
android.media.RemoteDisplay
android.media.ResampleInputStream
-android.media.Ringtone
-android.media.Ringtone$MyOnCompletionListener
-android.media.RingtoneManager
android.media.SoundPool
android.media.SoundPool$Builder
android.media.SoundPool$EventHandler
@@ -2585,32 +2642,32 @@
android.media.SubtitleController$2
android.media.SubtitleController$Anchor
android.media.SubtitleController$Listener
-android.media.SubtitleController$Renderer
android.media.SubtitleTrack
android.media.SyncParams
android.media.ThumbnailUtils
android.media.ThumbnailUtils$SizedThumbnailBitmap
android.media.ToneGenerator
-android.media.TtmlRenderer
+android.media.UnsupportedSchemeException
android.media.Utils
android.media.Utils$1
android.media.Utils$2
+android.media.VolumeAutomation
android.media.VolumePolicy
android.media.VolumePolicy$1
-android.media.VolumeProvider
-android.media.WebVttRenderer
+android.media.VolumeShaper
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
android.media.audiofx.AudioEffect
android.media.audiofx.AudioEffect$Descriptor
-android.media.audiofx.BassBoost
-android.media.audiofx.BassBoost$Settings
-android.media.audiofx.Equalizer
android.media.audiofx.LoudnessEnhancer
-android.media.audiofx.NoiseSuppressor
-android.media.audiofx.PresetReverb
android.media.audiofx.Virtualizer
-android.media.audiofx.Virtualizer$Settings
android.media.audiofx.Visualizer
-android.media.audiofx.Visualizer$OnDataCaptureListener
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
@@ -2618,9 +2675,10 @@
android.media.audiopolicy.IAudioPolicyCallback
android.media.audiopolicy.IAudioPolicyCallback$Stub
android.media.browse.MediaBrowser
-android.media.browse.MediaBrowser$10
+android.media.browse.MediaBrowser$1
+android.media.browse.MediaBrowser$2
+android.media.browse.MediaBrowser$6
android.media.browse.MediaBrowser$ConnectionCallback
-android.media.browse.MediaBrowser$MediaItem
android.media.browse.MediaBrowser$MediaServiceConnection
android.media.browse.MediaBrowser$MediaServiceConnection$1
android.media.browse.MediaBrowser$ServiceCallbacks
@@ -2646,6 +2704,9 @@
android.media.session.IActiveSessionsListener
android.media.session.IActiveSessionsListener$Stub
android.media.session.IActiveSessionsListener$Stub$Proxy
+android.media.session.ICallback
+android.media.session.ICallback$Stub
+android.media.session.ICallback$Stub$Proxy
android.media.session.IOnMediaKeyListener
android.media.session.IOnVolumeKeyLongPressListener
android.media.session.ISession
@@ -2677,8 +2738,11 @@
android.media.session.MediaSession$QueueItem$1
android.media.session.MediaSession$Token
android.media.session.MediaSession$Token$1
-android.media.session.MediaSessionLegacyHelper
android.media.session.MediaSessionManager
+android.media.session.MediaSessionManager$Callback
+android.media.session.MediaSessionManager$CallbackImpl
+android.media.session.MediaSessionManager$CallbackImpl$3
+android.media.session.MediaSessionManager$CallbackImpl$4
android.media.session.MediaSessionManager$OnActiveSessionsChangedListener
android.media.session.MediaSessionManager$SessionsChangedWrapper
android.media.session.MediaSessionManager$SessionsChangedWrapper$1
@@ -2711,11 +2775,9 @@
android.net.ConnectivityManager$CallbackHandler
android.net.ConnectivityManager$NetworkCallback
android.net.ConnectivityManager$OnNetworkActiveListener
-android.net.ConnectivityManager$PacketKeepalive
android.net.ConnectivityManager$PacketKeepaliveCallback
android.net.ConnectivityMetricsEvent
android.net.ConnectivityMetricsEvent$1
-android.net.ConnectivityMetricsEvent$Reference
android.net.ConnectivityThread
android.net.ConnectivityThread$Singleton
android.net.Credentials
@@ -2731,14 +2793,14 @@
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
-android.net.IConnectivityMetricsLogger
-android.net.IConnectivityMetricsLogger$Stub
android.net.IEthernetManager
android.net.IEthernetManager$Stub
android.net.IEthernetServiceListener
android.net.IEthernetServiceListener$Stub
android.net.IIpConnectivityMetrics
android.net.IIpConnectivityMetrics$Stub
+android.net.IIpSecService
+android.net.IIpSecService$Stub
android.net.INetd
android.net.INetd$Stub
android.net.INetd$Stub$Proxy
@@ -2751,6 +2813,9 @@
android.net.INetworkPolicyManager
android.net.INetworkPolicyManager$Stub
android.net.INetworkPolicyManager$Stub$Proxy
+android.net.INetworkRecommendationProvider
+android.net.INetworkRecommendationProvider$Stub
+android.net.INetworkRecommendationProvider$Stub$Proxy
android.net.INetworkScoreCache
android.net.INetworkScoreCache$Stub
android.net.INetworkScoreCache$Stub$Proxy
@@ -2761,8 +2826,6 @@
android.net.INetworkStatsService$Stub
android.net.INetworkStatsService$Stub$Proxy
android.net.INetworkStatsSession
-android.net.INetworkStatsSession$Stub
-android.net.INetworkStatsSession$Stub$Proxy
android.net.InterfaceConfiguration
android.net.InterfaceConfiguration$1
android.net.IpConfiguration
@@ -2771,6 +2834,8 @@
android.net.IpConfiguration$ProxySettings
android.net.IpPrefix
android.net.IpPrefix$1
+android.net.IpSecConfig
+android.net.IpSecManager
android.net.LinkAddress
android.net.LinkAddress$1
android.net.LinkProperties
@@ -2784,12 +2849,13 @@
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
+android.net.MatchAllNetworkSpecifier
+android.net.MatchAllNetworkSpecifier$1
android.net.Network
android.net.Network$1
android.net.Network$2
android.net.Network$NetworkBoundSocketFactory
android.net.NetworkAgent
-android.net.NetworkBadging
android.net.NetworkCapabilities
android.net.NetworkCapabilities$1
android.net.NetworkConfig
@@ -2808,12 +2874,17 @@
android.net.NetworkPolicy$1
android.net.NetworkPolicyManager
android.net.NetworkQuotaInfo
+android.net.NetworkRecommendationProvider
+android.net.NetworkRecommendationProvider$ServiceWrapper
+android.net.NetworkRecommendationProvider$ServiceWrapper$1
android.net.NetworkRequest
android.net.NetworkRequest$1
android.net.NetworkRequest$Builder
android.net.NetworkRequest$Type
android.net.NetworkScoreManager
-android.net.NetworkScorerAppManager
+android.net.NetworkScorerAppData
+android.net.NetworkScorerAppData$1
+android.net.NetworkSpecifier
android.net.NetworkState
android.net.NetworkState$1
android.net.NetworkStats
@@ -2824,7 +2895,6 @@
android.net.NetworkStatsHistory$1
android.net.NetworkStatsHistory$DataStreamUtils
android.net.NetworkStatsHistory$Entry
-android.net.NetworkStatsHistory$ParcelUtils
android.net.NetworkTemplate
android.net.NetworkTemplate$1
android.net.NetworkUtils
@@ -2832,8 +2902,6 @@
android.net.Proxy
android.net.ProxyInfo
android.net.ProxyInfo$1
-android.net.RecommendationRequest
-android.net.RecommendationResult
android.net.RouteInfo
android.net.RouteInfo$1
android.net.RssiCurve
@@ -2846,6 +2914,8 @@
android.net.SntpClient
android.net.StaticIpConfiguration
android.net.StaticIpConfiguration$1
+android.net.StringNetworkSpecifier
+android.net.StringNetworkSpecifier$1
android.net.TrafficStats
android.net.UidRange
android.net.Uri
@@ -2861,8 +2931,6 @@
android.net.Uri$PathSegments
android.net.Uri$PathSegmentsBuilder
android.net.Uri$StringUri
-android.net.UrlQuerySanitizer
-android.net.VpnService
android.net.WebAddress
android.net.WifiKey
android.net.WifiKey$1
@@ -2873,17 +2941,17 @@
android.net.http.AndroidHttpClient$LoggingConfiguration
android.net.http.HttpResponseCache
android.net.http.SslCertificate
-android.net.http.SslError
android.net.http.X509TrustManagerExtensions
android.net.metrics.ApfProgramEvent
android.net.metrics.ApfProgramEvent$1
+android.net.metrics.ApfStats
+android.net.metrics.ApfStats$1
android.net.metrics.ConnectStats
android.net.metrics.DefaultNetworkEvent
android.net.metrics.DefaultNetworkEvent$1
android.net.metrics.DhcpClientEvent
android.net.metrics.DhcpClientEvent$1
android.net.metrics.DnsEvent
-android.net.metrics.DnsEvent$1
android.net.metrics.IpConnectivityLog
android.net.metrics.IpManagerEvent
android.net.metrics.IpManagerEvent$1
@@ -2903,7 +2971,6 @@
android.net.sip.SipManager
android.net.wifi.IRttManager
android.net.wifi.IRttManager$Stub
-android.net.wifi.IRttManager$Stub$Proxy
android.net.wifi.IWifiManager
android.net.wifi.IWifiManager$Stub
android.net.wifi.IWifiManager$Stub$Proxy
@@ -2911,12 +2978,10 @@
android.net.wifi.IWifiScanner$Stub
android.net.wifi.IWifiScanner$Stub$Proxy
android.net.wifi.ParcelUtil
-android.net.wifi.RssiPacketCountInfo
android.net.wifi.RttManager
android.net.wifi.RttManager$RttCapabilities
android.net.wifi.RttManager$RttListener
android.net.wifi.RttManager$RttResult
-android.net.wifi.RttManager$ServiceHandler
android.net.wifi.ScanResult
android.net.wifi.ScanResult$1
android.net.wifi.ScanResult$InformationElement
@@ -2925,15 +2990,10 @@
android.net.wifi.SupplicantState$1
android.net.wifi.WifiActivityEnergyInfo
android.net.wifi.WifiActivityEnergyInfo$1
-android.net.wifi.WifiChannel
android.net.wifi.WifiConfiguration
android.net.wifi.WifiConfiguration$1
-android.net.wifi.WifiConfiguration$AuthAlgorithm
-android.net.wifi.WifiConfiguration$GroupCipher
android.net.wifi.WifiConfiguration$KeyMgmt
android.net.wifi.WifiConfiguration$NetworkSelectionStatus
-android.net.wifi.WifiConfiguration$PairwiseCipher
-android.net.wifi.WifiConfiguration$Protocol
android.net.wifi.WifiConfiguration$Visibility
android.net.wifi.WifiConnectionStatistics
android.net.wifi.WifiConnectionStatistics$1
@@ -2949,6 +3009,7 @@
android.net.wifi.WifiManager$WifiLock
android.net.wifi.WifiNetworkScoreCache
android.net.wifi.WifiNetworkScoreCache$CacheListener
+android.net.wifi.WifiNetworkScoreCache$CacheListener$1
android.net.wifi.WifiScanner
android.net.wifi.WifiScanner$ActionListener
android.net.wifi.WifiScanner$ChannelSpec
@@ -2966,7 +3027,6 @@
android.net.wifi.WifiScanner$ServiceHandler
android.net.wifi.WifiSsid
android.net.wifi.WifiSsid$1
-android.net.wifi.WifiWakeReasonAndCounts
android.net.wifi.WpsInfo
android.net.wifi.WpsInfo$1
android.net.wifi.aware.WifiAwareManager
@@ -2988,12 +3048,9 @@
android.net.wifi.p2p.WifiP2pInfo
android.net.wifi.p2p.WifiP2pInfo$1
android.net.wifi.p2p.WifiP2pManager
-android.net.wifi.p2p.WifiP2pManager$PeerListListener
-android.net.wifi.p2p.WifiP2pManager$PersistentGroupInfoListener
android.net.wifi.p2p.WifiP2pWfdInfo
android.net.wifi.p2p.WifiP2pWfdInfo$1
android.nfc.BeamShareData
-android.nfc.ErrorCodes
android.nfc.FormatException
android.nfc.IAppCallback
android.nfc.IAppCallback$Stub
@@ -3014,7 +3071,6 @@
android.nfc.INfcUnlockHandler
android.nfc.ITagRemovedCallback
android.nfc.NdefMessage
-android.nfc.NdefRecord
android.nfc.NfcActivityManager
android.nfc.NfcActivityManager$NfcActivityState
android.nfc.NfcActivityManager$NfcApplicationState
@@ -3035,13 +3091,6 @@
android.nfc.cardemulation.CardEmulation
android.nfc.cardemulation.HostApduService
android.nfc.cardemulation.HostApduService$MsgHandler
-android.nfc.cardemulation.NfcFCardEmulation
-android.nfc.cardemulation.NfcFServiceInfo
-android.nfc.tech.BasicTagTechnology
-android.nfc.tech.MifareClassic
-android.nfc.tech.Ndef
-android.nfc.tech.NfcBarcode
-android.nfc.tech.TagTechnology
android.opengl.EGL14
android.opengl.EGLConfig
android.opengl.EGLContext
@@ -3050,7 +3099,6 @@
android.opengl.EGLObjectHandle
android.opengl.EGLSurface
android.opengl.ETC1
-android.opengl.ETC1Util
android.opengl.GLES10
android.opengl.GLES10Ext
android.opengl.GLES11
@@ -3060,29 +3108,13 @@
android.opengl.GLES31
android.opengl.GLES31Ext
android.opengl.GLES32
-android.opengl.GLSurfaceView
-android.opengl.GLSurfaceView$BaseConfigChooser
-android.opengl.GLSurfaceView$ComponentSizeChooser
-android.opengl.GLSurfaceView$DefaultContextFactory
-android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory
-android.opengl.GLSurfaceView$EGLConfigChooser
-android.opengl.GLSurfaceView$EGLContextFactory
-android.opengl.GLSurfaceView$EGLWindowSurfaceFactory
-android.opengl.GLSurfaceView$EglHelper
-android.opengl.GLSurfaceView$GLThread
-android.opengl.GLSurfaceView$GLThreadManager
-android.opengl.GLSurfaceView$Renderer
-android.opengl.GLSurfaceView$SimpleEGLConfigChooser
-android.opengl.GLU
android.opengl.GLUtils
android.opengl.Matrix
android.opengl.Visibility
-android.os.-$Lambda$0$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$1$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
-android.os.-$Lambda$67$OsaxDBgigpqjZN1F4C6nYRYm1YQ
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE$1
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
android.os.AsyncResult
-android.os.AsyncTask
android.os.AsyncTask$1
android.os.AsyncTask$2
android.os.AsyncTask$3
@@ -3106,19 +3138,18 @@
android.os.BatteryStats$DailyItem
android.os.BatteryStats$HistoryEventTracker
android.os.BatteryStats$HistoryItem
-android.os.BatteryStats$HistoryPrinter
android.os.BatteryStats$HistoryStepDetails
android.os.BatteryStats$HistoryTag
android.os.BatteryStats$IntToString
android.os.BatteryStats$LevelStepTracker
android.os.BatteryStats$LongCounter
+android.os.BatteryStats$LongCounterArray
android.os.BatteryStats$PackageChange
android.os.BatteryStats$Timer
android.os.BatteryStats$Uid
android.os.BatteryStats$Uid$Pid
android.os.BatteryStats$Uid$Pkg
android.os.BatteryStats$Uid$Pkg$Serv
-android.os.BatteryStats$Uid$Proc
android.os.BatteryStats$Uid$Sensor
android.os.BatteryStats$Uid$Wakelock
android.os.Binder
@@ -3133,7 +3164,6 @@
android.os.CommonTimeConfig$OnServerDiedListener
android.os.ConditionVariable
android.os.CountDownTimer
-android.os.CountDownTimer$1
android.os.CpuUsageInfo
android.os.CpuUsageInfo$1
android.os.DeadObjectException
@@ -3147,7 +3177,8 @@
android.os.Environment
android.os.Environment$UserEnvironment
android.os.FactoryTest
-android.os.FileObserver
+android.os.FileBridge
+android.os.FileBridge$FileBridgeOutputStream
android.os.FileObserver$ObserverThread
android.os.FileUtils
android.os.GraphicsEnvironment
@@ -3234,7 +3265,6 @@
android.os.MessageQueue$OnFileDescriptorEventListener
android.os.Messenger
android.os.Messenger$1
-android.os.NullVibrator
android.os.OperationCanceledException
android.os.Parcel
android.os.Parcel$1
@@ -3252,6 +3282,7 @@
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
+android.os.ParcelableException
android.os.ParcelableParcel
android.os.ParcelableParcel$1
android.os.PatternMatcher
@@ -3266,15 +3297,18 @@
android.os.PowerManager$WakeLock$1
android.os.PowerManagerInternal
android.os.PowerManagerInternal$LowPowerModeListener
+android.os.PowerSaveState
+android.os.PowerSaveState$1
+android.os.PowerSaveState$Builder
android.os.Process
android.os.Process$ProcessStartResult
android.os.RecoverySystem
+android.os.RecoverySystem$ProgressListener
android.os.Registrant
android.os.RegistrantList
android.os.RemoteCallback
android.os.RemoteCallback$1
android.os.RemoteCallback$2
-android.os.RemoteCallback$3
android.os.RemoteCallback$OnResultListener
android.os.RemoteCallbackList
android.os.RemoteCallbackList$Callback
@@ -3284,14 +3318,13 @@
android.os.ResultReceiver$MyResultReceiver
android.os.ResultReceiver$MyRunnable
android.os.SELinux
+android.os.Seccomp
android.os.ServiceManager
android.os.ServiceManager$ServiceNotFoundException
android.os.ServiceManagerNative
android.os.ServiceManagerProxy
android.os.ServiceSpecificException
android.os.ShellCallback
-android.os.ShellCallback$1
-android.os.ShellCommand
android.os.StatFs
android.os.StrictMode
android.os.StrictMode$1
@@ -3310,6 +3343,7 @@
android.os.StrictMode$InstanceTracker
android.os.StrictMode$LogStackTrace
android.os.StrictMode$Span
+android.os.StrictMode$StrictModeCustomViolation
android.os.StrictMode$StrictModeDiskReadViolation
android.os.StrictMode$StrictModeDiskWriteViolation
android.os.StrictMode$StrictModeViolation
@@ -3340,18 +3374,27 @@
android.os.UserHandle
android.os.UserHandle$1
android.os.UserManager
+android.os.UserManager$EnforcingUser
+android.os.UserManager$EnforcingUser$1
android.os.UserManagerInternal
android.os.UserManagerInternal$UserRestrictionsListener
+android.os.VibrationEffect
+android.os.VibrationEffect$1
+android.os.VibrationEffect$OneShot
+android.os.VibrationEffect$Prebaked
+android.os.VibrationEffect$Prebaked$1
+android.os.VibrationEffect$Waveform
+android.os.VibrationEffect$Waveform$1
android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
android.os.WorkSource
android.os.WorkSource$1
android.os.ZygoteProcess
android.os.ZygoteProcess$ZygoteState
android.os.ZygoteStartFailedEx
-android.os.health.HealthStats
android.os.health.HealthStatsParceler
android.os.health.SystemHealthManager
-android.os.health.TimerStat
android.os.storage.DiskInfo
android.os.storage.DiskInfo$1
android.os.storage.IObbActionListener
@@ -3376,50 +3419,23 @@
android.os.storage.VolumeInfo$2
android.os.storage.VolumeRecord
android.os.storage.VolumeRecord$1
-android.permissionpresenterservice.RuntimePermissionPresenterService
-android.permissionpresenterservice.RuntimePermissionPresenterService$1
-android.permissionpresenterservice.RuntimePermissionPresenterService$MyHandler
-android.preference.CheckBoxPreference
-android.preference.DialogPreference
android.preference.GenericInflater$Parent
-android.preference.ListPreference
android.preference.Preference
android.preference.Preference$BaseSavedState
android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeInternalListener
android.preference.Preference$OnPreferenceChangeListener
-android.preference.Preference$OnPreferenceClickListener
android.preference.PreferenceActivity
android.preference.PreferenceFragment
-android.preference.PreferenceFragment$1
-android.preference.PreferenceFragment$2
-android.preference.PreferenceFragment$3
android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
-android.preference.PreferenceFrameLayout
android.preference.PreferenceGroup
-android.preference.PreferenceGroupAdapter
-android.preference.PreferenceGroupAdapter$1
-android.preference.PreferenceGroupAdapter$PreferenceLayout
android.preference.PreferenceManager
-android.preference.PreferenceManager$OnActivityDestroyListener
android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.preference.PreferenceScreen
-android.preference.SeekBarVolumizer
-android.preference.SeekBarVolumizer$Callback
-android.preference.SeekBarVolumizer$H
-android.preference.SeekBarVolumizer$Observer
-android.preference.SeekBarVolumizer$Receiver
-android.preference.SwitchPreference
-android.preference.SwitchPreference$Listener
-android.preference.TwoStatePreference
android.print.IPrintDocumentAdapter
android.print.IPrintJobStateChangeListener
android.print.IPrintManager
android.print.IPrintManager$Stub
-android.print.IPrintManager$Stub$Proxy
android.print.IPrintServicesChangeListener
-android.print.IPrintServicesChangeListener$Stub
-android.print.IPrintServicesChangeListener$Stub$Proxy
android.print.IPrintSpooler
android.print.IPrintSpooler$Stub
android.print.IPrintSpooler$Stub$Proxy
@@ -3427,35 +3443,23 @@
android.print.IPrintSpoolerCallbacks$Stub
android.print.IPrintSpoolerClient
android.print.IPrintSpoolerClient$Stub
-android.print.IPrintSpoolerClient$Stub$Proxy
android.print.IPrinterDiscoveryObserver
android.print.PageRange
android.print.PrintAttributes
-android.print.PrintAttributes$Builder
-android.print.PrintAttributes$Margins
-android.print.PrintAttributes$MediaSize
-android.print.PrintAttributes$Resolution
android.print.PrintDocumentAdapter
android.print.PrintDocumentAdapter$LayoutResultCallback
android.print.PrintDocumentAdapter$WriteResultCallback
-android.print.PrintDocumentInfo
-android.print.PrintDocumentInfo$Builder
android.print.PrintJobId
android.print.PrintJobInfo
android.print.PrintManager
-android.print.PrintManager$1
-android.print.PrintManager$PrintServicesChangeListener
-android.print.PrintManager$PrintServicesChangeListenerWrapper
-android.print.PrintServicesLoader
-android.print.PrintServicesLoader$1
-android.print.PrintServicesLoader$MyHandler
android.print.PrinterId
android.printservice.IPrintServiceClient
android.printservice.IPrintServiceClient$Stub
android.printservice.PrintServiceInfo
android.printservice.PrintServiceInfo$1
android.printservice.recommendation.IRecommendationsChangeListener
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
android.provider.BaseColumns
android.provider.BlockedNumberContract
android.provider.BlockedNumberContract$BlockedNumbers
@@ -3467,42 +3471,30 @@
android.provider.CalendarContract$CalendarCache
android.provider.CalendarContract$CalendarCacheColumns
android.provider.CalendarContract$CalendarColumns
-android.provider.CalendarContract$CalendarEntity
-android.provider.CalendarContract$CalendarEntity$EntityIteratorImpl
android.provider.CalendarContract$CalendarSyncColumns
android.provider.CalendarContract$Calendars
android.provider.CalendarContract$Colors
android.provider.CalendarContract$ColorsColumns
android.provider.CalendarContract$Events
android.provider.CalendarContract$EventsColumns
-android.provider.CalendarContract$EventsEntity
-android.provider.CalendarContract$EventsEntity$EntityIteratorImpl
android.provider.CalendarContract$ExtendedProperties
android.provider.CalendarContract$ExtendedPropertiesColumns
android.provider.CalendarContract$Instances
android.provider.CalendarContract$Reminders
android.provider.CalendarContract$RemindersColumns
android.provider.CalendarContract$SyncColumns
-android.provider.CalendarContract$SyncState
android.provider.CallLog
android.provider.CallLog$Calls
-android.provider.Contacts
-android.provider.Contacts$ContactMethods
-android.provider.Contacts$ContactMethodsColumns
-android.provider.Contacts$PeopleColumns
android.provider.ContactsContract
-android.provider.ContactsContract$AggregationExceptions
android.provider.ContactsContract$BaseSyncColumns
android.provider.ContactsContract$CommonDataKinds$BaseTypes
android.provider.ContactsContract$CommonDataKinds$Callable
android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Contactables
android.provider.ContactsContract$CommonDataKinds$Email
android.provider.ContactsContract$CommonDataKinds$Event
android.provider.ContactsContract$CommonDataKinds$Im
android.provider.ContactsContract$CommonDataKinds$Phone
android.provider.ContactsContract$CommonDataKinds$Relation
-android.provider.ContactsContract$CommonDataKinds$SipAddress
android.provider.ContactsContract$CommonDataKinds$StructuredPostal
android.provider.ContactsContract$ContactCounts
android.provider.ContactsContract$ContactNameColumns
@@ -3525,50 +3517,37 @@
android.provider.ContactsContract$MetadataSyncColumns
android.provider.ContactsContract$PhoneLookup
android.provider.ContactsContract$PhoneLookupColumns
-android.provider.ContactsContract$PinnedPositions
android.provider.ContactsContract$Profile
android.provider.ContactsContract$ProviderStatus
-android.provider.ContactsContract$QuickContact
android.provider.ContactsContract$RawContacts
android.provider.ContactsContract$RawContactsColumns
android.provider.ContactsContract$RawContactsEntity
-android.provider.ContactsContract$Settings
-android.provider.ContactsContract$SettingsColumns
android.provider.ContactsContract$StatusColumns
-android.provider.ContactsContract$StreamItems
-android.provider.ContactsContract$StreamItemsColumns
android.provider.ContactsContract$SyncColumns
-android.provider.ContactsContract$SyncState
-android.provider.ContactsInternal
android.provider.DocumentsContract
+android.provider.DocumentsContract$Path
android.provider.DocumentsProvider
android.provider.Downloads
android.provider.Downloads$Impl
-android.provider.MediaStore
+android.provider.FontsContract
+android.provider.FontsContract$1
android.provider.MediaStore$Audio
android.provider.MediaStore$Audio$AlbumColumns
android.provider.MediaStore$Audio$Albums
android.provider.MediaStore$Audio$AudioColumns
-android.provider.MediaStore$Audio$Genres
-android.provider.MediaStore$Audio$Genres$Members
-android.provider.MediaStore$Audio$GenresColumns
android.provider.MediaStore$Audio$Media
android.provider.MediaStore$Audio$Playlists
-android.provider.MediaStore$Audio$Playlists$Members
android.provider.MediaStore$Audio$PlaylistsColumns
android.provider.MediaStore$Files
android.provider.MediaStore$Images$ImageColumns
android.provider.MediaStore$Images$Media
android.provider.MediaStore$Images$Thumbnails
-android.provider.MediaStore$InternalThumbnails
android.provider.MediaStore$MediaColumns
android.provider.MediaStore$Video$Media
-android.provider.MediaStore$Video$Thumbnails
android.provider.MediaStore$Video$VideoColumns
android.provider.OpenableColumns
android.provider.SearchIndexableData
android.provider.SearchIndexableResource
-android.provider.SearchIndexablesContract
android.provider.SearchIndexablesProvider
android.provider.SearchRecentSuggestions
android.provider.Settings
@@ -3594,17 +3573,12 @@
android.provider.Settings$System$InclusiveIntegerRangeValidator
android.provider.Settings$System$Validator
android.provider.SyncStateContract$Columns
-android.provider.SyncStateContract$Helpers
android.provider.Telephony$BaseMmsColumns
android.provider.Telephony$Carriers
android.provider.Telephony$Mms
-android.provider.Telephony$Mms$Inbox
-android.provider.Telephony$Mms$Sent
android.provider.Telephony$MmsSms
+android.provider.Telephony$ServiceStateTable
android.provider.Telephony$Sms
-android.provider.Telephony$Sms$Inbox
-android.provider.Telephony$Sms$Intents
-android.provider.Telephony$Sms$Sent
android.provider.Telephony$TextBasedSmsColumns
android.provider.Telephony$Threads
android.provider.Telephony$ThreadsColumns
@@ -3612,21 +3586,9 @@
android.provider.VoicemailContract$Status
android.provider.VoicemailContract$Voicemails
android.renderscript.Allocation
-android.renderscript.Allocation$MipmapControl
android.renderscript.BaseObj
-android.renderscript.Element
-android.renderscript.Element$DataKind
-android.renderscript.Element$DataType
-android.renderscript.RenderScript
-android.renderscript.RenderScript$ContextType
-android.renderscript.RenderScript$MessageThread
+android.renderscript.Matrix4f
android.renderscript.RenderScriptCacheDir
-android.renderscript.Script
-android.renderscript.ScriptIntrinsic
-android.renderscript.ScriptIntrinsicBlur
-android.renderscript.Type
-android.renderscript.Type$Builder
-android.renderscript.Type$CubemapFace
android.security.GateKeeper
android.security.IKeyChainService
android.security.IKeyChainService$Stub
@@ -3683,35 +3645,38 @@
android.security.net.config.RootTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
-android.security.net.config.SystemCertificateSource$NoPreloadHolder
android.security.net.config.TrustedCertificateStoreAdapter
android.security.net.config.UserCertificateSource
-android.security.net.config.UserCertificateSource$NoPreloadHolder
android.security.net.config.XmlConfigSource
android.security.net.config.XmlConfigSource$ParserException
-android.service.autofill.IAutoFillManagerService
-android.service.autofill.IAutoFillManagerService$Stub
-android.service.autofill.IAutoFillManagerService$Stub$Proxy
+android.service.autofill.-$Lambda$svbjmB3NFhHnuZrn67G14PFSJlY
+android.service.autofill.AutofillService
+android.service.autofill.AutofillService$1
+android.service.autofill.AutofillServiceInfo
+android.service.autofill.FillCallback
+android.service.autofill.FillContext
+android.service.autofill.FillContext$1
+android.service.autofill.FillEventHistory
+android.service.autofill.FillRequest
+android.service.autofill.FillRequest$1
+android.service.autofill.FillResponse
+android.service.autofill.IAutoFillService
+android.service.autofill.IAutoFillService$Stub
+android.service.autofill.IAutoFillService$Stub$Proxy
+android.service.autofill.IFillCallback
+android.service.autofill.IFillCallback$Stub
+android.service.autofill.IFillCallback$Stub$Proxy
+android.service.autofill.SaveCallback
+android.service.autofill.SaveRequest
android.service.carrier.CarrierIdentifier
android.service.carrier.CarrierIdentifier$1
android.service.carrier.ICarrierService
android.service.carrier.ICarrierService$Stub
android.service.carrier.ICarrierService$Stub$Proxy
-android.service.chooser.ChooserTarget
-android.service.chooser.ChooserTargetService
android.service.dreams.DreamManagerInternal
-android.service.dreams.DreamService
-android.service.dreams.DreamService$1
-android.service.dreams.DreamService$DreamServiceWrapper
-android.service.dreams.DreamService$DreamServiceWrapper$1
-android.service.dreams.DreamService$DreamServiceWrapper$2
-android.service.dreams.DreamService$DreamServiceWrapper$3
android.service.dreams.IDreamManager
android.service.dreams.IDreamManager$Stub
android.service.dreams.IDreamManager$Stub$Proxy
-android.service.dreams.IDreamService
-android.service.dreams.IDreamService$Stub
-android.service.dreams.IDreamService$Stub$Proxy
android.service.gatekeeper.IGateKeeperService
android.service.gatekeeper.IGateKeeperService$Stub
android.service.gatekeeper.IGateKeeperService$Stub$Proxy
@@ -3720,14 +3685,6 @@
android.service.media.IMediaBrowserService$Stub$Proxy
android.service.media.IMediaBrowserServiceCallbacks
android.service.media.IMediaBrowserServiceCallbacks$Stub
-android.service.media.IMediaBrowserServiceCallbacks$Stub$Proxy
-android.service.media.MediaBrowserService
-android.service.media.MediaBrowserService$1
-android.service.media.MediaBrowserService$BrowserRoot
-android.service.media.MediaBrowserService$ConnectionRecord
-android.service.media.MediaBrowserService$Result
-android.service.media.MediaBrowserService$ServiceBinder
-android.service.media.MediaBrowserService$ServiceBinder$1
android.service.notification.Adjustment
android.service.notification.Condition
android.service.notification.Condition$1
@@ -3738,7 +3695,6 @@
android.service.notification.IConditionListener$Stub
android.service.notification.IConditionProvider
android.service.notification.IConditionProvider$Stub
-android.service.notification.IConditionProvider$Stub$Proxy
android.service.notification.INotificationListener
android.service.notification.INotificationListener$Stub
android.service.notification.INotificationListener$Stub$Proxy
@@ -3762,21 +3718,18 @@
android.service.notification.ZenModeConfig$ScheduleInfo
android.service.notification.ZenModeConfig$ZenRule
android.service.notification.ZenModeConfig$ZenRule$1
+android.service.oemlock.IOemLockService
+android.service.oemlock.IOemLockService$Stub
+android.service.oemlock.OemLockManager
android.service.persistentdata.IPersistentDataBlockService
android.service.persistentdata.IPersistentDataBlockService$Stub
android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
android.service.persistentdata.PersistentDataBlockManager
android.service.quicksettings.IQSService
android.service.quicksettings.IQSService$Stub
-android.service.quicksettings.IQSTileService
android.service.quicksettings.Tile
-android.service.quicksettings.Tile$1
-android.service.quicksettings.TileService
android.service.textservice.SpellCheckerService
android.service.textservice.SpellCheckerService$InternalISpellCheckerSession
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceTextInfoParams
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceWordItem
android.service.textservice.SpellCheckerService$Session
android.service.textservice.SpellCheckerService$SpellCheckerServiceBinder
android.service.voice.AlwaysOnHotwordDetector
@@ -3789,33 +3742,13 @@
android.service.voice.IVoiceInteractionService$Stub
android.service.voice.IVoiceInteractionService$Stub$Proxy
android.service.voice.IVoiceInteractionSession
-android.service.voice.IVoiceInteractionSession$Stub
-android.service.voice.IVoiceInteractionSession$Stub$Proxy
-android.service.voice.IVoiceInteractionSessionService
-android.service.voice.IVoiceInteractionSessionService$Stub
-android.service.voice.IVoiceInteractionSessionService$Stub$Proxy
android.service.voice.VoiceInteractionManagerInternal
android.service.voice.VoiceInteractionService
android.service.voice.VoiceInteractionService$1
android.service.voice.VoiceInteractionService$MyHandler
android.service.voice.VoiceInteractionServiceInfo
-android.service.voice.VoiceInteractionSession
-android.service.voice.VoiceInteractionSession$1
-android.service.voice.VoiceInteractionSession$2
-android.service.voice.VoiceInteractionSession$2$1
-android.service.voice.VoiceInteractionSession$3
-android.service.voice.VoiceInteractionSession$4
-android.service.voice.VoiceInteractionSession$AbortVoiceRequest
-android.service.voice.VoiceInteractionSession$CommandRequest
-android.service.voice.VoiceInteractionSession$CompleteVoiceRequest
-android.service.voice.VoiceInteractionSession$ConfirmationRequest
-android.service.voice.VoiceInteractionSession$Insets
-android.service.voice.VoiceInteractionSession$MyCallbacks
-android.service.voice.VoiceInteractionSession$PickOptionRequest
-android.service.voice.VoiceInteractionSession$Request
-android.service.voice.VoiceInteractionSessionService
-android.service.voice.VoiceInteractionSessionService$1
-android.service.voice.VoiceInteractionSessionService$2
+android.service.vr.IPersistentVrStateCallbacks
+android.service.vr.IPersistentVrStateCallbacks$Stub
android.service.vr.IVrManager
android.service.vr.IVrManager$Stub
android.service.vr.IVrManager$Stub$Proxy
@@ -3840,10 +3773,13 @@
android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper
android.service.wallpaper.WallpaperService$IWallpaperServiceWrapper
android.service.wallpaper.WallpaperService$WallpaperCommand
-android.speech.RecognitionService
android.speech.SpeechRecognizer
+android.speech.tts.AbstractEventLogger
+android.speech.tts.AbstractSynthesisCallback
android.speech.tts.AudioPlaybackHandler
android.speech.tts.AudioPlaybackHandler$MessageLoop
+android.speech.tts.EventLogger
+android.speech.tts.FileSynthesisCallback
android.speech.tts.ITextToSpeechCallback
android.speech.tts.ITextToSpeechCallback$Stub
android.speech.tts.ITextToSpeechCallback$Stub$Proxy
@@ -3855,6 +3791,7 @@
android.speech.tts.TextToSpeech
android.speech.tts.TextToSpeech$10
android.speech.tts.TextToSpeech$16
+android.speech.tts.TextToSpeech$17
android.speech.tts.TextToSpeech$7
android.speech.tts.TextToSpeech$Action
android.speech.tts.TextToSpeech$Connection
@@ -3865,13 +3802,19 @@
android.speech.tts.TextToSpeechService
android.speech.tts.TextToSpeechService$1
android.speech.tts.TextToSpeechService$CallbackMap
+android.speech.tts.TextToSpeechService$SpeechItem
android.speech.tts.TextToSpeechService$SynthHandler
+android.speech.tts.TextToSpeechService$SynthHandler$1
android.speech.tts.TextToSpeechService$SynthHandler$2
android.speech.tts.TextToSpeechService$SynthThread
+android.speech.tts.TextToSpeechService$SynthesisSpeechItem
+android.speech.tts.TextToSpeechService$SynthesisToFileOutputStreamSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceProgressDispatcher
+android.speech.tts.TextToSpeechService$UtteranceSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceSpeechItemWithParams
android.speech.tts.TtsEngines
android.speech.tts.TtsEngines$EngineInfoComparator
android.speech.tts.UtteranceProgressListener
-android.speech.tts.Voice
android.system.ErrnoException
android.system.GaiException
android.system.NetlinkSocketAddress
@@ -3882,6 +3825,7 @@
android.system.StructFlock
android.system.StructGroupReq
android.system.StructGroupSourceReq
+android.system.StructIcmpHdr
android.system.StructIfaddrs
android.system.StructLinger
android.system.StructPasswd
@@ -3892,19 +3836,9 @@
android.system.StructUcred
android.system.StructUtsname
android.system.UnixSocketAddress
-android.telecom.-$Lambda$3$afyb_ODGzn3xMew6fjs8ANSIdVo
-android.telecom.AudioState
-android.telecom.AudioState$1
-android.telecom.Call
-android.telecom.Call$1
-android.telecom.Call$4
-android.telecom.Call$8
-android.telecom.Call$Callback
-android.telecom.Call$Details
-android.telecom.Call$Listener
+android.telecom.-$Lambda$afyb_ODGzn3xMew6fjs8ANSIdVo
android.telecom.CallAudioState
android.telecom.CallAudioState$1
-android.telecom.CallbackRecord
android.telecom.Conference
android.telecom.Conference$Listener
android.telecom.Conferenceable
@@ -3915,6 +3849,7 @@
android.telecom.Connection$Listener
android.telecom.ConnectionRequest
android.telecom.ConnectionRequest$1
+android.telecom.ConnectionRequest$Builder
android.telecom.ConnectionService
android.telecom.ConnectionService$1
android.telecom.ConnectionService$2
@@ -3927,18 +3862,11 @@
android.telecom.DefaultDialerManager
android.telecom.DisconnectCause
android.telecom.DisconnectCause$1
-android.telecom.GatewayInfo
-android.telecom.InCallAdapter
-android.telecom.InCallService
-android.telecom.InCallService$1
-android.telecom.InCallService$2
-android.telecom.InCallService$InCallServiceBinder
-android.telecom.InCallService$VideoCall
android.telecom.Log
android.telecom.Log$1
-android.telecom.Logging.-$Lambda$2$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$35$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$47$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$1
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$2
android.telecom.Logging.EventManager
android.telecom.Logging.EventManager$Event
android.telecom.Logging.EventManager$EventListener
@@ -3960,8 +3888,6 @@
android.telecom.ParcelableConference
android.telecom.ParcelableConnection
android.telecom.ParcelableConnection$1
-android.telecom.Phone
-android.telecom.Phone$Listener
android.telecom.PhoneAccount
android.telecom.PhoneAccount$1
android.telecom.PhoneAccount$Builder
@@ -3970,17 +3896,10 @@
android.telecom.RemoteConnectionManager
android.telecom.StatusHints
android.telecom.TelecomAnalytics
-android.telecom.TelecomAnalytics$SessionTiming
-android.telecom.TelecomAnalytics$SessionTiming$1
android.telecom.TelecomManager
-android.telecom.TimedEvent
android.telecom.VideoProfile
android.telecom.VideoProfile$1
android.telephony.CarrierConfigManager
-android.telephony.CellBroadcastMessage
-android.telephony.CellIdentityCdma
-android.telephony.CellIdentityGsm
-android.telephony.CellIdentityLte
android.telephony.CellIdentityWcdma
android.telephony.CellIdentityWcdma$1
android.telephony.CellInfo
@@ -3992,9 +3911,6 @@
android.telephony.CellInfoWcdma$1
android.telephony.CellLocation
android.telephony.CellSignalStrength
-android.telephony.CellSignalStrengthCdma
-android.telephony.CellSignalStrengthGsm
-android.telephony.CellSignalStrengthLte
android.telephony.CellSignalStrengthWcdma
android.telephony.CellSignalStrengthWcdma$1
android.telephony.ClientRequestStats
@@ -4002,7 +3918,6 @@
android.telephony.DisconnectCause
android.telephony.IccOpenLogicalChannelResponse
android.telephony.ModemActivityInfo
-android.telephony.ModemActivityInfo$1
android.telephony.PhoneNumberFormattingTextWatcher
android.telephony.PhoneNumberUtils
android.telephony.PhoneStateListener
@@ -4020,7 +3935,6 @@
android.telephony.SignalStrength$1
android.telephony.SmsManager
android.telephony.SmsMessage
-android.telephony.SmsMessage$MessageClass
android.telephony.SubscriptionInfo
android.telephony.SubscriptionInfo$1
android.telephony.SubscriptionManager
@@ -4034,10 +3948,14 @@
android.telephony.VisualVoicemailSmsFilterSettings
android.telephony.VoLteServiceState
android.telephony.VoLteServiceState$1
-android.telephony.cdma.CdmaCellLocation
-android.telephony.cdma.CdmaSmsCbProgramData
android.telephony.gsm.GsmCellLocation
-android.telephony.gsm.SmsMessage
+android.telephony.ims.ImsServiceProxy$INotifyStatusChanged
+android.telephony.ims.ImsServiceProxyCompat
+android.telephony.ims.feature.IMMTelFeature
+android.telephony.ims.stub.ImsConfigImplBase
+android.telephony.ims.stub.ImsEcbmImplBase
+android.telephony.ims.stub.ImsUtImplBase
+android.telephony.ims.stub.ImsUtListenerImplBase
android.text.AndroidBidi
android.text.AndroidCharacter
android.text.Annotation
@@ -4052,27 +3970,19 @@
android.text.Editable
android.text.Editable$Factory
android.text.FontConfig
-android.text.FontConfig$1
android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
android.text.FontConfig$Family
-android.text.FontConfig$Family$1
android.text.FontConfig$Font
-android.text.FontConfig$Font$1
android.text.GetChars
android.text.GraphicsOperations
android.text.Html
android.text.Html$HtmlParser
-android.text.Html$ImageGetter
android.text.Html$TagHandler
android.text.HtmlToSpannedConverter
android.text.HtmlToSpannedConverter$Bold
android.text.HtmlToSpannedConverter$Href
android.text.Hyphenator
-android.text.ITextClassificationService
-android.text.ITextClassificationService$Stub
+android.text.Hyphenator$HyphenationData
android.text.InputFilter
android.text.InputFilter$LengthFilter
android.text.InputType
@@ -4153,10 +4063,8 @@
android.text.method.TransformationMethod
android.text.method.TransformationMethod2
android.text.method.WordIterator
-android.text.style.AbsoluteSizeSpan
android.text.style.AlignmentSpan
android.text.style.BackgroundColorSpan
-android.text.style.BulletSpan
android.text.style.CharacterStyle
android.text.style.CharacterStyle$Passthrough
android.text.style.ClickableSpan
@@ -4178,17 +4086,14 @@
android.text.style.SpellCheckSpan
android.text.style.StrikethroughSpan
android.text.style.StyleSpan
-android.text.style.SubscriptSpan
android.text.style.SuggestionSpan
-android.text.style.SuperscriptSpan
android.text.style.TabStopSpan
android.text.style.TextAppearanceSpan
android.text.style.TtsSpan
android.text.style.TtsSpan$Builder
-android.text.style.TtsSpan$DigitsBuilder
android.text.style.TtsSpan$SemioticClassBuilder
android.text.style.TtsSpan$TelephoneBuilder
-android.text.style.TtsSpan$TextBuilder
+android.text.style.TtsSpan$VerbatimBuilder
android.text.style.TypefaceSpan
android.text.style.URLSpan
android.text.style.UnderlineSpan
@@ -4204,6 +4109,7 @@
android.text.util.Linkify$TransformFilter
android.text.util.Rfc822Token
android.text.util.Rfc822Tokenizer
+android.transition.ArcMotion
android.transition.AutoTransition
android.transition.ChangeBounds
android.transition.ChangeBounds$1
@@ -4212,9 +4118,7 @@
android.transition.ChangeBounds$4
android.transition.ChangeBounds$5
android.transition.ChangeBounds$6
-android.transition.ChangeBounds$7
android.transition.ChangeBounds$9
-android.transition.ChangeBounds$ViewBounds
android.transition.ChangeClipBounds
android.transition.ChangeImageTransform
android.transition.ChangeImageTransform$1
@@ -4226,6 +4130,8 @@
android.transition.ChangeTransform$GhostListener
android.transition.ChangeTransform$PathAnimatorMatrix
android.transition.ChangeTransform$Transforms
+android.transition.CircularPropagation
+android.transition.Explode
android.transition.Fade
android.transition.Fade$1
android.transition.Fade$FadeAnimatorListener
@@ -4247,25 +4153,22 @@
android.transition.Transition$2
android.transition.Transition$3
android.transition.Transition$AnimationInfo
+android.transition.Transition$ArrayListManager
android.transition.Transition$EpicenterCallback
android.transition.Transition$TransitionListener
-android.transition.Transition$TransitionListenerAdapter
android.transition.TransitionInflater
+android.transition.TransitionListenerAdapter
android.transition.TransitionManager
android.transition.TransitionManager$MultiListener
android.transition.TransitionManager$MultiListener$1
android.transition.TransitionPropagation
android.transition.TransitionSet
-android.transition.TransitionSet$1
android.transition.TransitionSet$TransitionSetListener
android.transition.TransitionUtils
android.transition.TransitionValues
android.transition.TransitionValuesMaps
-android.transition.TranslationAnimationCreator
-android.transition.TranslationAnimationCreator$TransitionPositionListener
android.transition.Visibility
android.transition.Visibility$1
-android.transition.Visibility$DisappearListener
android.transition.Visibility$VisibilityInfo
android.transition.VisibilityPropagation
android.util.AndroidException
@@ -4281,6 +4184,7 @@
android.util.Base64$Decoder
android.util.Base64$Encoder
android.util.BootTimingsTraceLog
+android.util.ByteStringUtils
android.util.ContainerHelpers
android.util.DebugUtils
android.util.DisplayMetrics
@@ -4289,6 +4193,7 @@
android.util.FastImmutableArraySet
android.util.FastImmutableArraySet$FastIterator
android.util.FloatProperty
+android.util.IconDrawableFactory
android.util.IntArray
android.util.IntProperty
android.util.JsonReader
@@ -4296,19 +4201,21 @@
android.util.JsonToken
android.util.JsonWriter
android.util.KeyValueListParser
+android.util.LauncherIcons
+android.util.LauncherIcons$ShadowDrawable
+android.util.LauncherIcons$ShadowDrawable$MyConstantState
android.util.LocalLog
android.util.LocalLog$ReadOnlyLocalLog
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
-android.util.Log$NoPreloadHolder
+android.util.Log$TerribleFailure
android.util.Log$TerribleFailureHandler
android.util.LogPrinter
android.util.LongArray
android.util.LongSparseArray
android.util.LongSparseLongArray
android.util.LruCache
-android.util.MalformedJsonException
android.util.MapCollections
android.util.MapCollections$ArrayIterator
android.util.MapCollections$EntrySet
@@ -4318,6 +4225,8 @@
android.util.MathUtils
android.util.MemoryIntArray
android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
android.util.MutableBoolean
android.util.MutableInt
android.util.MutableLong
@@ -4329,7 +4238,6 @@
android.util.Pools$Pool
android.util.Pools$SimplePool
android.util.Pools$SynchronizedPool
-android.util.PrintWriterPrinter
android.util.Printer
android.util.Property
android.util.Range
@@ -4354,20 +4262,28 @@
android.util.TrustedTime
android.util.TypedValue
android.util.Xml
-android.util.Xml$Encoding
android.util.Xml$XmlSerializerFactory
+android.util.XmlPullAttributes
android.util.apk.ApkSignatureSchemeV2Verifier
-android.util.apk.ApkSignatureSchemeV2Verifier$ByteBufferDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$DataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$MemoryMappedFileDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$SignatureInfo
android.util.apk.ApkSignatureSchemeV2Verifier$SignatureNotFoundException
-android.util.apk.ApkSignatureSchemeV2Verifier$VerbatimX509Certificate
-android.util.apk.ApkSignatureSchemeV2Verifier$WrappedX509Certificate
android.util.apk.ZipUtils
android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.util.jar.StrictJarFile$EntryIterator
+android.util.jar.StrictJarFile$FDStream
+android.util.jar.StrictJarFile$JarFileInputStream
+android.util.jar.StrictJarFile$ZipInflaterInputStream
+android.util.jar.StrictJarManifest
+android.util.jar.StrictJarManifest$Chunk
+android.util.jar.StrictJarManifestReader
+android.util.jar.StrictJarVerifier
+android.util.jar.StrictJarVerifier$VerifierEntry
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$P6MTGFSudLpwrqb6oVD8FdorW1c
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
android.view.AbsSavedState
android.view.AbsSavedState$1
android.view.AbsSavedState$2
@@ -4386,7 +4302,6 @@
android.view.Choreographer$FrameCallback
android.view.Choreographer$FrameDisplayEventReceiver
android.view.Choreographer$FrameHandler
-android.view.CollapsibleActionView
android.view.ContextMenu
android.view.ContextMenu$ContextMenuInfo
android.view.ContextThemeWrapper
@@ -4400,12 +4315,13 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
-android.view.DragAndDropPermissions
android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
android.view.FrameInfo
android.view.FrameMetrics
android.view.FrameMetricsObserver
@@ -4432,6 +4348,9 @@
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
+android.view.IGraphicsStatsCallback$Stub$Proxy
android.view.IInputFilter
android.view.IOnKeyguardExitResult
android.view.IPinnedStackController
@@ -4477,11 +4396,14 @@
android.view.KeyCharacterMap
android.view.KeyCharacterMap$1
android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
android.view.KeyEvent
android.view.KeyEvent$1
android.view.KeyEvent$Callback
android.view.KeyEvent$DispatcherState
+android.view.KeyboardShortcutGroup
+android.view.KeyboardShortcutGroup$1
+android.view.KeyboardShortcutInfo
+android.view.KeyboardShortcutInfo$1
android.view.LayoutInflater
android.view.LayoutInflater$Factory
android.view.LayoutInflater$Factory2
@@ -4500,7 +4422,6 @@
android.view.MotionEvent$PointerProperties
android.view.NotificationHeaderView
android.view.NotificationHeaderView$1
-android.view.NotificationHeaderView$2
android.view.NotificationHeaderView$HeaderTouchListener
android.view.OrientationEventListener
android.view.OrientationEventListener$SensorEventListenerImpl
@@ -4512,19 +4433,16 @@
android.view.RenderNode$NoImagePreloadHolder
android.view.RenderNodeAnimator
android.view.RenderNodeAnimator$1
-android.view.RenderNodeAnimator$DelayedAnimationHelper
android.view.RenderNodeAnimatorSetHelper
android.view.ScaleGestureDetector
android.view.ScaleGestureDetector$1
android.view.ScaleGestureDetector$OnScaleGestureListener
android.view.ScaleGestureDetector$SimpleOnScaleGestureListener
android.view.SearchEvent
-android.view.SoundEffectConstants
android.view.SubMenu
android.view.Surface
android.view.Surface$1
android.view.Surface$CompatibleCanvas
-android.view.Surface$HwuiContext
android.view.Surface$OutOfResourcesException
android.view.SurfaceControl
android.view.SurfaceControl$PhysicalDisplayInfo
@@ -4537,13 +4455,13 @@
android.view.SurfaceView$2
android.view.SurfaceView$3
android.view.SurfaceView$4
-android.view.SurfaceView$MyWindow
android.view.TextureView
android.view.TextureView$1
android.view.TextureView$SurfaceTextureListener
android.view.ThreadedRenderer
android.view.ThreadedRenderer$DrawCallbacks
android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
android.view.TouchDelegate
android.view.VelocityTracker
android.view.VelocityTracker$Estimator
@@ -4563,13 +4481,11 @@
android.view.View$AccessibilityDelegate
android.view.View$AttachInfo
android.view.View$AttachInfo$Callbacks
-android.view.View$AttachInfo$InvalidateInfo
android.view.View$BaseSavedState
android.view.View$BaseSavedState$1
android.view.View$CheckForLongPress
android.view.View$CheckForTap
android.view.View$DeclaredOnClickListener
-android.view.View$DragShadowBuilder
android.view.View$ForegroundInfo
android.view.View$ListenerInfo
android.view.View$MatchIdPredicate
@@ -4585,6 +4501,7 @@
android.view.View$OnKeyListener
android.view.View$OnLayoutChangeListener
android.view.View$OnLongClickListener
+android.view.View$OnScrollChangeListener
android.view.View$OnSystemUiVisibilityChangeListener
android.view.View$OnTouchListener
android.view.View$PerformClick
@@ -4593,6 +4510,7 @@
android.view.View$TooltipInfo
android.view.View$TransformationInfo
android.view.View$UnsetPressedState
+android.view.View$VisibilityChangeForAutofillHandler
android.view.ViewAnimationUtils
android.view.ViewConfiguration
android.view.ViewDebug$CapturedViewProperty
@@ -4603,6 +4521,7 @@
android.view.ViewGroup$2
android.view.ViewGroup$3
android.view.ViewGroup$4
+android.view.ViewGroup$ChildListForAutoFill
android.view.ViewGroup$LayoutParams
android.view.ViewGroup$MarginLayoutParams
android.view.ViewGroup$OnHierarchyChangeListener
@@ -4628,7 +4547,9 @@
android.view.ViewRootImpl$2
android.view.ViewRootImpl$4
android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
android.view.ViewRootImpl$ConsumeBatchedInputRunnable
android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -4653,9 +4574,12 @@
android.view.ViewRootImpl$ViewRootHandler
android.view.ViewRootImpl$W
android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
android.view.ViewStructure
+android.view.ViewStructure$HtmlInfo
android.view.ViewStub
android.view.ViewStub$OnInflateListener
+android.view.ViewStub$ViewReplaceRunnable
android.view.ViewTreeObserver
android.view.ViewTreeObserver$CopyOnWriteArray
android.view.ViewTreeObserver$CopyOnWriteArray$Access
@@ -4701,24 +4625,23 @@
android.view.WindowManagerPolicy$InputConsumer
android.view.WindowManagerPolicy$OnKeyguardExitResult
android.view.WindowManagerPolicy$PointerEventListener
+android.view.WindowManagerPolicy$ScreenOffListener
android.view.WindowManagerPolicy$ScreenOnListener
android.view.WindowManagerPolicy$StartingSurface
android.view.WindowManagerPolicy$WindowManagerFuncs
android.view.WindowManagerPolicy$WindowState
android.view.accessibility.AccessibilityEvent
+android.view.accessibility.AccessibilityEvent$1
android.view.accessibility.AccessibilityEventSource
android.view.accessibility.AccessibilityManager
android.view.accessibility.AccessibilityManager$1
android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener
android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
android.view.accessibility.AccessibilityNodeInfo
-android.view.accessibility.AccessibilityNodeInfo$1
android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
-android.view.accessibility.AccessibilityNodeInfo$CollectionInfo
-android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo
android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
android.view.accessibility.CaptioningManager
@@ -4727,6 +4650,9 @@
android.view.accessibility.CaptioningManager$CaptioningChangeListener
android.view.accessibility.CaptioningManager$MyContentObserver
android.view.accessibility.IAccessibilityInteractionConnection
+android.view.accessibility.IAccessibilityInteractionConnection$Stub
+android.view.accessibility.IAccessibilityInteractionConnection$Stub$Proxy
+android.view.accessibility.IAccessibilityInteractionConnectionCallback
android.view.accessibility.IAccessibilityManager
android.view.accessibility.IAccessibilityManager$Stub
android.view.accessibility.IAccessibilityManager$Stub$Proxy
@@ -4758,15 +4684,24 @@
android.view.animation.LinearInterpolator
android.view.animation.OvershootInterpolator
android.view.animation.PathInterpolator
-android.view.animation.RotateAnimation
android.view.animation.ScaleAnimation
android.view.animation.Transformation
android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillId
-android.view.autofill.AutoFillId$1
-android.view.autofill.AutoFillManager
-android.view.autofill.AutoFillType
-android.view.autofill.AutoFillType$1
+android.view.autofill.AutofillId
+android.view.autofill.AutofillId$1
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.AutofillValue
+android.view.autofill.AutofillValue$1
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutoFillManagerClient$Stub$Proxy
+android.view.autofill.IAutofillWindowPresenter
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.CompletionInfo
android.view.inputmethod.CompletionInfo$1
@@ -4806,9 +4741,9 @@
android.view.inputmethod.InputMethodSubtype$InputMethodSubtypeBuilder
android.view.inputmethod.InputMethodSubtypeArray
android.view.textclassifier.TextClassificationManager
-android.view.textclassifier.TextLanguage
-android.view.textservice.SentenceSuggestionsInfo
-android.view.textservice.SentenceSuggestionsInfo$1
+android.view.textclassifier.TextClassifier
+android.view.textclassifier.TextClassifier$1
+android.view.textclassifier.TextClassifierImpl
android.view.textservice.SpellCheckerInfo
android.view.textservice.SpellCheckerInfo$1
android.view.textservice.SpellCheckerSession
@@ -4820,9 +4755,7 @@
android.view.textservice.SpellCheckerSubtype
android.view.textservice.SpellCheckerSubtype$1
android.view.textservice.SuggestionsInfo
-android.view.textservice.SuggestionsInfo$1
android.view.textservice.TextInfo
-android.view.textservice.TextInfo$1
android.view.textservice.TextServicesManager
android.webkit.ConsoleMessage
android.webkit.ConsoleMessage$MessageLevel
@@ -4830,18 +4763,14 @@
android.webkit.CookieSyncManager
android.webkit.DownloadListener
android.webkit.GeolocationPermissions
-android.webkit.GeolocationPermissions$Callback
android.webkit.IWebViewUpdateService
android.webkit.IWebViewUpdateService$Stub
android.webkit.IWebViewUpdateService$Stub$Proxy
android.webkit.JavascriptInterface
-android.webkit.JsPromptResult
-android.webkit.JsResult
android.webkit.MimeTypeMap
android.webkit.ServiceWorkerClient
android.webkit.ServiceWorkerController
android.webkit.ServiceWorkerWebSettings
-android.webkit.SslErrorHandler
android.webkit.TokenBindingService
android.webkit.URLUtil
android.webkit.UserPackage
@@ -4849,19 +4778,16 @@
android.webkit.WebBackForwardList
android.webkit.WebChromeClient
android.webkit.WebChromeClient$CustomViewCallback
-android.webkit.WebHistoryItem
android.webkit.WebIconDatabase
android.webkit.WebMessage
android.webkit.WebMessagePort
android.webkit.WebResourceRequest
-android.webkit.WebResourceResponse
android.webkit.WebSettings
android.webkit.WebSettings$LayoutAlgorithm
android.webkit.WebSettings$PluginState
android.webkit.WebSettings$RenderPriority
android.webkit.WebSettings$ZoomDensity
android.webkit.WebStorage
-android.webkit.WebStorage$QuotaUpdater
android.webkit.WebSyncManager
android.webkit.WebView
android.webkit.WebView$FindListener
@@ -4880,7 +4806,6 @@
android.webkit.WebViewFactory$RelroFileCreator
android.webkit.WebViewFactoryProvider
android.webkit.WebViewFactoryProvider$Statics
-android.webkit.WebViewFragment
android.webkit.WebViewProvider
android.webkit.WebViewProvider$ScrollDelegate
android.webkit.WebViewProvider$ViewDelegate
@@ -4889,23 +4814,22 @@
android.webkit.WebViewProviderResponse
android.webkit.WebViewProviderResponse$1
android.webkit.WebViewZygote
-android.widget.-$Lambda$50$tfOQKOmkDz_xLYaBQX_cysn8vbE
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$1
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$2
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$3
+android.widget.-$Lambda$tfOQKOmkDz_xLYaBQX_cysn8vbE
android.widget.AbsListView
android.widget.AbsListView$3
-android.widget.AbsListView$4
-android.widget.AbsListView$AbsPositionScroller
android.widget.AbsListView$AdapterDataSetObserver
android.widget.AbsListView$CheckForTap
android.widget.AbsListView$FlingRunnable
android.widget.AbsListView$FlingRunnable$1
-android.widget.AbsListView$InputConnectionWrapper
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$MultiChoiceModeListener
android.widget.AbsListView$MultiChoiceModeWrapper
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$PerformClick
-android.widget.AbsListView$PositionScroller
-android.widget.AbsListView$PositionScroller$1
android.widget.AbsListView$RecycleBin
android.widget.AbsListView$RecyclerListener
android.widget.AbsListView$SavedState
@@ -4915,20 +4839,14 @@
android.widget.AbsSeekBar
android.widget.AbsSpinner
android.widget.AbsSpinner$RecycleBin
-android.widget.AbsSpinner$SavedState
-android.widget.AbsSpinner$SavedState$1
android.widget.AbsoluteLayout
android.widget.ActionMenuPresenter
android.widget.ActionMenuPresenter$1
android.widget.ActionMenuPresenter$2
android.widget.ActionMenuPresenter$ActionMenuPopupCallback
-android.widget.ActionMenuPresenter$OpenOverflowRunnable
android.widget.ActionMenuPresenter$OverflowMenuButton
android.widget.ActionMenuPresenter$OverflowMenuButton$1
-android.widget.ActionMenuPresenter$OverflowPopup
android.widget.ActionMenuPresenter$PopupPresenterCallback
-android.widget.ActionMenuPresenter$SavedState
-android.widget.ActionMenuPresenter$SavedState$1
android.widget.ActionMenuView
android.widget.ActionMenuView$ActionMenuChildView
android.widget.ActionMenuView$ActionMenuPresenterCallback
@@ -4937,7 +4855,6 @@
android.widget.ActionMenuView$OnMenuItemClickListener
android.widget.Adapter
android.widget.AdapterView
-android.widget.AdapterView$AdapterContextMenuInfo
android.widget.AdapterView$AdapterDataSetObserver
android.widget.AdapterView$OnItemClickListener
android.widget.AdapterView$OnItemLongClickListener
@@ -4960,11 +4877,9 @@
android.widget.Chronometer$1
android.widget.CompoundButton
android.widget.CompoundButton$OnCheckedChangeListener
-android.widget.CompoundButton$SavedState
-android.widget.CompoundButton$SavedState$1
android.widget.CursorAdapter
android.widget.CursorFilter$CursorFilterClient
-android.widget.DatePicker$OnDateChangedListener
+android.widget.DatePicker
android.widget.DateTimeView
android.widget.DateTimeView$ReceiverInfo
android.widget.DateTimeView$ReceiverInfo$1
@@ -4988,7 +4903,6 @@
android.widget.Editor$InsertionPointCursorController
android.widget.Editor$PositionListener
android.widget.Editor$ProcessTextIntentActionsHandler
-android.widget.Editor$SelectionHandleView
android.widget.Editor$SelectionModifierCursorController
android.widget.Editor$SpanController
android.widget.Editor$SuggestionHelper
@@ -5010,11 +4924,8 @@
android.widget.Filter$RequestArguments
android.widget.Filter$RequestHandler
android.widget.Filter$ResultsHandler
-android.widget.FilterQueryProvider
android.widget.Filterable
android.widget.ForwardingListener
-android.widget.ForwardingListener$DisallowIntercept
-android.widget.ForwardingListener$TriggerLongPress
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
android.widget.GridLayout
@@ -5045,6 +4956,7 @@
android.widget.HorizontalScrollView$SavedState$1
android.widget.ImageButton
android.widget.ImageView
+android.widget.ImageView$ImageDrawableCallback
android.widget.ImageView$ScaleType
android.widget.LinearLayout
android.widget.LinearLayout$LayoutParams
@@ -5061,18 +4973,7 @@
android.widget.ListView$ArrowScrollFocusResult
android.widget.ListView$FixedViewInfo
android.widget.MediaController
-android.widget.MediaController$1
-android.widget.MediaController$2
-android.widget.MediaController$3
-android.widget.MediaController$4
-android.widget.MediaController$5
-android.widget.MediaController$6
-android.widget.MediaController$7
-android.widget.MediaController$8
android.widget.MediaController$MediaPlayerControl
-android.widget.MenuItemHoverListener
-android.widget.MenuPopupWindow
-android.widget.MenuPopupWindow$MenuDropDownListView
android.widget.MultiAutoCompleteTextView
android.widget.MultiAutoCompleteTextView$Tokenizer
android.widget.NumberPicker
@@ -5084,20 +4985,14 @@
android.widget.PopupMenu$1
android.widget.PopupMenu$2
android.widget.PopupMenu$3
-android.widget.PopupMenu$OnDismissListener
android.widget.PopupMenu$OnMenuItemClickListener
android.widget.PopupWindow
android.widget.PopupWindow$1
android.widget.PopupWindow$2
-android.widget.PopupWindow$3
android.widget.PopupWindow$OnDismissListener
android.widget.PopupWindow$PopupBackgroundView
android.widget.PopupWindow$PopupDecorView
android.widget.PopupWindow$PopupDecorView$1
-android.widget.PopupWindow$PopupDecorView$2
-android.widget.PopupWindow$PopupDecorView$2$1
-android.widget.PopupWindow$PopupDecorView$3
-android.widget.PopupWindow$PopupDecorView$4
android.widget.ProgressBar
android.widget.ProgressBar$1
android.widget.ProgressBar$ProgressTintInfo
@@ -5122,25 +5017,30 @@
android.widget.RemoteViews$1
android.widget.RemoteViews$2
android.widget.RemoteViews$3
-android.widget.RemoteViews$4
android.widget.RemoteViews$Action
android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$AsyncApplyTask
android.widget.RemoteViews$BitmapCache
android.widget.RemoteViews$BitmapReflectionAction
android.widget.RemoteViews$LayoutParamAction
android.widget.RemoteViews$MemoryUsageCounter
android.widget.RemoteViews$MutablePair
android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$OnViewAppliedListener
android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RemoteViewsContextWrapper
+android.widget.RemoteViews$RunnableAction
android.widget.RemoteViews$RuntimeAction
android.widget.RemoteViews$SetDrawableParameters
android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViews$SetOnClickPendingIntent$1
android.widget.RemoteViews$ViewGroupAction
+android.widget.RemoteViews$ViewGroupAction$1
+android.widget.RemoteViews$ViewGroupAction$2
+android.widget.RemoteViews$ViewPaddingAction
+android.widget.RemoteViews$ViewTree
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RemoteViewsService
-android.widget.RemoteViewsService$RemoteViewsFactory
android.widget.ResourceCursorAdapter
android.widget.RtlSpacingHelper
android.widget.ScrollBarDrawable
@@ -5149,37 +5049,23 @@
android.widget.ScrollView$SavedState$1
android.widget.Scroller
android.widget.Scroller$ViscousFluidInterpolator
-android.widget.SearchView
-android.widget.SearchView$1
-android.widget.SearchView$10
-android.widget.SearchView$11
-android.widget.SearchView$2
-android.widget.SearchView$3
-android.widget.SearchView$4
-android.widget.SearchView$5
-android.widget.SearchView$6
-android.widget.SearchView$7
-android.widget.SearchView$8
-android.widget.SearchView$9
android.widget.SearchView$OnCloseListener
-android.widget.SearchView$OnQueryTextListener
-android.widget.SearchView$SearchAutoComplete
-android.widget.SearchView$UpdatableTouchDelegate
android.widget.SectionIndexer
android.widget.SeekBar
android.widget.SeekBar$OnSeekBarChangeListener
+android.widget.SelectionActionModeHelper
+android.widget.SelectionActionModeHelper$SelectionTracker
+android.widget.SelectionActionModeHelper$TextClassificationHelper
android.widget.SimpleCursorAdapter
android.widget.Space
android.widget.SpellChecker
-android.widget.SpellChecker$1
android.widget.SpellChecker$SpellParser
android.widget.Spinner
android.widget.Spinner$1
+android.widget.Spinner$DialogPopup
android.widget.Spinner$DropDownAdapter
android.widget.Spinner$DropdownPopup
android.widget.Spinner$DropdownPopup$1
-android.widget.Spinner$SavedState
-android.widget.Spinner$SavedState$1
android.widget.Spinner$SpinnerPopup
android.widget.SpinnerAdapter
android.widget.Switch
@@ -5198,11 +5084,6 @@
android.widget.TabWidget$OnTabSelectionChanged
android.widget.TabWidget$TabClickListener
android.widget.TableLayout
-android.widget.TableLayout$LayoutParams
-android.widget.TableLayout$PassThroughHierarchyChangeListener
-android.widget.TableRow
-android.widget.TableRow$ChildrenTracker
-android.widget.TableRow$LayoutParams
android.widget.TextClock
android.widget.TextClock$1
android.widget.TextClock$2
@@ -5215,6 +5096,10 @@
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
android.widget.TextView$Drawables
+android.widget.TextView$Marquee
+android.widget.TextView$Marquee$1
+android.widget.TextView$Marquee$2
+android.widget.TextView$Marquee$3
android.widget.TextView$OnEditorActionListener
android.widget.TextView$SavedState
android.widget.TextView$SavedState$1
@@ -5231,52 +5116,15 @@
android.widget.Toolbar$ExpandedActionViewMenuPresenter
android.widget.Toolbar$LayoutParams
android.widget.Toolbar$OnMenuItemClickListener
-android.widget.Toolbar$SavedState
-android.widget.Toolbar$SavedState$1
android.widget.VideoView
-android.widget.VideoView$1
-android.widget.VideoView$2
-android.widget.VideoView$3
-android.widget.VideoView$4
-android.widget.VideoView$5
-android.widget.VideoView$6
-android.widget.VideoView$7
android.widget.ViewAnimator
android.widget.ViewFlipper
android.widget.ViewFlipper$1
android.widget.ViewFlipper$2
android.widget.ViewSwitcher
android.widget.WrapperListAdapter
-android.widget.ZoomButtonsController
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
com.android.framework.protobuf.nano.CodedInputByteBufferNano
com.android.framework.protobuf.nano.CodedOutputByteBufferNano
-com.android.framework.protobuf.nano.ExtendableMessageNano
com.android.framework.protobuf.nano.InternalNano
com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException
com.android.framework.protobuf.nano.MessageNano
@@ -5316,6 +5164,7 @@
com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder
com.android.i18n.phonenumbers.prefixmapper.MappingFileProvider
com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader
+com.android.ims.-$Lambda$AvFHcs3Z6Dq6dkOugMW9Kc7Qzng$4
com.android.ims.ImsCall$Listener
com.android.ims.ImsCallForwardInfo
com.android.ims.ImsCallProfile
@@ -5330,11 +5179,8 @@
com.android.ims.ImsExternalCallStateListener
com.android.ims.ImsManager
com.android.ims.ImsManager$1
-com.android.ims.ImsManager$2
com.android.ims.ImsManager$ImsRegistrationListenerProxy
com.android.ims.ImsManager$ImsServiceDeathRecipient
-com.android.ims.ImsMultiEndpoint
-com.android.ims.ImsMultiEndpoint$ImsExternalCallStateListenerProxy
com.android.ims.ImsReasonInfo
com.android.ims.ImsReasonInfo$1
com.android.ims.ImsSsInfo
@@ -5342,80 +5188,32 @@
com.android.ims.internal.IImsCallSessionListener
com.android.ims.internal.IImsConfig
com.android.ims.internal.IImsConfig$Stub
-com.android.ims.internal.IImsConfig$Stub$Proxy
com.android.ims.internal.IImsEcbm
com.android.ims.internal.IImsEcbm$Stub
com.android.ims.internal.IImsEcbmListener
com.android.ims.internal.IImsEcbmListener$Stub
-com.android.ims.internal.IImsExternalCallStateListener
-com.android.ims.internal.IImsExternalCallStateListener$Stub
com.android.ims.internal.IImsMultiEndpoint
-com.android.ims.internal.IImsMultiEndpoint$Stub
com.android.ims.internal.IImsRegistrationListener
com.android.ims.internal.IImsRegistrationListener$Stub
-com.android.ims.internal.IImsRegistrationListener$Stub$Proxy
com.android.ims.internal.IImsService
com.android.ims.internal.IImsService$Stub
-com.android.ims.internal.IImsService$Stub$Proxy
com.android.ims.internal.IImsServiceController
com.android.ims.internal.IImsServiceFeatureListener
com.android.ims.internal.IImsUt
com.android.ims.internal.IImsUt$Stub
com.android.ims.internal.IImsUtListener
com.android.ims.internal.IImsUtListener$Stub
-com.android.ims.internal.uce.common.CapInfo
-com.android.ims.internal.uce.common.CapInfo$1
-com.android.ims.internal.uce.common.StatusCode
-com.android.ims.internal.uce.common.StatusCode$1
-com.android.ims.internal.uce.common.UceLong
-com.android.ims.internal.uce.common.UceLong$1
-com.android.ims.internal.uce.options.IOptionsListener
-com.android.ims.internal.uce.options.IOptionsService
-com.android.ims.internal.uce.presence.IPresenceListener
-com.android.ims.internal.uce.presence.IPresenceListener$Stub
-com.android.ims.internal.uce.presence.IPresenceListener$Stub$Proxy
-com.android.ims.internal.uce.presence.IPresenceService
-com.android.ims.internal.uce.presence.IPresenceService$Stub
-com.android.ims.internal.uce.presence.IPresenceService$Stub$Proxy
-com.android.ims.internal.uce.presence.PresCapInfo
-com.android.ims.internal.uce.presence.PresCmdId
-com.android.ims.internal.uce.presence.PresCmdId$1
-com.android.ims.internal.uce.presence.PresCmdStatus
-com.android.ims.internal.uce.presence.PresCmdStatus$1
-com.android.ims.internal.uce.presence.PresPublishTriggerType
-com.android.ims.internal.uce.presence.PresPublishTriggerType$1
-com.android.ims.internal.uce.presence.PresResInfo
-com.android.ims.internal.uce.presence.PresResInfo$1
-com.android.ims.internal.uce.presence.PresResInstanceInfo
-com.android.ims.internal.uce.presence.PresResInstanceInfo$1
-com.android.ims.internal.uce.presence.PresRlmiInfo
-com.android.ims.internal.uce.presence.PresRlmiInfo$1
-com.android.ims.internal.uce.presence.PresServiceInfo
-com.android.ims.internal.uce.presence.PresSipResponse
-com.android.ims.internal.uce.presence.PresSipResponse$1
-com.android.ims.internal.uce.presence.PresSubscriptionState
-com.android.ims.internal.uce.presence.PresSubscriptionState$1
-com.android.ims.internal.uce.presence.PresTupleInfo
-com.android.ims.internal.uce.presence.PresTupleInfo$1
-com.android.ims.internal.uce.uceservice.IUceListener
-com.android.ims.internal.uce.uceservice.IUceListener$Stub
-com.android.ims.internal.uce.uceservice.IUceService
-com.android.ims.internal.uce.uceservice.IUceService$Stub
-com.android.ims.internal.uce.uceservice.IUceService$Stub$Proxy
-com.android.ims.internal.uce.uceservice.ImsUceManager
-com.android.ims.internal.uce.uceservice.ImsUceManager$UceServiceDeathRecipient
com.android.internal.R$styleable
com.android.internal.alsa.AlsaCardsParser
com.android.internal.alsa.AlsaCardsParser$AlsaCardRecord
com.android.internal.alsa.AlsaDevicesParser
com.android.internal.alsa.LineTokenizer
-com.android.internal.app.AlertActivity
com.android.internal.app.AlertController
com.android.internal.app.AlertController$1
com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$3
+com.android.internal.app.AlertController$AlertParams$1
+com.android.internal.app.AlertController$AlertParams$4
com.android.internal.app.AlertController$ButtonHandler
-com.android.internal.app.AlertController$CheckedItemAdapter
com.android.internal.app.AlertController$RecycleListView
com.android.internal.app.AssistUtils
com.android.internal.app.IAppOpsCallback
@@ -5425,7 +5223,6 @@
com.android.internal.app.IAppOpsService$Stub
com.android.internal.app.IAppOpsService$Stub$Proxy
com.android.internal.app.IAssistScreenshotReceiver
-com.android.internal.app.IAssistScreenshotReceiver$Stub
com.android.internal.app.IBatteryStats
com.android.internal.app.IBatteryStats$Stub
com.android.internal.app.IBatteryStats$Stub$Proxy
@@ -5442,15 +5239,9 @@
com.android.internal.app.IVoiceInteractionSessionListener$Stub$Proxy
com.android.internal.app.IVoiceInteractionSessionShowCallback
com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub
-com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub$Proxy
com.android.internal.app.IVoiceInteractor
com.android.internal.app.IVoiceInteractor$Stub
-com.android.internal.app.IVoiceInteractor$Stub$Proxy
-com.android.internal.app.LocaleHelper
-com.android.internal.app.LocalePicker
-com.android.internal.app.LocalePickerWithRegion$LocaleSelectedListener
com.android.internal.app.NightDisplayController
-com.android.internal.app.NightDisplayController$1
com.android.internal.app.NightDisplayController$Callback
com.android.internal.app.NightDisplayController$LocalTime
com.android.internal.app.ProcessMap
@@ -5465,20 +5256,16 @@
com.android.internal.app.WindowDecorActionBar$1
com.android.internal.app.WindowDecorActionBar$2
com.android.internal.app.WindowDecorActionBar$3
-com.android.internal.app.procstats.DumpUtils
+com.android.internal.app.WindowDecorActionBar$ActionModeImpl
com.android.internal.app.procstats.DurationsTable
com.android.internal.app.procstats.IProcessStats
com.android.internal.app.procstats.IProcessStats$Stub
-com.android.internal.app.procstats.IProcessStats$Stub$Proxy
com.android.internal.app.procstats.ProcessState
com.android.internal.app.procstats.ProcessState$1
-com.android.internal.app.procstats.ProcessState$PssAggr
com.android.internal.app.procstats.ProcessStats
com.android.internal.app.procstats.ProcessStats$1
com.android.internal.app.procstats.ProcessStats$PackageState
-com.android.internal.app.procstats.ProcessStats$ProcessDataCollection
com.android.internal.app.procstats.ProcessStats$ProcessStateHolder
-com.android.internal.app.procstats.ProcessStats$TotalMemoryUseCollection
com.android.internal.app.procstats.PssTable
com.android.internal.app.procstats.ServiceState
com.android.internal.app.procstats.SparseMappingTable
@@ -5495,8 +5282,12 @@
com.android.internal.backup.IBackupTransport$Stub$Proxy
com.android.internal.backup.LocalTransport
com.android.internal.backup.LocalTransportService
+com.android.internal.content.FileSystemProvider
com.android.internal.content.NativeLibraryHelper
+com.android.internal.content.NativeLibraryHelper$Handle
com.android.internal.content.PackageHelper
+com.android.internal.content.PackageHelper$1
+com.android.internal.content.PackageHelper$TestableInterface
com.android.internal.content.PackageMonitor
com.android.internal.content.ReferrerIntent
com.android.internal.content.ReferrerIntent$1
@@ -5539,25 +5330,25 @@
com.android.internal.net.VpnConfig
com.android.internal.net.VpnInfo
com.android.internal.net.VpnProfile
+com.android.internal.notification.SystemNotificationChannels
com.android.internal.os.AndroidPrintStream
com.android.internal.os.AppFuseMount
com.android.internal.os.AtomicFile
com.android.internal.os.BackgroundThread
-com.android.internal.os.BatterySipper
-com.android.internal.os.BatterySipper$DrainType
com.android.internal.os.BatteryStatsHelper
-com.android.internal.os.BatteryStatsHelper$1
com.android.internal.os.BatteryStatsImpl
com.android.internal.os.BatteryStatsImpl$1
-com.android.internal.os.BatteryStatsImpl$5
+com.android.internal.os.BatteryStatsImpl$6
com.android.internal.os.BatteryStatsImpl$BatchTimer
com.android.internal.os.BatteryStatsImpl$BatteryCallback
com.android.internal.os.BatteryStatsImpl$Clocks
com.android.internal.os.BatteryStatsImpl$ControllerActivityCounterImpl
com.android.internal.os.BatteryStatsImpl$Counter
+com.android.internal.os.BatteryStatsImpl$DualTimer
com.android.internal.os.BatteryStatsImpl$DurationTimer
com.android.internal.os.BatteryStatsImpl$ExternalStatsSync
com.android.internal.os.BatteryStatsImpl$LongSamplingCounter
+com.android.internal.os.BatteryStatsImpl$LongSamplingCounterArray
com.android.internal.os.BatteryStatsImpl$MyHandler
com.android.internal.os.BatteryStatsImpl$OverflowArrayMap
com.android.internal.os.BatteryStatsImpl$PlatformIdleStateCallback
@@ -5573,43 +5364,32 @@
com.android.internal.os.BatteryStatsImpl$Uid$3
com.android.internal.os.BatteryStatsImpl$Uid$Pkg
com.android.internal.os.BatteryStatsImpl$Uid$Pkg$Serv
-com.android.internal.os.BatteryStatsImpl$Uid$Proc
com.android.internal.os.BatteryStatsImpl$Uid$Sensor
com.android.internal.os.BatteryStatsImpl$Uid$Wakelock
com.android.internal.os.BinderInternal
com.android.internal.os.BinderInternal$GcWatcher
-com.android.internal.os.BluetoothPowerCalculator
-com.android.internal.os.CameraPowerCalculator
-com.android.internal.os.CpuPowerCalculator
-com.android.internal.os.FlashlightPowerCalculator
com.android.internal.os.FuseAppLoop
com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
com.android.internal.os.HandlerCaller
com.android.internal.os.HandlerCaller$Callback
com.android.internal.os.HandlerCaller$MyHandler
com.android.internal.os.IDropBoxManagerService
com.android.internal.os.IDropBoxManagerService$Stub
com.android.internal.os.IDropBoxManagerService$Stub$Proxy
-com.android.internal.os.IParcelFileDescriptorFactory
com.android.internal.os.IResultReceiver
com.android.internal.os.IResultReceiver$Stub
com.android.internal.os.IResultReceiver$Stub$Proxy
-com.android.internal.os.IShellCallback
-com.android.internal.os.IShellCallback$Stub
-com.android.internal.os.IShellCallback$Stub$Proxy
com.android.internal.os.KernelCpuSpeedReader
com.android.internal.os.KernelMemoryBandwidthStats
+com.android.internal.os.KernelUidCpuFreqTimeReader
com.android.internal.os.KernelUidCpuTimeReader
com.android.internal.os.KernelWakelockReader
com.android.internal.os.KernelWakelockStats
com.android.internal.os.KernelWakelockStats$Entry
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
-com.android.internal.os.MemoryPowerCalculator
-com.android.internal.os.MobileRadioPowerCalculator
com.android.internal.os.PathClassLoaderFactory
-com.android.internal.os.PowerCalculator
com.android.internal.os.PowerProfile
com.android.internal.os.PowerProfile$CpuClusterKey
com.android.internal.os.ProcessCpuTracker
@@ -5623,11 +5403,7 @@
com.android.internal.os.RuntimeInit$KillApplicationHandler
com.android.internal.os.RuntimeInit$LoggingHandler
com.android.internal.os.SamplingProfilerIntegration
-com.android.internal.os.SensorPowerCalculator
com.android.internal.os.SomeArgs
-com.android.internal.os.TransferPipe
-com.android.internal.os.WakelockPowerCalculator
-com.android.internal.os.WifiPowerCalculator
com.android.internal.os.Zygote
com.android.internal.os.Zygote$MethodAndArgsCaller
com.android.internal.os.ZygoteConnection
@@ -5638,6 +5414,8 @@
com.android.internal.policy.DecorContext
com.android.internal.policy.DecorView
com.android.internal.policy.DecorView$1
+com.android.internal.policy.DecorView$ActionModeCallback2Wrapper
+com.android.internal.policy.DecorView$ColorViewAttributes
com.android.internal.policy.DecorView$ColorViewState
com.android.internal.policy.DividerSnapAlgorithm
com.android.internal.policy.DividerSnapAlgorithm$SnapTarget
@@ -5662,12 +5440,9 @@
com.android.internal.policy.PhoneWindow$1
com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback
com.android.internal.policy.PhoneWindow$PanelFeatureState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1
com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
com.android.internal.policy.PhoneWindow$RotationWatcher
com.android.internal.policy.PhoneWindow$RotationWatcher$1
-com.android.internal.policy.PipMotionHelper
com.android.internal.policy.PipSnapAlgorithm
com.android.internal.statusbar.IStatusBar
com.android.internal.statusbar.IStatusBar$Stub
@@ -5687,7 +5462,6 @@
com.android.internal.telecom.IConnectionServiceAdapter$Stub$Proxy
com.android.internal.telecom.IInCallAdapter
com.android.internal.telecom.IInCallAdapter$Stub
-com.android.internal.telecom.IInCallAdapter$Stub$Proxy
com.android.internal.telecom.IInCallService
com.android.internal.telecom.IInCallService$Stub
com.android.internal.telecom.IInCallService$Stub$Proxy
@@ -5715,6 +5489,8 @@
com.android.internal.telephony.CallerInfoAsyncQuery$CookieWrapper
com.android.internal.telephony.CallerInfoAsyncQuery$OnQueryCompleteListener
com.android.internal.telephony.CarrierActionAgent
+com.android.internal.telephony.CarrierActionAgent$1
+com.android.internal.telephony.CarrierActionAgent$SettingsObserver
com.android.internal.telephony.CarrierAppUtils
com.android.internal.telephony.CarrierServiceBindHelper
com.android.internal.telephony.CarrierServiceBindHelper$1
@@ -5738,6 +5514,9 @@
com.android.internal.telephony.DctConstants$State
com.android.internal.telephony.DebugService
com.android.internal.telephony.DefaultPhoneNotifier
+com.android.internal.telephony.DeviceStateMonitor
+com.android.internal.telephony.DeviceStateMonitor$1
+com.android.internal.telephony.DeviceStateMonitor$2
com.android.internal.telephony.EncodeException
com.android.internal.telephony.GsmAlphabet
com.android.internal.telephony.GsmAlphabet$TextEncodingDetails
@@ -5749,7 +5528,6 @@
com.android.internal.telephony.GsmCdmaPhone$1
com.android.internal.telephony.GsmCdmaPhone$2
com.android.internal.telephony.HardwareConfig
-com.android.internal.telephony.HbpcdUtils
com.android.internal.telephony.ICarrierConfigLoader
com.android.internal.telephony.ICarrierConfigLoader$Stub
com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
@@ -5798,18 +5576,18 @@
com.android.internal.telephony.InboundSmsHandler$StartupState
com.android.internal.telephony.InboundSmsHandler$WaitingState
com.android.internal.telephony.IntRangeManager
-com.android.internal.telephony.MccTable
-com.android.internal.telephony.MccTable$MccEntry
+com.android.internal.telephony.OemHookIndication
+com.android.internal.telephony.OemHookResponse
com.android.internal.telephony.OperatorInfo
com.android.internal.telephony.Phone
com.android.internal.telephony.Phone$1
+com.android.internal.telephony.PhoneConstantConversions
com.android.internal.telephony.PhoneConstants$DataState
com.android.internal.telephony.PhoneConstants$State
com.android.internal.telephony.PhoneFactory
com.android.internal.telephony.PhoneInternalInterface
com.android.internal.telephony.PhoneInternalInterface$DataActivityState
com.android.internal.telephony.PhoneNotifier
-com.android.internal.telephony.PhoneStateIntentReceiver
com.android.internal.telephony.PhoneSubInfoController
com.android.internal.telephony.PhoneSwitcher
com.android.internal.telephony.PhoneSwitcher$1
@@ -5819,10 +5597,6 @@
com.android.internal.telephony.ProxyController
com.android.internal.telephony.ProxyController$1
com.android.internal.telephony.RIL
-com.android.internal.telephony.RIL$1
-com.android.internal.telephony.RIL$2
-com.android.internal.telephony.RIL$RILReceiver
-com.android.internal.telephony.RIL$RILSender
com.android.internal.telephony.RIL$RadioProxyDeathRecipient
com.android.internal.telephony.RIL$RilHandler
com.android.internal.telephony.RILConstants
@@ -5843,6 +5617,8 @@
com.android.internal.telephony.ServiceStateTracker$3
com.android.internal.telephony.ServiceStateTracker$CellInfoResult
com.android.internal.telephony.ServiceStateTracker$SstSubscriptionsChangedListener
+com.android.internal.telephony.SimActivationTracker
+com.android.internal.telephony.SimActivationTracker$1
com.android.internal.telephony.SmsApplication
com.android.internal.telephony.SmsApplication$SmsApplicationData
com.android.internal.telephony.SmsApplication$SmsPackageMonitor
@@ -5879,21 +5655,8 @@
com.android.internal.telephony.WapPushOverSms$1
com.android.internal.telephony.WapPushOverSms$BindServiceThread
com.android.internal.telephony.cat.AppInterface
-com.android.internal.telephony.cat.AppInterface$CommandType
-com.android.internal.telephony.cat.CatCmdMessage
-com.android.internal.telephony.cat.CatCmdMessage$BrowserSettings
-com.android.internal.telephony.cat.CatCmdMessage$CallSettings
-com.android.internal.telephony.cat.CatCmdMessage$SetupEventListSettings
com.android.internal.telephony.cat.CatLog
-com.android.internal.telephony.cat.CatResponseMessage
com.android.internal.telephony.cat.CatService
-com.android.internal.telephony.cat.Input
-com.android.internal.telephony.cat.Item
-com.android.internal.telephony.cat.LaunchBrowserMode
-com.android.internal.telephony.cat.Menu
-com.android.internal.telephony.cat.ResultCode
-com.android.internal.telephony.cat.TextMessage
-com.android.internal.telephony.cat.ToneSettings
com.android.internal.telephony.cdma.CdmaInboundSmsHandler
com.android.internal.telephony.cdma.CdmaSMSDispatcher
com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler
@@ -5901,7 +5664,6 @@
com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager
com.android.internal.telephony.cdma.EriInfo
com.android.internal.telephony.cdma.EriManager
-com.android.internal.telephony.cdma.EriManager$EriDisplayInformation
com.android.internal.telephony.cdma.EriManager$EriFile
com.android.internal.telephony.dataconnection.ApnContext
com.android.internal.telephony.dataconnection.DataConnection
@@ -5934,9 +5696,9 @@
com.android.internal.telephony.gsm.GsmSMSDispatcher
com.android.internal.telephony.gsm.SmsMessage
com.android.internal.telephony.gsm.UsimDataDownloadHandler
-com.android.internal.telephony.ims.-$Lambda$2$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$3$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$4$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$1
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$2
com.android.internal.telephony.ims.ImsResolver
com.android.internal.telephony.ims.ImsResolver$1
com.android.internal.telephony.ims.ImsResolver$2
@@ -5944,6 +5706,8 @@
com.android.internal.telephony.ims.ImsResolver$ImsServiceControllerFactory
com.android.internal.telephony.ims.ImsResolver$SubscriptionManagerProxy
com.android.internal.telephony.ims.ImsServiceController$ImsServiceControllerCallbacks
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w$1
com.android.internal.telephony.imsphone.ImsExternalCallTracker
com.android.internal.telephony.imsphone.ImsExternalCallTracker$1
com.android.internal.telephony.imsphone.ImsExternalCallTracker$2
@@ -5963,6 +5727,7 @@
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$3
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$4
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$5
+com.android.internal.telephony.imsphone.ImsPhoneCallTracker$IRetryTimeout
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$PhoneStateListener
com.android.internal.telephony.imsphone.ImsPhoneCommandInterface
com.android.internal.telephony.imsphone.ImsPhoneFactory
@@ -5984,6 +5749,12 @@
com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState
com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState$TelephonyOperator
com.android.internal.telephony.nano.TelephonyProto$TelephonySettings
+com.android.internal.telephony.protobuf.nano.CodedOutputByteBufferNano
+com.android.internal.telephony.protobuf.nano.ExtendableMessageNano
+com.android.internal.telephony.protobuf.nano.InternalNano
+com.android.internal.telephony.protobuf.nano.InvalidProtocolBufferNanoException
+com.android.internal.telephony.protobuf.nano.MessageNano
+com.android.internal.telephony.protobuf.nano.WireFormatNano
com.android.internal.telephony.test.SimulatedRadioControl
com.android.internal.telephony.uicc.IccCardApplicationStatus
com.android.internal.telephony.uicc.IccCardApplicationStatus$AppType
@@ -5993,16 +5764,20 @@
com.android.internal.telephony.uicc.IccCardStatus$PinState
com.android.internal.telephony.uicc.IccConstants
com.android.internal.telephony.uicc.IccRecords
-com.android.internal.telephony.uicc.IccRefreshResponse
com.android.internal.telephony.uicc.IccUtils
com.android.internal.telephony.uicc.UiccCard
com.android.internal.telephony.uicc.UiccCard$1
com.android.internal.telephony.uicc.UiccCardApplication
com.android.internal.telephony.uicc.UiccController
com.android.internal.telephony.uicc.UiccStateChangedLauncher
+com.android.internal.telephony.util.NotificationChannelController
+com.android.internal.telephony.util.NotificationChannelController$1
com.android.internal.textservice.ISpellCheckerService
com.android.internal.textservice.ISpellCheckerService$Stub
com.android.internal.textservice.ISpellCheckerService$Stub$Proxy
+com.android.internal.textservice.ISpellCheckerServiceCallback
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub$Proxy
com.android.internal.textservice.ISpellCheckerSession
com.android.internal.textservice.ISpellCheckerSession$Stub
com.android.internal.textservice.ISpellCheckerSession$Stub$Proxy
@@ -6016,10 +5791,6 @@
com.android.internal.textservice.ITextServicesSessionListener$Stub
com.android.internal.textservice.ITextServicesSessionListener$Stub$Proxy
com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.EpicenterTranslateClipReveal$1
-com.android.internal.transition.EpicenterTranslateClipReveal$State
-com.android.internal.transition.EpicenterTranslateClipReveal$StateEvaluator
-com.android.internal.transition.EpicenterTranslateClipReveal$StateProperty
com.android.internal.transition.TransitionConstants
com.android.internal.util.ArrayUtils
com.android.internal.util.AsyncChannel
@@ -6027,10 +5798,13 @@
com.android.internal.util.AsyncChannel$DeathMonitor
com.android.internal.util.AsyncChannel$SyncMessenger
com.android.internal.util.AsyncChannel$SyncMessenger$SyncHandler
+com.android.internal.util.BitUtils
+com.android.internal.util.CollectionUtils
com.android.internal.util.ConcurrentUtils
com.android.internal.util.ConcurrentUtils$1
com.android.internal.util.ConcurrentUtils$1$1
com.android.internal.util.DumpUtils$Dump
+com.android.internal.util.ExponentiallyBucketedHistogram
com.android.internal.util.FastMath
com.android.internal.util.FastPrintWriter
com.android.internal.util.FastPrintWriter$DummyWriter
@@ -6045,6 +5819,7 @@
com.android.internal.util.IState
com.android.internal.util.ImageUtils
com.android.internal.util.IndentingPrintWriter
+com.android.internal.util.IntPair
com.android.internal.util.JournaledFile
com.android.internal.util.LineBreakBufferedWriter
com.android.internal.util.LocalLog
@@ -6052,8 +5827,9 @@
com.android.internal.util.MessageUtils
com.android.internal.util.NotificationColorUtil
com.android.internal.util.NotificationColorUtil$ColorUtilsFromCompat
+com.android.internal.util.NotificationMessagingUtil
+com.android.internal.util.NotificationMessagingUtil$1
com.android.internal.util.Preconditions
-com.android.internal.util.Predicate
com.android.internal.util.ProcFileReader
com.android.internal.util.ProgressReporter
com.android.internal.util.RingBufferIndices
@@ -6078,7 +5854,6 @@
com.android.internal.view.BaseSurfaceHolder
com.android.internal.view.IInputConnectionWrapper
com.android.internal.view.IInputConnectionWrapper$MyHandler
-com.android.internal.view.IInputConnectionWrapper$SomeArgs
com.android.internal.view.IInputContext
com.android.internal.view.IInputContext$Stub
com.android.internal.view.IInputContext$Stub$Proxy
@@ -6111,6 +5886,7 @@
com.android.internal.view.RotationPolicy$RotationPolicyListener$1
com.android.internal.view.SurfaceCallbackHelper
com.android.internal.view.SurfaceCallbackHelper$1
+com.android.internal.view.SurfaceFlingerVsyncChoreographer
com.android.internal.view.WindowManagerPolicyThread
com.android.internal.view.animation.FallbackLUTInterpolator
com.android.internal.view.animation.HasNativeInterpolator
@@ -6120,14 +5896,12 @@
com.android.internal.view.menu.ActionMenuItemView
com.android.internal.view.menu.ActionMenuItemView$PopupCallback
com.android.internal.view.menu.BaseMenuPresenter
-com.android.internal.view.menu.ListMenuItemView
-com.android.internal.view.menu.MenuAdapter
+com.android.internal.view.menu.ContextMenuBuilder
com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
com.android.internal.view.menu.MenuBuilder$ItemInvoker
com.android.internal.view.menu.MenuHelper
com.android.internal.view.menu.MenuItemImpl
-com.android.internal.view.menu.MenuPopup
com.android.internal.view.menu.MenuPopupHelper
com.android.internal.view.menu.MenuPopupHelper$1
com.android.internal.view.menu.MenuPresenter
@@ -6135,16 +5909,13 @@
com.android.internal.view.menu.MenuView
com.android.internal.view.menu.MenuView$ItemView
com.android.internal.view.menu.ShowableListMenu
-com.android.internal.view.menu.StandardMenuPopup
-com.android.internal.view.menu.StandardMenuPopup$1
-com.android.internal.view.menu.StandardMenuPopup$2
-com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.-$Lambda$6$LaTFiUorkqfcqmu-zMQbCLeO77c
+com.android.internal.widget.-$Lambda$LaTFiUorkqfcqmu-zMQbCLeO77c
com.android.internal.widget.AbsActionBarView
com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
com.android.internal.widget.ActionBarContainer
com.android.internal.widget.ActionBarContainer$ActionBarBackgroundDrawable
com.android.internal.widget.ActionBarContextView
+com.android.internal.widget.ActionBarContextView$1
com.android.internal.widget.ActionBarOverlayLayout
com.android.internal.widget.ActionBarOverlayLayout$1
com.android.internal.widget.ActionBarOverlayLayout$2
@@ -6174,10 +5945,10 @@
com.android.internal.widget.MediaNotificationView
com.android.internal.widget.NotificationActionListLayout
com.android.internal.widget.NotificationExpandButton
-com.android.internal.widget.PreferenceImageView
com.android.internal.widget.ScrollBarUtils
com.android.internal.widget.ToolbarWidgetWrapper
com.android.internal.widget.ToolbarWidgetWrapper$1
+com.android.internal.widget.ToolbarWidgetWrapper$2
com.android.internal.widget.VerifyCredentialResponse
com.android.okhttp.Address
com.android.okhttp.AndroidInternal
@@ -6185,6 +5956,9 @@
com.android.okhttp.Authenticator
com.android.okhttp.Cache
com.android.okhttp.Cache$1
+com.android.okhttp.Cache$CacheRequestImpl
+com.android.okhttp.Cache$CacheRequestImpl$1
+com.android.okhttp.Cache$Entry
com.android.okhttp.CacheControl
com.android.okhttp.CacheControl$Builder
com.android.okhttp.CertificatePinner
@@ -6229,6 +6003,7 @@
com.android.okhttp.internal.DiskLruCache$2
com.android.okhttp.internal.DiskLruCache$3
com.android.okhttp.internal.DiskLruCache$Editor
+com.android.okhttp.internal.DiskLruCache$Editor$1
com.android.okhttp.internal.DiskLruCache$Entry
com.android.okhttp.internal.FaultHidingSink
com.android.okhttp.internal.Internal
@@ -6240,6 +6015,7 @@
com.android.okhttp.internal.Util
com.android.okhttp.internal.Util$1
com.android.okhttp.internal.http.AuthenticatorAdapter
+com.android.okhttp.internal.http.CacheRequest
com.android.okhttp.internal.http.CacheStrategy
com.android.okhttp.internal.http.CacheStrategy$Factory
com.android.okhttp.internal.http.HeaderParser
@@ -6252,6 +6028,7 @@
com.android.okhttp.internal.http.Http1xStream$UnknownLengthSource
com.android.okhttp.internal.http.HttpEngine
com.android.okhttp.internal.http.HttpEngine$1
+com.android.okhttp.internal.http.HttpEngine$2
com.android.okhttp.internal.http.HttpMethod
com.android.okhttp.internal.http.HttpStream
com.android.okhttp.internal.http.OkHeaders
@@ -6275,6 +6052,7 @@
com.android.okhttp.okio.AsyncTimeout$1
com.android.okhttp.okio.AsyncTimeout$2
com.android.okhttp.okio.AsyncTimeout$Watchdog
+com.android.okhttp.okio.Base64
com.android.okhttp.okio.Buffer
com.android.okhttp.okio.BufferedSink
com.android.okhttp.okio.BufferedSource
@@ -6298,49 +6076,85 @@
com.android.okhttp.okio.Timeout
com.android.okhttp.okio.Timeout$1
com.android.okhttp.okio.Util
+com.android.org.bouncycastle.asn1.ASN1BitString
+com.android.org.bouncycastle.asn1.ASN1Choice
com.android.org.bouncycastle.asn1.ASN1Encodable
+com.android.org.bouncycastle.asn1.ASN1EncodableVector
+com.android.org.bouncycastle.asn1.ASN1InputStream
+com.android.org.bouncycastle.asn1.ASN1Integer
+com.android.org.bouncycastle.asn1.ASN1Null
com.android.org.bouncycastle.asn1.ASN1Object
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier$OidHandle
+com.android.org.bouncycastle.asn1.ASN1OutputStream
com.android.org.bouncycastle.asn1.ASN1Primitive
+com.android.org.bouncycastle.asn1.ASN1Sequence
+com.android.org.bouncycastle.asn1.ASN1Set
+com.android.org.bouncycastle.asn1.ASN1StreamParser
+com.android.org.bouncycastle.asn1.ASN1String
+com.android.org.bouncycastle.asn1.ASN1TaggedObject
+com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser
+com.android.org.bouncycastle.asn1.ASN1UTCTime
+com.android.org.bouncycastle.asn1.BERTags
+com.android.org.bouncycastle.asn1.DERBitString
+com.android.org.bouncycastle.asn1.DERFactory
+com.android.org.bouncycastle.asn1.DERNull
+com.android.org.bouncycastle.asn1.DEROutputStream
+com.android.org.bouncycastle.asn1.DERPrintableString
+com.android.org.bouncycastle.asn1.DERSequence
+com.android.org.bouncycastle.asn1.DERSet
+com.android.org.bouncycastle.asn1.DERTaggedObject
+com.android.org.bouncycastle.asn1.DLSequence
+com.android.org.bouncycastle.asn1.DLSet
+com.android.org.bouncycastle.asn1.DefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.InMemoryRepresentable
+com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.LimitedInputStream
com.android.org.bouncycastle.asn1.OIDTokenizer
+com.android.org.bouncycastle.asn1.StreamUtil
com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers
com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers
com.android.org.bouncycastle.asn1.misc.MiscObjectIdentifiers
com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers
com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
+com.android.org.bouncycastle.asn1.x500.RDN
+com.android.org.bouncycastle.asn1.x500.X500Name
+com.android.org.bouncycastle.asn1.x500.X500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.AbstractX500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.BCStyle
+com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
+com.android.org.bouncycastle.asn1.x509.Certificate
+com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
+com.android.org.bouncycastle.asn1.x509.TBSCertificate
+com.android.org.bouncycastle.asn1.x509.Time
com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
com.android.org.bouncycastle.crypto.AsymmetricBlockCipher
-com.android.org.bouncycastle.crypto.BlockCipher
-com.android.org.bouncycastle.crypto.BufferedBlockCipher
com.android.org.bouncycastle.crypto.CipherKeyGenerator
com.android.org.bouncycastle.crypto.CipherParameters
com.android.org.bouncycastle.crypto.CryptoException
-com.android.org.bouncycastle.crypto.DataLengthException
com.android.org.bouncycastle.crypto.Digest
com.android.org.bouncycastle.crypto.ExtendedDigest
com.android.org.bouncycastle.crypto.InvalidCipherTextException
com.android.org.bouncycastle.crypto.KeyGenerationParameters
-com.android.org.bouncycastle.crypto.OutputLengthException
-com.android.org.bouncycastle.crypto.RuntimeCryptoException
+com.android.org.bouncycastle.crypto.Mac
+com.android.org.bouncycastle.crypto.PBEParametersGenerator
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
+com.android.org.bouncycastle.crypto.digests.EncodableDigest
+com.android.org.bouncycastle.crypto.digests.GeneralDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
+com.android.org.bouncycastle.crypto.digests.SHA1Digest
com.android.org.bouncycastle.crypto.encodings.OAEPEncoding
-com.android.org.bouncycastle.crypto.engines.AESEngine
com.android.org.bouncycastle.crypto.engines.RSABlindedEngine
com.android.org.bouncycastle.crypto.engines.RSACoreEngine
-com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
-com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
-com.android.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
+com.android.org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
+com.android.org.bouncycastle.crypto.io.MacInputStream
+com.android.org.bouncycastle.crypto.macs.HMac
com.android.org.bouncycastle.crypto.params.KeyParameter
-com.android.org.bouncycastle.crypto.params.ParametersWithRandom
-com.android.org.bouncycastle.jcajce.PBKDFKey
-com.android.org.bouncycastle.jcajce.PKCS12Key
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
@@ -6356,6 +6170,10 @@
com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi
+com.android.org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.PEMUtil
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject
com.android.org.bouncycastle.jcajce.provider.config.ConfigurableProvider
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
@@ -6377,10 +6195,8 @@
com.android.org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
+com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$StoreEntry
com.android.org.bouncycastle.jcajce.provider.symmetric.AES
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB$1
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -6401,36 +6217,34 @@
com.android.org.bouncycastle.jcajce.provider.symmetric.SymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.PBE
com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
com.android.org.bouncycastle.jcajce.provider.util.DigestFactory
-com.android.org.bouncycastle.jcajce.spec.AEADParameterSpec
com.android.org.bouncycastle.jcajce.util.BCJcaJceHelper
com.android.org.bouncycastle.jcajce.util.JcaJceHelper
com.android.org.bouncycastle.jcajce.util.ProviderJcaJceHelper
com.android.org.bouncycastle.jce.interfaces.BCKeyStore
+com.android.org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$1
com.android.org.bouncycastle.jce.provider.BouncyCastleProviderConfiguration
+com.android.org.bouncycastle.jce.provider.CertStoreCollectionSpi
com.android.org.bouncycastle.util.Arrays
com.android.org.bouncycastle.util.Encodable
+com.android.org.bouncycastle.util.Integers
+com.android.org.bouncycastle.util.Iterable
+com.android.org.bouncycastle.util.Memoable
com.android.org.bouncycastle.util.Pack
com.android.org.bouncycastle.util.Strings
com.android.org.bouncycastle.util.Strings$1
+com.android.org.bouncycastle.util.io.Streams
com.android.org.conscrypt.AbstractOpenSSLSession
com.android.org.conscrypt.AbstractSessionContext
com.android.org.conscrypt.AbstractSessionContext$1
com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
com.android.org.conscrypt.ByteArray
com.android.org.conscrypt.CertBlacklist
com.android.org.conscrypt.CertificatePriorityComparator
@@ -6464,6 +6278,7 @@
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES_BASE
com.android.org.conscrypt.OpenSSLCipher$Mode
com.android.org.conscrypt.OpenSSLCipher$Padding
com.android.org.conscrypt.OpenSSLContextImpl
@@ -6477,15 +6292,13 @@
com.android.org.conscrypt.OpenSSLKeyHolder
com.android.org.conscrypt.OpenSSLMac
com.android.org.conscrypt.OpenSSLMac$HmacSHA1
+com.android.org.conscrypt.OpenSSLMac$HmacSHA256
com.android.org.conscrypt.OpenSSLMessageDigestJDK
com.android.org.conscrypt.OpenSSLMessageDigestJDK$MD5
com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA1
com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA256
com.android.org.conscrypt.OpenSSLProvider
com.android.org.conscrypt.OpenSSLRSAKeyFactory
-com.android.org.conscrypt.OpenSSLRSAKeyPairGenerator
-com.android.org.conscrypt.OpenSSLRSAPrivateCrtKey
-com.android.org.conscrypt.OpenSSLRSAPrivateKey
com.android.org.conscrypt.OpenSSLRSAPublicKey
com.android.org.conscrypt.OpenSSLRandom
com.android.org.conscrypt.OpenSSLSessionImpl
@@ -6508,11 +6321,11 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.Platform
-com.android.org.conscrypt.Platform$NoPreloadHolder
com.android.org.conscrypt.SSLClientSessionCache
com.android.org.conscrypt.SSLParametersImpl
com.android.org.conscrypt.SSLParametersImpl$AliasChooser
com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
com.android.org.conscrypt.ServerSessionContext
com.android.org.conscrypt.TrustManagerFactoryImpl
com.android.org.conscrypt.TrustManagerImpl
@@ -6526,6 +6339,7 @@
com.android.org.conscrypt.TrustedCertificateStore$4
com.android.org.conscrypt.TrustedCertificateStore$5
com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
com.android.org.conscrypt.ct.CTLogInfo
com.android.org.conscrypt.ct.CTLogStore
com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -6535,11 +6349,10 @@
com.android.org.conscrypt.ct.CTVerifier
com.android.org.conscrypt.ct.KnownLogs
com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
-com.android.org.conscrypt.util.EmptyArray
com.android.server.AppWidgetBackupBridge
com.android.server.BootReceiver
com.android.server.BootReceiver$1
+com.android.server.BootReceiver$2
com.android.server.LocalServices
com.android.server.NetworkManagementSocketTagger
com.android.server.NetworkManagementSocketTagger$1
@@ -6565,6 +6378,8 @@
com.android.server.wifi.nano.WifiMetricsProto$RssiPollCount
com.android.server.wifi.nano.WifiMetricsProto$SoftApDurationBucket
com.android.server.wifi.nano.WifiMetricsProto$SoftApReturnCodeCount
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent$ConfigInfo
com.android.server.wifi.nano.WifiMetricsProto$WifiLog
com.android.server.wifi.nano.WifiMetricsProto$WifiLog$ScanReturnEntry
com.android.server.wifi.nano.WifiMetricsProto$WifiLog$WifiSystemStateEntry
@@ -6580,11 +6395,9 @@
com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
com.google.android.mms.MmsException
-com.google.android.mms.pdu.GenericPdu
-com.google.android.mms.pdu.PduComposer
-com.google.android.mms.pdu.PduPersister
dalvik.annotation.optimization.CriticalNative
dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
dalvik.system.BaseDexClassLoader
dalvik.system.BaseDexClassLoader$Reporter
dalvik.system.BlockGuard
@@ -6608,7 +6421,6 @@
dalvik.system.DexPathList$NativeLibraryElement
dalvik.system.EmulatedStackFrame
dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
dalvik.system.PathClassLoader
dalvik.system.SocketTagger
dalvik.system.SocketTagger$1
@@ -6623,9 +6435,7 @@
java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
-java.io.CharArrayReader
java.io.CharArrayWriter
-java.io.CharConversionException
java.io.Closeable
java.io.Console
java.io.DataInput
@@ -6662,7 +6472,6 @@
java.io.InterruptedIOException
java.io.InvalidClassException
java.io.InvalidObjectException
-java.io.NotSerializableException
java.io.ObjectInput
java.io.ObjectInputStream
java.io.ObjectInputStream$BlockDataInputStream
@@ -6706,16 +6515,13 @@
java.io.Serializable
java.io.SerializablePermission
java.io.StreamCorruptedException
-java.io.StringBufferInputStream
java.io.StringReader
java.io.StringWriter
-java.io.SyncFailedException
-java.io.UTFDataFormatException
java.io.UnixFileSystem
java.io.UnsupportedEncodingException
java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
java.lang.AndroidHardcodedSystemProperties
@@ -6799,14 +6605,7 @@
java.lang.Package
java.lang.Process
java.lang.ProcessBuilder
-java.lang.ProcessBuilder$NullInputStream
-java.lang.ProcessBuilder$NullOutputStream
java.lang.ProcessEnvironment
-java.lang.ProcessEnvironment$ExternalData
-java.lang.ProcessEnvironment$StringEnvironment
-java.lang.ProcessEnvironment$Value
-java.lang.ProcessEnvironment$Variable
-java.lang.ProcessImpl
java.lang.Readable
java.lang.ReflectiveOperationException
java.lang.Runnable
@@ -6837,6 +6636,7 @@
java.lang.ThreadDeath
java.lang.ThreadGroup
java.lang.ThreadLocal
+java.lang.ThreadLocal$SuppliedThreadLocal
java.lang.ThreadLocal$ThreadLocalMap
java.lang.ThreadLocal$ThreadLocalMap$Entry
java.lang.Throwable
@@ -6846,13 +6646,6 @@
java.lang.Throwable$WrappedPrintWriter
java.lang.TypeNotPresentException
java.lang.UNIXProcess
-java.lang.UNIXProcess$1
-java.lang.UNIXProcess$2
-java.lang.UNIXProcess$3
-java.lang.UNIXProcess$ProcessPipeInputStream
-java.lang.UNIXProcess$ProcessPipeOutputStream
-java.lang.UNIXProcess$ProcessReaperThreadFactory
-java.lang.UNIXProcess$ProcessReaperThreadFactory$1
java.lang.UnsatisfiedLinkError
java.lang.UnsupportedOperationException
java.lang.VMClassLoader
@@ -6865,18 +6658,22 @@
java.lang.annotation.Inherited
java.lang.annotation.Retention
java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
java.lang.invoke.MethodHandle
java.lang.invoke.MethodHandleImpl
java.lang.invoke.MethodHandleImpl$HandleInfo
java.lang.invoke.MethodHandleInfo
java.lang.invoke.MethodHandleStatics
java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
java.lang.invoke.MethodType
java.lang.invoke.MethodType$ConcurrentWeakInternSet
java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
java.lang.invoke.MethodTypeForm
java.lang.invoke.Transformers$BindTo
java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
java.lang.invoke.Transformers$Spreader
java.lang.invoke.Transformers$Transformer
java.lang.invoke.Transformers$VarargsCollector
@@ -6926,7 +6723,6 @@
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
-java.math.BitLevel
java.math.Conversion
java.math.Division
java.math.MathContext
@@ -6938,12 +6734,9 @@
java.net.AddressCache
java.net.AddressCache$AddressCacheEntry
java.net.AddressCache$AddressCacheKey
-java.net.Authenticator
-java.net.Authenticator$RequestorType
java.net.ConnectException
java.net.CookieHandler
java.net.CookieManager
-java.net.CookieManager$CookiePathComparator
java.net.CookiePolicy
java.net.CookiePolicy$1
java.net.CookiePolicy$2
@@ -6957,19 +6750,6 @@
java.net.DefaultFileNameMap
java.net.DefaultInterface
java.net.FileNameMap
-java.net.HttpCookie
-java.net.HttpCookie$1
-java.net.HttpCookie$10
-java.net.HttpCookie$11
-java.net.HttpCookie$2
-java.net.HttpCookie$3
-java.net.HttpCookie$4
-java.net.HttpCookie$5
-java.net.HttpCookie$6
-java.net.HttpCookie$7
-java.net.HttpCookie$8
-java.net.HttpCookie$9
-java.net.HttpCookie$CookieAttributeAssignor
java.net.HttpURLConnection
java.net.IDN
java.net.InMemoryCookieStore
@@ -6991,17 +6771,18 @@
java.net.NetworkInterface$1checkedAddresses
java.net.NoRouteToHostException
java.net.Parts
-java.net.PasswordAuthentication
java.net.PlainDatagramSocketImpl
java.net.PlainSocketImpl
java.net.PortUnreachableException
java.net.ProtocolException
+java.net.ProtocolFamily
java.net.Proxy
java.net.Proxy$Type
java.net.ProxySelector
java.net.ResponseCache
java.net.ServerSocket
java.net.Socket
+java.net.Socket$1
java.net.Socket$2
java.net.Socket$3
java.net.SocketAddress
@@ -7013,6 +6794,7 @@
java.net.SocketTimeoutException
java.net.SocksConsts
java.net.SocksSocketImpl
+java.net.StandardProtocolFamily
java.net.URI
java.net.URI$Parser
java.net.URISyntaxException
@@ -7043,7 +6825,6 @@
java.nio.FloatBuffer
java.nio.HeapByteBuffer
java.nio.HeapCharBuffer
-java.nio.HeapIntBuffer
java.nio.IntBuffer
java.nio.InvalidMarkException
java.nio.LongBuffer
@@ -7058,7 +6839,7 @@
java.nio.channels.CancelledKeyException
java.nio.channels.Channel
java.nio.channels.Channels
-java.nio.channels.Channels$ReadableByteChannelImpl
+java.nio.channels.Channels$1
java.nio.channels.ClosedByInterruptException
java.nio.channels.ClosedChannelException
java.nio.channels.DatagramChannel
@@ -7075,12 +6856,19 @@
java.nio.channels.ScatteringByteChannel
java.nio.channels.SeekableByteChannel
java.nio.channels.SelectableChannel
+java.nio.channels.SelectionKey
+java.nio.channels.Selector
java.nio.channels.ServerSocketChannel
java.nio.channels.SocketChannel
java.nio.channels.WritableByteChannel
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.spi.AbstractInterruptibleChannel$1
java.nio.channels.spi.AbstractSelectableChannel
+java.nio.channels.spi.AbstractSelectionKey
+java.nio.channels.spi.AbstractSelector
+java.nio.channels.spi.AbstractSelector$1
+java.nio.channels.spi.SelectorProvider
+java.nio.channels.spi.SelectorProvider$1
java.nio.charset.CharacterCodingException
java.nio.charset.Charset
java.nio.charset.CharsetDecoder
@@ -7096,6 +6884,8 @@
java.nio.charset.IllegalCharsetNameException
java.nio.charset.StandardCharsets
java.nio.charset.UnsupportedCharsetException
+java.nio.file.AccessMode
+java.nio.file.CopyOption
java.nio.file.FileAlreadyExistsException
java.nio.file.FileSystem
java.nio.file.FileSystemException
@@ -7103,12 +6893,18 @@
java.nio.file.FileSystems$DefaultFileSystemHolder
java.nio.file.FileSystems$DefaultFileSystemHolder$1
java.nio.file.Files
+java.nio.file.LinkOption
java.nio.file.NoSuchFileException
java.nio.file.OpenOption
java.nio.file.Path
+java.nio.file.Paths
+java.nio.file.StandardOpenOption
java.nio.file.Watchable
+java.nio.file.attribute.AttributeView
+java.nio.file.attribute.BasicFileAttributeView
java.nio.file.attribute.BasicFileAttributes
java.nio.file.attribute.FileAttribute
+java.nio.file.attribute.FileAttributeView
java.nio.file.attribute.PosixFileAttributes
java.nio.file.spi.FileSystemProvider
java.security.AccessControlContext
@@ -7121,7 +6917,6 @@
java.security.CodeSigner
java.security.CryptoPrimitive
java.security.DigestException
-java.security.DigestInputStream
java.security.GeneralSecurityException
java.security.Guard
java.security.InvalidAlgorithmParameterException
@@ -7134,11 +6929,9 @@
java.security.KeyManagementException
java.security.KeyPair
java.security.KeyPairGenerator
-java.security.KeyPairGenerator$Delegate
java.security.KeyPairGeneratorSpi
java.security.KeyStore
java.security.KeyStore$1
-java.security.KeyStore$LoadStoreParameter
java.security.KeyStoreException
java.security.KeyStoreSpi
java.security.MessageDigest
@@ -7172,6 +6965,7 @@
java.security.UnrecoverableKeyException
java.security.cert.CRL
java.security.cert.CRLException
+java.security.cert.CRLReason
java.security.cert.CertPath
java.security.cert.CertPathBuilderException
java.security.cert.CertPathChecker
@@ -7182,6 +6976,10 @@
java.security.cert.CertPathValidatorResult
java.security.cert.CertPathValidatorSpi
java.security.cert.CertSelector
+java.security.cert.CertStore
+java.security.cert.CertStoreException
+java.security.cert.CertStoreParameters
+java.security.cert.CertStoreSpi
java.security.cert.Certificate
java.security.cert.CertificateEncodingException
java.security.cert.CertificateException
@@ -7190,11 +6988,13 @@
java.security.cert.CertificateFactorySpi
java.security.cert.CertificateNotYetValidException
java.security.cert.CertificateParsingException
+java.security.cert.CollectionCertStoreParameters
java.security.cert.Extension
java.security.cert.PKIXCertPathChecker
java.security.cert.PKIXCertPathValidatorResult
java.security.cert.PKIXParameters
java.security.cert.PKIXRevocationChecker
+java.security.cert.PKIXRevocationChecker$Option
java.security.cert.PolicyNode
java.security.cert.PolicyQualifierInfo
java.security.cert.TrustAnchor
@@ -7207,7 +7007,6 @@
java.security.interfaces.ECPrivateKey
java.security.interfaces.ECPublicKey
java.security.interfaces.RSAKey
-java.security.interfaces.RSAPrivateCrtKey
java.security.interfaces.RSAPrivateKey
java.security.interfaces.RSAPublicKey
java.security.spec.AlgorithmParameterSpec
@@ -7229,8 +7028,6 @@
java.security.spec.RSAPrivateKeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
-java.sql.Date
-java.sql.Time
java.sql.Timestamp
java.text.AttributedCharacterIterator$Attribute
java.text.Bidi
@@ -7263,16 +7060,16 @@
java.text.SimpleDateFormat
java.text.StringCharacterIterator
java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractList$Itr
@@ -7394,6 +7191,7 @@
java.util.EnumSet$SerializationProxy
java.util.Enumeration
java.util.EventListener
+java.util.FormatFlagsConversionMismatchException
java.util.Formattable
java.util.Formatter
java.util.Formatter$Conversion
@@ -7403,6 +7201,7 @@
java.util.Formatter$FormatSpecifier
java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatString
+java.util.FormatterClosedException
java.util.GregorianCalendar
java.util.HashMap
java.util.HashMap$EntryIterator
@@ -7451,7 +7250,6 @@
java.util.LinkedList$Node
java.util.List
java.util.ListIterator
-java.util.ListResourceBundle
java.util.Locale
java.util.Locale$Builder
java.util.Locale$Cache
@@ -7459,6 +7257,7 @@
java.util.Locale$FilteringMode
java.util.Locale$LanguageRange
java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
java.util.Map
java.util.Map$Entry
java.util.MissingFormatArgumentException
@@ -7469,6 +7268,7 @@
java.util.Objects
java.util.Observable
java.util.Observer
+java.util.Optional
java.util.PrimitiveIterator
java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
@@ -7493,6 +7293,10 @@
java.util.ResourceBundle$LoaderReference
java.util.Scanner
java.util.Scanner$1
+java.util.ServiceConfigurationError
+java.util.ServiceLoader
+java.util.ServiceLoader$1
+java.util.ServiceLoader$LazyIterator
java.util.Set
java.util.SimpleTimeZone
java.util.SortedMap
@@ -7508,6 +7312,7 @@
java.util.Spliterators$EmptySpliterator$OfInt
java.util.Spliterators$EmptySpliterator$OfLong
java.util.Spliterators$EmptySpliterator$OfRef
+java.util.Spliterators$IntArraySpliterator
java.util.Spliterators$IteratorSpliterator
java.util.Stack
java.util.StringJoiner
@@ -7546,14 +7351,13 @@
java.util.Vector$Itr
java.util.WeakHashMap
java.util.WeakHashMap$Entry
-java.util.WeakHashMap$EntryIterator
java.util.WeakHashMap$EntrySet
java.util.WeakHashMap$HashIterator
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$ValueIterator
java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.BlockingDeque
@@ -7564,8 +7368,6 @@
java.util.concurrent.CompletableFuture$AltResult
java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
java.util.concurrent.CompletableFuture$Completion
-java.util.concurrent.CompletableFuture$Signaller
-java.util.concurrent.CompletionService
java.util.concurrent.CompletionStage
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentHashMap$BaseIterator
@@ -7585,6 +7387,7 @@
java.util.concurrent.ConcurrentHashMap$ForwardingNode
java.util.concurrent.ConcurrentHashMap$KeyIterator
java.util.concurrent.ConcurrentHashMap$KeySetView
+java.util.concurrent.ConcurrentHashMap$KeySpliterator
java.util.concurrent.ConcurrentHashMap$MapEntry
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToDoubleTask
@@ -7617,6 +7420,8 @@
java.util.concurrent.ConcurrentHashMap$TreeNode
java.util.concurrent.ConcurrentHashMap$ValueIterator
java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentLinkedQueue$Itr
java.util.concurrent.ConcurrentLinkedQueue$Node
@@ -7626,12 +7431,9 @@
java.util.concurrent.ConcurrentSkipListMap$HeadIndex
java.util.concurrent.ConcurrentSkipListMap$Index
java.util.concurrent.ConcurrentSkipListMap$Iter
-java.util.concurrent.ConcurrentSkipListMap$KeyIterator
-java.util.concurrent.ConcurrentSkipListMap$KeySet
java.util.concurrent.ConcurrentSkipListMap$Node
java.util.concurrent.ConcurrentSkipListMap$ValueIterator
java.util.concurrent.ConcurrentSkipListMap$Values
-java.util.concurrent.ConcurrentSkipListSet
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArrayList$COWIterator
java.util.concurrent.CopyOnWriteArraySet
@@ -7642,8 +7444,6 @@
java.util.concurrent.Delayed
java.util.concurrent.ExecutionException
java.util.concurrent.Executor
-java.util.concurrent.ExecutorCompletionService
-java.util.concurrent.ExecutorCompletionService$QueueingFuture
java.util.concurrent.ExecutorService
java.util.concurrent.Executors
java.util.concurrent.Executors$DefaultThreadFactory
@@ -7655,10 +7455,8 @@
java.util.concurrent.ForkJoinPool$1
java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory
java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory
-java.util.concurrent.ForkJoinPool$ManagedBlocker
java.util.concurrent.ForkJoinTask
java.util.concurrent.ForkJoinTask$ExceptionNode
-java.util.concurrent.ForkJoinWorkerThread
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.FutureTask$WaitNode
@@ -7669,8 +7467,6 @@
java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.LinkedBlockingQueue$Itr
java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.Phaser
-java.util.concurrent.Phaser$QNode
java.util.concurrent.PriorityBlockingQueue
java.util.concurrent.RejectedExecutionException
java.util.concurrent.RejectedExecutionHandler
@@ -7685,6 +7481,7 @@
java.util.concurrent.Semaphore$NonfairSync
java.util.concurrent.Semaphore$Sync
java.util.concurrent.SynchronousQueue
+java.util.concurrent.SynchronousQueue$TransferQueue
java.util.concurrent.SynchronousQueue$TransferStack
java.util.concurrent.SynchronousQueue$TransferStack$SNode
java.util.concurrent.SynchronousQueue$Transferer
@@ -7712,8 +7509,7 @@
java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl
java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl$1
java.util.concurrent.atomic.AtomicLong
-java.util.concurrent.atomic.AtomicLongFieldUpdater
-java.util.concurrent.atomic.AtomicLongFieldUpdater$CASUpdater
+java.util.concurrent.atomic.AtomicLongArray
java.util.concurrent.atomic.AtomicReference
java.util.concurrent.atomic.AtomicReferenceArray
java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -7738,12 +7534,15 @@
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.BinaryOperator
java.util.function.Consumer
java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
java.util.function.Function
java.util.function.IntBinaryOperator
java.util.function.IntConsumer
@@ -7752,6 +7551,7 @@
java.util.function.IntToLongFunction
java.util.function.IntUnaryOperator
java.util.function.LongBinaryOperator
+java.util.function.LongConsumer
java.util.function.LongUnaryOperator
java.util.function.Predicate
java.util.function.Supplier
@@ -7774,6 +7574,9 @@
java.util.jar.Manifest
java.util.jar.Manifest$FastInputStream
java.util.logging.ErrorManager
+java.util.logging.FileHandler
+java.util.logging.FileHandler$InitializationErrorManager
+java.util.logging.FileHandler$MeteredStream
java.util.logging.Filter
java.util.logging.Formatter
java.util.logging.Handler
@@ -7797,6 +7600,9 @@
java.util.logging.Logger$LoggerBundle
java.util.logging.LoggingPermission
java.util.logging.LoggingProxyImpl
+java.util.logging.SimpleFormatter
+java.util.logging.StreamHandler
+java.util.logging.XMLFormatter
java.util.prefs.AbstractPreferences
java.util.prefs.FileSystemPreferences
java.util.prefs.Preferences
@@ -7805,40 +7611,94 @@
java.util.regex.Matcher$OffsetBasedMatchResult
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
-java.util.stream.-$Lambda$155$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$41$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$67$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$89$qTstLJg88fs2C3g6LH-R51vCVP0
+java.util.stream.-$Lambda$DJvCeprCIGMk0JvfSkTmQUmEYKA$1
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$12
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$5
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$6
+java.util.stream.-$Lambda$RYrQKhHyGc-mMxiERR98xxRAWkA$5
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$3
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$7
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$21
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$22
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$26
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$4
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$5
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$51
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$54
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$67
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$83
java.util.stream.AbstractPipeline
+java.util.stream.AbstractSpinedBuffer
java.util.stream.BaseStream
java.util.stream.Collector
java.util.stream.Collector$Characteristics
java.util.stream.Collectors
java.util.stream.Collectors$CollectorImpl
+java.util.stream.DistinctOps
+java.util.stream.DistinctOps$1
+java.util.stream.DistinctOps$1$2
java.util.stream.DoubleStream
+java.util.stream.FindOps
+java.util.stream.FindOps$FindOp
+java.util.stream.FindOps$FindSink
+java.util.stream.FindOps$FindSink$OfRef
java.util.stream.ForEachOps
java.util.stream.ForEachOps$ForEachOp
java.util.stream.ForEachOps$ForEachOp$OfRef
+java.util.stream.IntPipeline
+java.util.stream.IntPipeline$4
+java.util.stream.IntPipeline$4$1
+java.util.stream.IntPipeline$Head
+java.util.stream.IntPipeline$StatelessOp
java.util.stream.IntStream
+java.util.stream.LongPipeline
+java.util.stream.LongPipeline$StatelessOp
java.util.stream.LongStream
+java.util.stream.Node
+java.util.stream.Node$Builder
+java.util.stream.Node$Builder$OfInt
+java.util.stream.Node$OfDouble
+java.util.stream.Node$OfInt
+java.util.stream.Node$OfLong
+java.util.stream.Node$OfPrimitive
+java.util.stream.Nodes
+java.util.stream.Nodes$EmptyNode
+java.util.stream.Nodes$EmptyNode$OfDouble
+java.util.stream.Nodes$EmptyNode$OfInt
+java.util.stream.Nodes$EmptyNode$OfLong
+java.util.stream.Nodes$EmptyNode$OfRef
+java.util.stream.Nodes$IntSpinedNodeBuilder
java.util.stream.PipelineHelper
java.util.stream.ReduceOps
java.util.stream.ReduceOps$3
java.util.stream.ReduceOps$3ReducingSink
+java.util.stream.ReduceOps$8
+java.util.stream.ReduceOps$8ReducingSink
java.util.stream.ReduceOps$AccumulatingSink
java.util.stream.ReduceOps$Box
java.util.stream.ReduceOps$ReduceOp
java.util.stream.ReferencePipeline
java.util.stream.ReferencePipeline$2
java.util.stream.ReferencePipeline$2$1
+java.util.stream.ReferencePipeline$3
+java.util.stream.ReferencePipeline$3$1
+java.util.stream.ReferencePipeline$4
+java.util.stream.ReferencePipeline$4$1
+java.util.stream.ReferencePipeline$5
+java.util.stream.ReferencePipeline$5$1
java.util.stream.ReferencePipeline$Head
java.util.stream.ReferencePipeline$StatefulOp
java.util.stream.ReferencePipeline$StatelessOp
java.util.stream.Sink
+java.util.stream.Sink$ChainedInt
java.util.stream.Sink$ChainedReference
+java.util.stream.Sink$OfInt
+java.util.stream.Sink$OfLong
java.util.stream.SliceOps
java.util.stream.SliceOps$1
java.util.stream.SliceOps$1$1
+java.util.stream.SpinedBuffer$OfInt
+java.util.stream.SpinedBuffer$OfPrimitive
java.util.stream.Stream
java.util.stream.StreamOpFlag
java.util.stream.StreamOpFlag$MaskBuilder
@@ -7852,7 +7712,6 @@
java.util.zip.Adler32
java.util.zip.CRC32
java.util.zip.CheckedInputStream
-java.util.zip.CheckedOutputStream
java.util.zip.Checksum
java.util.zip.DataFormatException
java.util.zip.Deflater
@@ -7866,14 +7725,12 @@
java.util.zip.ZipCoder
java.util.zip.ZipConstants
java.util.zip.ZipEntry
-java.util.zip.ZipError
java.util.zip.ZipException
java.util.zip.ZipFile
java.util.zip.ZipFile$ZipEntryIterator
java.util.zip.ZipFile$ZipFileInflaterInputStream
java.util.zip.ZipFile$ZipFileInputStream
java.util.zip.ZipInputStream
-java.util.zip.ZipOutputStream
java.util.zip.ZipUtils
javax.crypto.BadPaddingException
javax.crypto.Cipher
@@ -7883,8 +7740,6 @@
javax.crypto.Cipher$NeedToSet
javax.crypto.Cipher$SpiAndProviderUpdater
javax.crypto.Cipher$Transform
-javax.crypto.CipherInputStream
-javax.crypto.CipherOutputStream
javax.crypto.CipherSpi
javax.crypto.IllegalBlockSizeException
javax.crypto.JarVerifier
@@ -7898,8 +7753,6 @@
javax.crypto.NullCipher
javax.crypto.SecretKey
javax.crypto.ShortBufferException
-javax.crypto.interfaces.PBEKey
-javax.crypto.spec.GCMParameterSpec
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.OAEPParameterSpec
javax.crypto.spec.PBEParameterSpec
@@ -7925,7 +7778,6 @@
javax.net.ssl.HandshakeCompletedListener
javax.net.ssl.HostnameVerifier
javax.net.ssl.HttpsURLConnection
-javax.net.ssl.HttpsURLConnection$NoPreloadHolder
javax.net.ssl.KeyManager
javax.net.ssl.KeyManagerFactory
javax.net.ssl.KeyManagerFactory$1
@@ -7936,7 +7788,6 @@
javax.net.ssl.SSLContextSpi
javax.net.ssl.SSLEngine
javax.net.ssl.SSLException
-javax.net.ssl.SSLHandshakeException
javax.net.ssl.SSLParameters
javax.net.ssl.SSLPeerUnverifiedException
javax.net.ssl.SSLProtocolException
@@ -7962,19 +7813,11 @@
javax.security.cert.CertificateException
javax.security.cert.X509Certificate
javax.sip.SipException
-javax.xml.parsers.DocumentBuilder
-javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.ParserConfigurationException
javax.xml.parsers.SAXParser
javax.xml.parsers.SAXParserFactory
-javax.xml.transform.Result
-javax.xml.transform.Source
-javax.xml.transform.Transformer
javax.xml.transform.TransformerConfigurationException
javax.xml.transform.TransformerException
-javax.xml.transform.TransformerFactory
-javax.xml.transform.dom.DOMSource
-javax.xml.transform.stream.StreamResult
junit.framework.Assert
libcore.icu.CollationKeyICU
libcore.icu.DateIntervalFormat
@@ -8007,11 +7850,11 @@
libcore.io.IoUtils
libcore.io.IoUtils$FileReader
libcore.io.Libcore
+libcore.io.Linux
libcore.io.Memory
libcore.io.MemoryMappedFile
libcore.io.NioBufferIterator
libcore.io.Os
-libcore.io.Posix
libcore.io.Streams
libcore.math.MathUtils
libcore.net.MimeUtils
@@ -8020,15 +7863,12 @@
libcore.net.UriCodec
libcore.net.event.NetworkEventDispatcher
libcore.net.event.NetworkEventListener
-libcore.net.http.HttpDate
-libcore.net.http.HttpDate$1
libcore.reflect.AnnotatedElements
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
libcore.reflect.GenericArrayTypeImpl
libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
libcore.reflect.ListOfTypes
libcore.reflect.ListOfVariables
libcore.reflect.ParameterizedTypeImpl
@@ -8043,6 +7883,7 @@
libcore.util.NativeAllocationRegistry$CleanerRunner
libcore.util.NativeAllocationRegistry$CleanerThunk
libcore.util.Objects
+libcore.util.TimeZoneDataFiles
libcore.util.ZoneInfo
libcore.util.ZoneInfo$CheckedArithmeticException
libcore.util.ZoneInfo$OffsetInterval
@@ -8066,23 +7907,8 @@
org.apache.harmony.xml.ExpatParser$CurrentAttributes
org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.AttrImpl
-org.apache.harmony.xml.dom.CharacterDataImpl
-org.apache.harmony.xml.dom.DOMImplementationImpl
-org.apache.harmony.xml.dom.DocumentImpl
-org.apache.harmony.xml.dom.ElementImpl
-org.apache.harmony.xml.dom.ElementImpl$ElementAttrNamedNodeMapImpl
-org.apache.harmony.xml.dom.InnerNodeImpl
-org.apache.harmony.xml.dom.LeafNodeImpl
-org.apache.harmony.xml.dom.NodeImpl
-org.apache.harmony.xml.dom.NodeImpl$1
-org.apache.harmony.xml.dom.NodeListImpl
-org.apache.harmony.xml.dom.TextImpl
-org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
-org.apache.harmony.xml.parsers.DocumentBuilderImpl
org.apache.harmony.xml.parsers.SAXParserFactoryImpl
org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.http.ConnectionClosedException
org.apache.http.ConnectionReuseStrategy
org.apache.http.FormattedHeader
org.apache.http.Header
@@ -8106,9 +7932,7 @@
org.apache.http.HttpResponseInterceptor
org.apache.http.HttpServerConnection
org.apache.http.HttpVersion
-org.apache.http.MethodNotSupportedException
org.apache.http.NameValuePair
-org.apache.http.NoHttpResponseException
org.apache.http.ParseException
org.apache.http.ProtocolException
org.apache.http.ProtocolVersion
@@ -8132,15 +7956,11 @@
org.apache.http.client.UserTokenHandler
org.apache.http.client.entity.UrlEncodedFormEntity
org.apache.http.client.methods.AbortableHttpRequest
-org.apache.http.client.methods.HttpDelete
org.apache.http.client.methods.HttpEntityEnclosingRequestBase
org.apache.http.client.methods.HttpGet
-org.apache.http.client.methods.HttpHead
-org.apache.http.client.methods.HttpOptions
org.apache.http.client.methods.HttpPost
org.apache.http.client.methods.HttpPut
org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpTrace
org.apache.http.client.methods.HttpUriRequest
org.apache.http.client.params.HttpClientParams
org.apache.http.client.protocol.RequestAddCookies
@@ -8156,7 +7976,6 @@
org.apache.http.conn.ClientConnectionRequest
org.apache.http.conn.ConnectTimeoutException
org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionPoolTimeoutException
org.apache.http.conn.ConnectionReleaseTrigger
org.apache.http.conn.EofSensorInputStream
org.apache.http.conn.EofSensorWatcher
@@ -8178,7 +7997,6 @@
org.apache.http.conn.routing.RouteInfo$LayerType
org.apache.http.conn.routing.RouteInfo$TunnelType
org.apache.http.conn.routing.RouteTracker
-org.apache.http.conn.scheme.HostNameResolver
org.apache.http.conn.scheme.LayeredSocketFactory
org.apache.http.conn.scheme.PlainSocketFactory
org.apache.http.conn.scheme.Scheme
@@ -8235,7 +8053,6 @@
org.apache.http.impl.client.DefaultTargetAuthenticationHandler
org.apache.http.impl.client.DefaultUserTokenHandler
org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RedirectLocations
org.apache.http.impl.client.RequestWrapper
org.apache.http.impl.client.RoutedRequest
org.apache.http.impl.client.TunnelRefusedException
@@ -8260,7 +8077,6 @@
org.apache.http.impl.conn.tsccm.RouteSpecificPool
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
-org.apache.http.impl.conn.tsccm.WaitingThread
org.apache.http.impl.conn.tsccm.WaitingThreadAborter
org.apache.http.impl.cookie.AbstractCookieAttributeHandler
org.apache.http.impl.cookie.AbstractCookieSpec
@@ -8369,7 +8185,6 @@
org.apache.http.protocol.UriPatternMatcher
org.apache.http.util.ByteArrayBuffer
org.apache.http.util.CharArrayBuffer
-org.apache.http.util.EncodingUtils
org.apache.http.util.EntityUtils
org.apache.http.util.LangUtils
org.ccil.cowan.tagsoup.AttributesImpl
@@ -8395,19 +8210,6 @@
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.kxml2.io.KXmlSerializer
-org.w3c.dom.Attr
-org.w3c.dom.CharacterData
-org.w3c.dom.DOMImplementation
-org.w3c.dom.Document
-org.w3c.dom.DocumentFragment
-org.w3c.dom.DocumentType
-org.w3c.dom.Element
-org.w3c.dom.NamedNodeMap
-org.w3c.dom.Node
-org.w3c.dom.NodeList
-org.w3c.dom.ProcessingInstruction
-org.w3c.dom.Text
-org.w3c.dom.TypeInfo
org.xml.sax.Attributes
org.xml.sax.ContentHandler
org.xml.sax.DTDHandler
@@ -8420,6 +8222,9 @@
org.xml.sax.SAXNotSupportedException
org.xml.sax.SAXParseException
org.xml.sax.XMLReader
+org.xml.sax.ext.DeclHandler
+org.xml.sax.ext.DefaultHandler2
+org.xml.sax.ext.EntityResolver2
org.xml.sax.ext.LexicalHandler
org.xml.sax.helpers.AttributesImpl
org.xml.sax.helpers.DefaultHandler
@@ -8428,7 +8233,9 @@
org.xmlpull.v1.XmlPullParserFactory
org.xmlpull.v1.XmlSerializer
sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
sun.misc.ASCIICaseInsensitiveComparator
sun.misc.Cleaner
sun.misc.CompoundEnumeration
@@ -8465,13 +8272,17 @@
sun.net.www.ParseUtil
sun.net.www.protocol.file.Handler
sun.net.www.protocol.jar.Handler
+sun.nio.ch.AbstractPollArrayWrapper
+sun.nio.ch.AbstractPollSelectorImpl
+sun.nio.ch.AllocatedNativeObject
sun.nio.ch.ChannelInputStream
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
+sun.nio.ch.DefaultSelectorProvider
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
+sun.nio.ch.FileDescriptorHolderSocketImpl
sun.nio.ch.FileDispatcher
sun.nio.ch.FileDispatcherImpl
sun.nio.ch.FileKey
@@ -8481,16 +8292,31 @@
sun.nio.ch.IOUtil
sun.nio.ch.Interruptible
sun.nio.ch.NativeDispatcher
+sun.nio.ch.NativeObject
sun.nio.ch.NativeThread
sun.nio.ch.NativeThreadSet
sun.nio.ch.Net
+sun.nio.ch.Net$1
+sun.nio.ch.Net$4
+sun.nio.ch.PollArrayWrapper
+sun.nio.ch.PollSelectorImpl
+sun.nio.ch.PollSelectorProvider
sun.nio.ch.SelChImpl
+sun.nio.ch.SelectionKeyImpl
+sun.nio.ch.SelectorImpl
+sun.nio.ch.SelectorProviderImpl
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
+sun.nio.ch.SocketAdaptor
+sun.nio.ch.SocketAdaptor$1
+sun.nio.ch.SocketAdaptor$2
+sun.nio.ch.SocketAdaptor$SocketInputStream
sun.nio.ch.SocketChannelImpl
+sun.nio.ch.SocketDispatcher
sun.nio.ch.Util
sun.nio.ch.Util$1
+sun.nio.ch.Util$2
sun.nio.ch.Util$BufferCache
sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
@@ -8500,9 +8326,11 @@
sun.nio.cs.ThreadLocalCoders$1
sun.nio.cs.ThreadLocalCoders$2
sun.nio.cs.ThreadLocalCoders$Cache
+sun.nio.fs.AbstractBasicFileAttributeView
sun.nio.fs.AbstractFileSystemProvider
sun.nio.fs.AbstractPath
sun.nio.fs.DefaultFileSystemProvider
+sun.nio.fs.DynamicFileAttributeView
sun.nio.fs.LinuxFileSystem
sun.nio.fs.LinuxFileSystemProvider
sun.nio.fs.NativeBuffer
@@ -8512,7 +8340,10 @@
sun.nio.fs.UnixChannelFactory$Flags
sun.nio.fs.UnixConstants
sun.nio.fs.UnixException
+sun.nio.fs.UnixFileAttributeViews
+sun.nio.fs.UnixFileAttributeViews$Basic
sun.nio.fs.UnixFileAttributes
+sun.nio.fs.UnixFileAttributes$UnixAsBasicFileAttributes
sun.nio.fs.UnixFileModeAttribute
sun.nio.fs.UnixFileStoreAttributes
sun.nio.fs.UnixFileSystem
@@ -8523,6 +8354,7 @@
sun.nio.fs.Util
sun.reflect.misc.ReflectUtil
sun.security.action.GetBooleanAction
+sun.security.action.GetIntegerAction
sun.security.action.GetPropertyAction
sun.security.jca.GetInstance
sun.security.jca.GetInstance$Instance
@@ -8548,23 +8380,34 @@
sun.security.provider.certpath.AdaptableX509CertSelector
sun.security.provider.certpath.AlgorithmChecker
sun.security.provider.certpath.BasicChecker
+sun.security.provider.certpath.CertId
sun.security.provider.certpath.CertPathHelper
sun.security.provider.certpath.ConstraintsChecker
sun.security.provider.certpath.KeyChecker
+sun.security.provider.certpath.OCSP$RevocationStatus
+sun.security.provider.certpath.OCSP$RevocationStatus$CertStatus
+sun.security.provider.certpath.OCSPResponse
+sun.security.provider.certpath.OCSPResponse$ResponseStatus
+sun.security.provider.certpath.OCSPResponse$SingleResponse
sun.security.provider.certpath.PKIX
sun.security.provider.certpath.PKIX$ValidatorParams
sun.security.provider.certpath.PKIXCertPathValidator
sun.security.provider.certpath.PKIXMasterCertPathValidator
sun.security.provider.certpath.PolicyChecker
sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
+sun.security.provider.certpath.RevocationChecker
+sun.security.provider.certpath.RevocationChecker$1
+sun.security.provider.certpath.RevocationChecker$Mode
+sun.security.provider.certpath.RevocationChecker$RevocationProperties
sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
sun.security.util.AlgorithmDecomposer
sun.security.util.BitArray
sun.security.util.ByteArrayLexOrder
sun.security.util.ByteArrayTagOrder
sun.security.util.Cache
sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
sun.security.util.Debug
sun.security.util.DerEncoder
sun.security.util.DerIndefLenConverter
@@ -8573,9 +8416,10 @@
sun.security.util.DerOutputStream
sun.security.util.DerValue
sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
sun.security.util.KeyUtil
sun.security.util.Length
sun.security.util.ManifestDigester
@@ -8657,6 +8501,7 @@
sun.util.locale.BaseLocale
sun.util.locale.BaseLocale$Cache
sun.util.locale.BaseLocale$Key
+sun.util.locale.Extension
sun.util.locale.InternalLocaleBuilder
sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
sun.util.locale.LanguageTag
@@ -8667,9 +8512,11 @@
sun.util.locale.LocaleUtils
sun.util.locale.ParseStatus
sun.util.locale.StringTokenIterator
+sun.util.locale.UnicodeLocaleExtension
sun.util.logging.LoggingProxy
sun.util.logging.LoggingSupport
sun.util.logging.LoggingSupport$1
+sun.util.logging.LoggingSupport$2
sun.util.logging.PlatformLogger
sun.util.logging.PlatformLogger$1
sun.util.logging.PlatformLogger$JavaLoggerProxy
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 65e0b90..b439c1d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -7449,6 +7449,7 @@
}
/** @hide */
+ @Override
@NonNull public View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds) {
final View[] views = new View[viewIds.length];
final ArrayList<ViewRootImpl> roots =
@@ -7472,6 +7473,25 @@
/** @hide */
@Override
+ @Nullable public View findViewByAccessibilityIdTraversal(int viewId) {
+ final ArrayList<ViewRootImpl> roots =
+ WindowManagerGlobal.getInstance().getRootViews(getActivityToken());
+ for (int rootNum = 0; rootNum < roots.size(); rootNum++) {
+ final View rootView = roots.get(rootNum).getView();
+
+ if (rootView != null) {
+ final View view = rootView.findViewByAccessibilityIdTraversal(viewId);
+ if (view != null) {
+ return view;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /** @hide */
+ @Override
@NonNull public boolean[] getViewVisibility(@NonNull int[] viewIds) {
final boolean[] isVisible = new boolean[viewIds.length];
final View views[] = findViewsByAccessibilityIdTraversal(viewIds);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 928ef7e..01e4cceb 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3567,6 +3567,7 @@
try {
if (localLOGV) Slog.v(TAG, "Destroying service " + s);
s.onDestroy();
+ s.detachAndCleanUp();
Context context = s.getBaseContext();
if (context instanceof ContextImpl) {
final String who = s.getClassName();
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index b7f1068..a44bd03 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -25,6 +25,7 @@
import android.annotation.StyleRes;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.ResourceId;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -204,7 +205,7 @@
mAlert = AlertController.create(getContext(), this, getWindow());
}
- static int resolveDialogTheme(Context context, int themeResId) {
+ static @StyleRes int resolveDialogTheme(Context context, @StyleRes int themeResId) {
if (themeResId == THEME_TRADITIONAL) {
return R.style.Theme_Dialog_Alert;
} else if (themeResId == THEME_HOLO_DARK) {
@@ -215,7 +216,7 @@
return R.style.Theme_DeviceDefault_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
- } else if (Integer.compareUnsigned(themeResId, 0x01000000) >= 0) {
+ } else if (ResourceId.isValid(themeResId)) {
// start of real resource IDs.
return themeResId;
} else {
@@ -450,7 +451,7 @@
* @param context the parent context
*/
public Builder(Context context) {
- this(context, resolveDialogTheme(context, 0));
+ this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
}
/**
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index a155de3..268a105b 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -846,9 +846,8 @@
// Calling start activity from outside an activity without FLAG_ACTIVITY_NEW_TASK is
// generally not allowed, except if the caller specifies the task id the activity should
// be launched in.
- if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
- && (options == null
- || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
+ if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0
+ && options != null && ActivityOptions.fromBundle(options).getLaunchTaskId() == -1) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 943c572..b162cb1 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -34,6 +34,7 @@
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.pm.ApplicationInfo;
+import android.content.res.ResourceId;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@@ -169,7 +170,7 @@
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
if (createContextThemeWrapper) {
- if (themeResId == 0) {
+ if (themeResId == ResourceId.ID_NULL) {
final TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
themeResId = outValue.resourceId;
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 95d55dc..3e26e0f 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -2603,23 +2603,25 @@
f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f);
}
- boolean addedChild = false;
+ FragmentManagerNonConfig child;
if (f.mChildFragmentManager != null) {
f.mChildFragmentManager.saveNonConfig();
- FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig;
- if (child != null) {
- if (childFragments == null) {
- childFragments = new ArrayList<>();
- for (int j = 0; j < i; j++) {
- childFragments.add(null);
- }
- }
- childFragments.add(child);
- addedChild = true;
+ child = f.mChildFragmentManager.mSavedNonConfig;
+ } else {
+ // f.mChildNonConfig may be not null, when the parent fragment is
+ // in the backstack.
+ child = f.mChildNonConfig;
+ }
+
+ if (childFragments == null && child != null) {
+ childFragments = new ArrayList<>(mActive.size());
+ for (int j = 0; j < i; j++) {
+ childFragments.add(null);
}
}
- if (childFragments != null && !addedChild) {
- childFragments.add(null);
+
+ if (childFragments != null) {
+ childFragments.add(child);
}
}
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 3ed174b..c626ae9 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -2640,6 +2640,20 @@
}
/**
+ * @hide
+ */
+ public boolean suppressAlertingDueToGrouping() {
+ if (isGroupSummary()
+ && getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
+ return true;
+ } else if (isGroupChild()
+ && getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Builder class for {@link Notification} objects.
*
* Provides a convenient way to set the various fields of a {@link Notification} and generate
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index bc7fcf5..143d147 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -71,6 +71,7 @@
private static final String ATT_SHOW_BADGE = "show_badge";
private static final String ATT_USER_LOCKED = "locked";
private static final String ATT_GROUP = "group";
+ private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
private static final String DELIMITER = ",";
/**
@@ -140,6 +141,7 @@
private boolean mDeleted = DEFAULT_DELETED;
private String mGroup;
private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
+ private boolean mBlockableSystem = false;
/**
* Creates a notification channel.
@@ -199,6 +201,7 @@
}
mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
mLightColor = in.readInt();
+ mBlockableSystem = in.readBoolean();
}
@Override
@@ -249,6 +252,7 @@
dest.writeInt(0);
}
dest.writeInt(mLightColor);
+ dest.writeBoolean(mBlockableSystem);
}
/**
@@ -272,6 +276,12 @@
mDeleted = deleted;
}
+ /**
+ * @hide
+ */
+ public void setBlockableSystem(boolean blockableSystem) {
+ mBlockableSystem = blockableSystem;
+ }
// Modifiable by apps post channel creation
/**
@@ -421,7 +431,6 @@
this.mLockscreenVisibility = lockscreenVisibility;
}
-
/**
* Returns the id of this channel.
*/
@@ -549,6 +558,13 @@
/**
* @hide
*/
+ public boolean isBlockableSystem() {
+ return mBlockableSystem;
+ }
+
+ /**
+ * @hide
+ */
@SystemApi
public void populateFromXml(XmlPullParser parser) {
// Name, id, and importance are set in the constructor.
@@ -559,12 +575,13 @@
setSound(safeUri(parser, ATT_SOUND), safeAudioAttributes(parser));
enableLights(safeBool(parser, ATT_LIGHTS, false));
setLightColor(safeInt(parser, ATT_LIGHT_COLOR, DEFAULT_LIGHT_COLOR));
- enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
+ enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
setDeleted(safeBool(parser, ATT_DELETED, false));
setGroup(parser.getAttributeValue(null, ATT_GROUP));
lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
+ setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
}
/**
@@ -625,6 +642,9 @@
if (getGroup() != null) {
out.attribute(null, ATT_GROUP, getGroup());
}
+ if (isBlockableSystem()) {
+ out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
+ }
out.endTag(null, TAG_CHANNEL);
}
@@ -665,6 +685,7 @@
record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
record.put(ATT_DELETED, Boolean.toString(isDeleted()));
record.put(ATT_GROUP, getGroup());
+ record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
return record;
}
@@ -764,6 +785,7 @@
if (mVibrationEnabled != that.mVibrationEnabled) return false;
if (mShowBadge != that.mShowBadge) return false;
if (isDeleted() != that.isDeleted()) return false;
+ if (isBlockableSystem() != that.isBlockableSystem()) return false;
if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
return false;
@@ -802,6 +824,7 @@
result = 31 * result + (isDeleted() ? 1 : 0);
result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
+ result = 31 * result + (isBlockableSystem() ? 1 : 0);
return result;
}
@@ -824,6 +847,7 @@
", mDeleted=" + mDeleted +
", mGroup='" + mGroup + '\'' +
", mAudioAttributes=" + mAudioAttributes +
+ ", mBlockableSystem=" + mBlockableSystem +
'}';
}
}
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 10d6a7b..256c479 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -767,7 +767,15 @@
mStartCompatibility = getApplicationInfo().targetSdkVersion
< Build.VERSION_CODES.ECLAIR;
}
-
+
+ /**
+ * @hide
+ * Clean up any references to avoid leaks.
+ */
+ public final void detachAndCleanUp() {
+ mToken = null;
+ }
+
final String getClassName() {
return mClassName;
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index de80c36..9ae5d1c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -7609,22 +7609,6 @@
}
/**
- * STOPSHIP (b/37622682) Remove it before release.
- * @removed
- */
- public void setAffiliationIds(@NonNull ComponentName admin, @NonNull List<String> ids) {
- throwIfParentInstance("setAffiliationIds");
- if (ids == null) {
- throw new IllegalArgumentException("ids must not be null");
- }
- try {
- mService.setAffiliationIds(admin, ids);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an
* empty set if none have been set.
*/
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index c613d97..c99a1e4 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1682,11 +1682,6 @@
}
@Override
- public void setAutofillId(@NonNull ViewStructure parent, int virtualId) {
- setAutofillId(parent.getAutofillId(), virtualId);
- }
-
- @Override
public ViewStructure newChild(int index) {
ViewNode node = new ViewNode();
mNode.mChildren[index] = node;
diff --git a/core/java/android/app/job/JobServiceEngine.java b/core/java/android/app/job/JobServiceEngine.java
index b7d759b..ab94da8 100644
--- a/core/java/android/app/job/JobServiceEngine.java
+++ b/core/java/android/app/job/JobServiceEngine.java
@@ -55,21 +55,12 @@
*/
private static final int MSG_JOB_FINISHED = 2;
- /**
- * Context we are running in.
- */
- private final Service mService;
-
private final IJobService mBinder;
- /** Lock object for {@link #mHandler}. */
- private final Object mHandlerLock = new Object();
-
/**
* Handler we post jobs to. Responsible for calling into the client logic, and handling the
* callback to the system.
*/
- @GuardedBy("mHandlerLock")
JobHandler mHandler;
static final class JobInterface extends IJobService.Stub {
@@ -189,9 +180,8 @@
* @param service The {@link Service} that is creating this engine and in which it will run.
*/
public JobServiceEngine(Service service) {
- mService = service;
mBinder = new JobInterface(this);
- mHandler = new JobHandler(mService.getMainLooper());
+ mHandler = new JobHandler(service.getMainLooper());
}
/**
@@ -220,6 +210,9 @@
* information.
*/
public void jobFinished(JobParameters params, boolean needsReschedule) {
+ if (params == null) {
+ throw new NullPointerException("params");
+ }
Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
m.arg2 = needsReschedule ? 1 : 0;
m.sendToTarget();
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 52fa8a6..fd1b0e0 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
+import android.content.res.ResourceId;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
@@ -368,7 +369,7 @@
try {
Resources resources = context.getPackageManager().getResourcesForApplication(
providerInfo.applicationInfo);
- if (resourceId != 0) {
+ if (ResourceId.isValid(resourceId)) {
if (density < 0) {
density = 0;
}
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index f802e8d..914e8fd 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -47,7 +47,9 @@
private static final int DATA_TYPE_LOCAL_NAME_SHORT = 0x08;
private static final int DATA_TYPE_LOCAL_NAME_COMPLETE = 0x09;
private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;
- private static final int DATA_TYPE_SERVICE_DATA = 0x16;
+ private static final int DATA_TYPE_SERVICE_DATA_16_BIT = 0x16;
+ private static final int DATA_TYPE_SERVICE_DATA_32_BIT = 0x20;
+ private static final int DATA_TYPE_SERVICE_DATA_128_BIT = 0x21;
private static final int DATA_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF;
// Flags of the advertising data.
@@ -224,10 +226,16 @@
case DATA_TYPE_TX_POWER_LEVEL:
txPowerLevel = scanRecord[currentPos];
break;
- case DATA_TYPE_SERVICE_DATA:
- // The first two bytes of the service data are service data UUID in little
- // endian. The rest bytes are service data.
+ case DATA_TYPE_SERVICE_DATA_16_BIT:
+ case DATA_TYPE_SERVICE_DATA_32_BIT:
+ case DATA_TYPE_SERVICE_DATA_128_BIT:
int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
+ if (fieldType == DATA_TYPE_SERVICE_DATA_32_BIT) {
+ serviceUuidLength = BluetoothUuid.UUID_BYTES_32_BIT;
+ } else if (fieldType == DATA_TYPE_SERVICE_DATA_128_BIT) {
+ serviceUuidLength = BluetoothUuid.UUID_BYTES_128_BIT;
+ }
+
byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
serviceUuidLength);
ParcelUuid serviceDataUuid = BluetoothUuid.parseUuidFrom(
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 87e6a84..4cee2df 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -343,5 +343,5 @@
public abstract int getUidTargetSdkVersion(int uid);
/** Whether the binder caller can access instant apps. */
- public abstract boolean canAccessInstantApps(int callingUid);
+ public abstract boolean canAccessInstantApps(int callingUid, int userId);
}
diff --git a/core/java/android/content/res/ResourceId.java b/core/java/android/content/res/ResourceId.java
new file mode 100644
index 0000000..adb9cf1
--- /dev/null
+++ b/core/java/android/content/res/ResourceId.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 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 android.content.res;
+
+import android.annotation.AnyRes;
+
+/**
+ * Provides a set of utility methods for dealing with Resource IDs.
+ * @hide
+ */
+public final class ResourceId {
+
+ /**
+ * The {@code null} resource ID.
+ */
+ public static final @AnyRes int ID_NULL = 0;
+
+ /**
+ * Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
+ * <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
+ * validations that compare the {@code id} against {@code 0} are incorrect.</p>
+ * @param id The integer to validate.
+ * @return {@code true} if the integer is a valid resource ID.
+ */
+ public static boolean isValid(@AnyRes int id) {
+ // With the introduction of packages with IDs > 0x7f, resource IDs can be negative when
+ // represented as a signed Java int. Some legacy code assumes -1 is an invalid resource ID,
+ // despite the existing documentation.
+ return id != -1 && (id & 0xff000000) != 0 && (id & 0x00ff0000) != 0;
+ }
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index b559604..60226d5 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -151,7 +151,7 @@
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
int dark, int deviceDefault) {
- if (curTheme != 0) {
+ if (curTheme != ResourceId.ID_NULL) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
@@ -1760,7 +1760,9 @@
public final Theme newTheme() {
Theme theme = new Theme();
theme.setImpl(mResourcesImpl.newThemeImpl());
- mThemeRefs.add(new WeakReference<>(theme));
+ synchronized (mThemeRefs) {
+ mThemeRefs.add(new WeakReference<>(theme));
+ }
return theme;
}
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index b3adf82..23591c7 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -36,6 +36,7 @@
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
import android.icu.text.PluralRules;
import android.os.Build;
import android.os.LocaleList;
@@ -590,6 +591,7 @@
}
Drawable dr;
+ boolean needsNewDrawableAfterCache = false;
if (cs != null) {
dr = cs.newDrawable(wrapper);
} else if (isColorDrawable) {
@@ -597,6 +599,12 @@
} else {
dr = loadDrawableForCookie(wrapper, value, id, density, null);
}
+ // DrawableContainer' constant state has drawables instances. In order to leave the
+ // constant state intact in the cache, we need to create a new DrawableContainer after
+ // added to cache.
+ if (dr instanceof DrawableContainer) {
+ needsNewDrawableAfterCache = true;
+ }
// Determine if the drawable has unresolved theme attributes. If it
// does, we'll need to apply a theme and store it in a theme-specific
@@ -615,6 +623,12 @@
dr.setChangingConfigurations(value.changingConfigurations);
if (useCache) {
cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr);
+ if (needsNewDrawableAfterCache) {
+ Drawable.ConstantState state = dr.getConstantState();
+ if (state != null) {
+ dr = state.newDrawable(wrapper);
+ }
+ }
}
}
diff --git a/core/java/android/hardware/camera2/impl/CallbackProxies.java b/core/java/android/hardware/camera2/impl/CallbackProxies.java
index e6e448e..c9eecf1 100644
--- a/core/java/android/hardware/camera2/impl/CallbackProxies.java
+++ b/core/java/android/hardware/camera2/impl/CallbackProxies.java
@@ -88,7 +88,7 @@
}
@SuppressWarnings("deprecation")
- public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
+ public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
public DeviceCaptureCallbackProxy(
@@ -138,6 +138,13 @@
int sequenceId) {
mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
}
+
+ @Override
+ public void onCaptureBufferLost(CameraDevice camera,
+ CaptureRequest request, Surface target, long frameNumber) {
+ mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
+ }
+
}
public static class SessionStateCallbackProxy
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 16ffee0..b3938cb 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -452,6 +452,37 @@
private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
Handler handler, CaptureCallback callback) {
CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {
+
+ @Override
+ public void onCaptureStarted(CameraDevice camera,
+ CaptureRequest request, long timestamp, long frameNumber) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCapturePartial(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureResult result) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureProgressed(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureResult partialResult) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureCompleted(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.TotalCaptureResult result) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureFailed(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureFailure failure) {
+ // Do nothing
+ }
+
@Override
public void onCaptureSequenceCompleted(CameraDevice camera,
int sequenceId, long frameNumber) {
@@ -463,6 +494,13 @@
int sequenceId) {
finishPendingSequence(sequenceId);
}
+
+ @Override
+ public void onCaptureBufferLost(CameraDevice camera,
+ CaptureRequest request, Surface target, long frameNumber) {
+ // Do nothing
+ }
+
};
/*
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index ab87f15..0d5c5e3 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -1112,8 +1112,11 @@
* <p>A callback for tracking the progress of a {@link CaptureRequest}
* submitted to the camera device.</p>
*
+ * An interface instead of an abstract class because this is internal and
+ * we want to make sure we always implement all its callbacks until we reach
+ * the public layer.
*/
- public static abstract class CaptureCallback {
+ public interface CaptureCallback {
/**
* This constant is used to indicate that no images were captured for
@@ -1130,9 +1133,7 @@
* @see android.media.MediaActionSound
*/
public void onCaptureStarted(CameraDevice camera,
- CaptureRequest request, long timestamp, long frameNumber) {
- // default empty implementation
- }
+ CaptureRequest request, long timestamp, long frameNumber);
/**
* This method is called when some results from an image capture are
@@ -1141,9 +1142,7 @@
* @hide
*/
public void onCapturePartial(CameraDevice camera,
- CaptureRequest request, CaptureResult result) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureResult result);
/**
* This method is called when an image capture makes partial forward progress; some
@@ -1151,18 +1150,14 @@
*
*/
public void onCaptureProgressed(CameraDevice camera,
- CaptureRequest request, CaptureResult partialResult) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureResult partialResult);
/**
* This method is called when an image capture has fully completed and all the
* result metadata is available.
*/
public void onCaptureCompleted(CameraDevice camera,
- CaptureRequest request, TotalCaptureResult result) {
- // default empty implementation
- }
+ CaptureRequest request, TotalCaptureResult result);
/**
* This method is called instead of {@link #onCaptureCompleted} when the
@@ -1170,9 +1165,7 @@
* request.
*/
public void onCaptureFailed(CameraDevice camera,
- CaptureRequest request, CaptureFailure failure) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureFailure failure);
/**
* This method is called independently of the others in CaptureCallback,
@@ -1180,9 +1173,7 @@
* or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceCompleted(CameraDevice camera,
- int sequenceId, long frameNumber) {
- // default empty implementation
- }
+ int sequenceId, long frameNumber);
/**
* This method is called independently of the others in CaptureCallback,
@@ -1190,14 +1181,16 @@
* or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceAborted(CameraDevice camera,
- int sequenceId) {
- // default empty implementation
- }
+ int sequenceId);
+ /**
+ * This method is called independently of the others in CaptureCallback, if an output buffer
+ * is dropped for a particular capture request.
+ *
+ * Loss of metadata is communicated via onCaptureFailed, independently of any buffer loss.
+ */
public void onCaptureBufferLost(CameraDevice camera,
- CaptureRequest request, Surface target, long frameNumber) {
- // default empty implementation
- }
+ CaptureRequest request, Surface target, long frameNumber);
}
/**
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index b00e65a..324a08c 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -932,7 +932,6 @@
} else if (mAuthenticationCallback != null) {
mAuthenticationCallback.onAuthenticationError(clientErrMsgId,
getErrorString(errMsgId, vendorCode));
- mAuthenticationCallback = null;
} else if (mRemovalCallback != null) {
mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId,
getErrorString(errMsgId, vendorCode));
@@ -953,7 +952,6 @@
final AuthenticationResult result =
new AuthenticationResult(mCryptoObject, fp, userId);
mAuthenticationCallback.onAuthenticationSucceeded(result);
- mAuthenticationCallback = null;
}
}
diff --git a/core/java/android/nfc/IAppCallback.aidl b/core/java/android/nfc/IAppCallback.aidl
index c027d54..133146d 100644
--- a/core/java/android/nfc/IAppCallback.aidl
+++ b/core/java/android/nfc/IAppCallback.aidl
@@ -25,6 +25,6 @@
interface IAppCallback
{
BeamShareData createBeamShareData(byte peerLlcpVersion);
- void onNdefPushComplete(byte peerLlcpVersion);
- void onTagDiscovered(in Tag tag);
+ oneway void onNdefPushComplete(byte peerLlcpVersion);
+ oneway void onTagDiscovered(in Tag tag);
}
diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java
index 2c9ce3f..093a9b4 100644
--- a/core/java/android/nfc/NdefRecord.java
+++ b/core/java/android/nfc/NdefRecord.java
@@ -938,7 +938,7 @@
*/
void writeToByteBuffer(ByteBuffer buffer, boolean mb, boolean me) {
boolean sr = mPayload.length < 256;
- boolean il = mId.length > 0;
+ boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
byte flags = (byte)((mb ? FLAG_MB : 0) | (me ? FLAG_ME : 0) |
(sr ? FLAG_SR : 0) | (il ? FLAG_IL : 0) | mTnf);
@@ -966,7 +966,7 @@
int length = 3 + mType.length + mId.length + mPayload.length;
boolean sr = mPayload.length < 256;
- boolean il = mId.length > 0;
+ boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
if (!sr) length += 3;
if (il) length += 1;
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index fea64ec..141d33b 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -17,14 +17,14 @@
package android.os;
import android.annotation.MainThread;
+import android.annotation.Nullable;
import android.annotation.WorkerThread;
-
import java.util.ArrayDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
-import java.util.concurrent.Executor;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
@@ -232,6 +232,8 @@
private final AtomicBoolean mCancelled = new AtomicBoolean();
private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
+ private final Handler mHandler;
+
private static class SerialExecutor implements Executor {
final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
Runnable mActive;
@@ -277,15 +279,19 @@
FINISHED,
}
- private static Handler getHandler() {
+ private static Handler getMainHandler() {
synchronized (AsyncTask.class) {
if (sHandler == null) {
- sHandler = new InternalHandler();
+ sHandler = new InternalHandler(Looper.getMainLooper());
}
return sHandler;
}
}
+ private Handler getHandler() {
+ return mHandler;
+ }
+
/** @hide */
public static void setDefaultExecutor(Executor exec) {
sDefaultExecutor = exec;
@@ -295,6 +301,28 @@
* Creates a new asynchronous task. This constructor must be invoked on the UI thread.
*/
public AsyncTask() {
+ this((Looper) null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Handler handler) {
+ this(handler != null ? handler.getLooper() : null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Looper callbackLooper) {
+ mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
+ ? getMainHandler()
+ : new Handler(callbackLooper);
+
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
@@ -670,8 +698,8 @@
}
private static class InternalHandler extends Handler {
- public InternalHandler() {
- super(Looper.getMainLooper());
+ public InternalHandler(Looper looper) {
+ super(looper);
}
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 4bad7ab..a2fb9db 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -807,8 +807,20 @@
}
/**
- * Verifies the the current flash of the device is consistent with what
+ * True if Treble is enabled and required for this device.
+ *
+ * @hide
+ */
+ public static final boolean IS_TREBLE_ENABLED =
+ SystemProperties.getBoolean("ro.treble.enabled", false);
+
+ /**
+ * Verifies the current flash of the device is consistent with what
* was expected at build time.
+ *
+ * Treble devices will verify the Vendor Interface (VINTF). A device
+ * launched without Treble:
+ *
* 1) Checks that device fingerprint is defined and that it matches across
* various partitions.
* 2) Verifies radio and bootloader partitions are those expected in the build.
@@ -819,6 +831,17 @@
// Don't care on eng builds. Incremental build may trigger false negative.
if (IS_ENG) return true;
+ if (IS_TREBLE_ENABLED) {
+ int result = VintfObject.verify(new String[0]);
+
+ if (result != 0) {
+ Slog.e(TAG, "Vendor interface is incompatible, error="
+ + String.valueOf(result));
+ }
+
+ return result == 0;
+ }
+
final String system = SystemProperties.get("ro.build.fingerprint");
final String vendor = SystemProperties.get("ro.vendor.build.fingerprint");
final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint");
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 447f280..d2598c7 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -22,9 +22,12 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
+import android.view.Display;
+import android.view.WindowManager;
import libcore.io.Streams;
@@ -570,7 +573,16 @@
// Having set up the BCB (bootloader control block), go ahead and reboot
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- pm.reboot(PowerManager.REBOOT_RECOVERY_UPDATE);
+ String reason = PowerManager.REBOOT_RECOVERY_UPDATE;
+
+ // On TV, reboot quiescently if the screen is off
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
+ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ if (wm.getDefaultDisplay().getState() != Display.STATE_ON) {
+ reason += ",quiescent";
+ }
+ }
+ pm.reboot(reason);
throw new IOException("Reboot failed (no permissions?)");
}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index f503b3a..0611f17 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -342,6 +342,18 @@
private static volatile int sVmPolicyMask = 0;
private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;
+ /** {@hide} */
+ public interface ViolationListener {
+ public void onViolation(String message);
+ }
+
+ private static volatile ViolationListener sListener;
+
+ /** {@hide} */
+ public static void setViolationListener(ViolationListener listener) {
+ sListener = listener;
+ }
+
/**
* The number of threads trying to do an async dropbox write.
* Just to limit ourselves out of paranoia.
@@ -1581,6 +1593,9 @@
long timeSinceLastViolationMillis = lastViolationTime == 0 ?
Long.MAX_VALUE : (now - lastViolationTime);
+ if ((info.policy & PENALTY_LOG) != 0 && sListener != null) {
+ sListener.onViolation(info.crashInfo.stackTrace);
+ }
if ((info.policy & PENALTY_LOG) != 0 &&
timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
if (info.durationMillis != -1) {
@@ -2024,6 +2039,9 @@
}
}
+ if (penaltyLog && sListener != null) {
+ sListener.onViolation(originStack.toString());
+ }
if (penaltyLog && timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
Log.e(TAG, message, originStack);
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 5408e13..70ef035 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -8915,15 +8915,11 @@
* ambiguous then the activity should prompt the user for the recipient to send the message
* to.
* <p>
- * Voice Assistant may provide additional information to messaging app about which account
- * to use for sending a message by populating {@link #EXTRA_SENDER_ACCOUNT_HASH}.
- * <p>
* Output: nothing
*
* @see #EXTRA_RECIPIENT_CONTACT_URI
* @see #EXTRA_RECIPIENT_CONTACT_CHAT_ID
* @see #EXTRA_RECIPIENT_CONTACT_NAME
- * @see #EXTRA_SENDER_ACCOUNT_HASH
* @see #METADATA_ACCOUNT_TYPE
* @see #METADATA_MIMETYPE
*/
@@ -8982,21 +8978,6 @@
"android.provider.extra.RECIPIENT_CONTACT_NAME";
/**
- * This optional extra specifies the hash of the account that should be used by messaging
- * app for sending voice message with {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS}. The
- * value of this extra is a {@code String} and should be the value of {@link
- * android.accounts.Account#hashCode()} for some account returned by {@link
- * android.accounts.AccountManager#getAccounts()}.
- * <p>
- * If the extra is not specified, the app can decide which account to use.
- * <p>
- * If the account specified in the extra cannot be used for any reason (account missing, not
- * usable by the app, etc), the message should not be sent.
- */
- public static final String EXTRA_SENDER_ACCOUNT_HASH =
- "android.provider.extra.SENDER_ACCOUNT_HASH";
-
- /**
* A string associated with an {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS} activity
* describing {@link RawContacts#ACCOUNT_TYPE} for the corresponding Contacts Provider
* implementation.
diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java
index adf4938..480abc1 100644
--- a/core/java/android/util/proto/ProtoOutputStream.java
+++ b/core/java/android/util/proto/ProtoOutputStream.java
@@ -1593,7 +1593,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED64);
- writeRepeatedFixed64(id, val);
+ writeRepeatedFixed64Impl(id, val);
}
private void writeRepeatedFixed64Impl(int id, long val) {
@@ -1720,7 +1720,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED64);
- writeRepeatedSFixed64(id, val);
+ writeRepeatedSFixed64Impl(id, val);
}
private void writeRepeatedSFixed64Impl(int id, long val) {
@@ -1785,7 +1785,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BOOL);
- writeRepeatedBool(id, val);
+ writeRepeatedBoolImpl(id, val);
}
private void writeRepeatedBoolImpl(int id, boolean val) {
diff --git a/core/java/android/view/IPinnedStackController.aidl b/core/java/android/view/IPinnedStackController.aidl
index dbeb747..d2dcb56 100644
--- a/core/java/android/view/IPinnedStackController.aidl
+++ b/core/java/android/view/IPinnedStackController.aidl
@@ -30,6 +30,14 @@
oneway void setIsMinimized(boolean isMinimized);
/**
+ * Notifies the controller of the current min edge size, this is needed to allow the system to
+ * properly calculate the aspect ratio of the expanded PIP. The given {@param minEdgeSize} is
+ * always bounded to be larger than the default minEdgeSize, so the caller can call this method
+ * with 0 to reset to the default size.
+ */
+ oneway void setMinEdgeSize(int minEdgeSize);
+
+ /**
* @return what WM considers to be the current device rotation.
*/
int getDisplayRotation();
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index f987e4e..ad46d07 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -923,8 +923,11 @@
+ " include tag: <include layout=\"@layout/layoutID\" />");
}
- // Attempt to resolve the "?attr/name" string to an identifier.
- layout = context.getResources().getIdentifier(value.substring(1), null, null);
+ // Attempt to resolve the "?attr/name" string to an attribute
+ // within the default (e.g. application) package.
+ layout = context.getResources().getIdentifier(
+ value.substring(1), "attr", context.getPackageName());
+
}
// The layout might be referencing a theme attribute.
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 2c33b60..b57ac66 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -31,7 +31,7 @@
import android.graphics.Region;
import android.os.Build;
import android.os.Handler;
-import android.os.Message;
+import android.os.Looper;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
@@ -120,32 +120,11 @@
final Rect mTmpRect = new Rect();
final Configuration mConfiguration = new Configuration();
- static final int KEEP_SCREEN_ON_MSG = 1;
- static final int DRAW_FINISHED_MSG = 2;
-
int mSubLayer = APPLICATION_MEDIA_SUBLAYER;
boolean mIsCreating = false;
private volatile boolean mRtHandlingPositionUpdates = false;
- final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case KEEP_SCREEN_ON_MSG: {
- setKeepScreenOn(msg.arg1 != 0);
- } break;
- case DRAW_FINISHED_MSG: {
- mDrawFinished = true;
- if (mAttachedToWindow) {
- notifyDrawFinished();
- invalidate();
- }
- } break;
- }
- }
- };
-
private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener
= new ViewTreeObserver.OnScrollChangedListener() {
@Override
@@ -247,7 +226,6 @@
getViewRootImpl().addWindowStoppedCallback(this);
mWindowStopped = false;
- mParent.requestTransparentRegion(this);
mViewVisibility = getVisibility() == VISIBLE;
updateRequestedVisibility();
@@ -286,6 +264,22 @@
updateSurface();
}
+ private void performDrawFinished() {
+ if (mPendingReportDraws > 0) {
+ mDrawFinished = true;
+ if (mAttachedToWindow) {
+ mParent.requestTransparentRegion(SurfaceView.this);
+
+ notifyDrawFinished();
+ invalidate();
+ }
+ } else {
+ Log.e(TAG, System.identityHashCode(this) + "finished drawing"
+ + " but no pending report draw (extra call"
+ + " to draw completion runnable?)");
+ }
+ }
+
void notifyDrawFinished() {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
@@ -352,7 +346,7 @@
@Override
public boolean gatherTransparentRegion(Region region) {
- if (isAboveParent()) {
+ if (isAboveParent() || !mDrawFinished) {
return super.gatherTransparentRegion(region);
}
@@ -678,9 +672,16 @@
} finally {
mIsCreating = false;
if (mSurfaceControl != null && !mSurfaceCreated) {
- mSurfaceControl.destroy();
mSurface.release();
- mSurfaceControl = null;
+ // If we are not in the stopped state, then the destruction of the Surface
+ // represents a visual change we need to display, and we should go ahead
+ // and destroy the SurfaceControl. However if we are in the stopped state,
+ // we can just leave the Surface around so it can be a part of animations,
+ // and we let the life-time be tied to the parent surface.
+ if (!mWindowStopped) {
+ mSurfaceControl.destroy();
+ mSurfaceControl = null;
+ }
}
}
} catch (Exception ex) {
@@ -743,7 +744,9 @@
mDeferredDestroySurfaceControl = null;
}
- mHandler.sendEmptyMessage(DRAW_FINISHED_MSG);
+ runOnUiThread(() -> {
+ performDrawFinished();
+ });
}
private void setParentSpaceRectangle(Rect position, long frameNumber) {
@@ -872,6 +875,15 @@
+ "type=" + type, new Throwable());
}
+ private void runOnUiThread(Runnable runnable) {
+ Handler handler = getHandler();
+ if (handler != null && handler.getLooper() != Looper.myLooper()) {
+ handler.post(runnable);
+ } else {
+ runnable.run();
+ }
+ }
+
/**
* Check to see if the surface has fixed size dimensions or if the surface's
* dimensions are dimensions are dependent on its current layout.
@@ -952,9 +964,7 @@
@Override
public void setKeepScreenOn(boolean screenOn) {
- Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG);
- msg.arg1 = screenOn ? 1 : 0;
- mHandler.sendMessage(msg);
+ runOnUiThread(() -> SurfaceView.this.setKeepScreenOn(screenOn));
}
/**
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index c66bf874..25a58e6 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -872,6 +872,15 @@
}
}
+ /**
+ * Creates a {@link android.graphics.Bitmap.Config#HARDWARE} bitmap from the given
+ * RenderNode. Note that the RenderNode should be created as a root node (so x/y of 0,0), and
+ * not the RenderNode from a View.
+ **/
+ public static Bitmap createHardwareBitmap(RenderNode node, int width, int height) {
+ return nCreateHardwareBitmap(node.getNativeDisplayList(), width, height);
+ }
+
@Override
protected void finalize() throws Throwable {
try {
@@ -1015,4 +1024,6 @@
private static native int nCopySurfaceInto(Surface surface,
int srcLeft, int srcTop, int srcRight, int srcBottom, Bitmap bitmap);
+
+ private static native Bitmap nCreateHardwareBitmap(long renderNode, int width, int height);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5b51c16..a69b813 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -593,12 +593,12 @@
* a single tag using the {@link android.R.styleable#View_tag android:tag}
* attribute or multiple tags using the {@code <tag>} child element:
* <pre>
- * <View ...
+ * <View ...
* android:tag="@string/mytag_value" />
- * <View ...>
- * <tag android:id="@+id/mytag"
+ * <View ...>
+ * <tag android:id="@+id/mytag"
* android:value="@string/mytag_value" />
- * </View>
+ * </View>
* </pre>
* </p>
* <p>
@@ -628,11 +628,11 @@
* {@link android.R.styleable#Theme_colorAccent android:colorAccent} defined on
* the inflation context's theme (e.g. the Activity theme) will be preserved.
* <pre>
- * <LinearLayout
+ * <LinearLayout
* ...
* android:theme="@android:theme/ThemeOverlay.Material.Dark">
- * <View ...>
- * </LinearLayout>
+ * <View ...>
+ * </LinearLayout>
* </pre>
* </p>
*
@@ -964,115 +964,155 @@
private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
/**
- * This view contains an email address.
+ * Hint indicating that this view can be autofilled with an email address.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_EMAIL_ADDRESS}"
- * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_EMAIL_ADDRESS}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
/**
- * The view contains a real name.
+ * Hint indicating that this view can be autofilled with a user's real name.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_NAME}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_NAME}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_NAME = "name";
/**
- * The view contains a user name.
+ * Hint indicating that this view can be autofilled with a username.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_USERNAME}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_USERNAME}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_USERNAME = "username";
/**
- * The view contains a password.
+ * Hint indicating that this view can be autofilled with a password.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PASSWORD}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_PASSWORD}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_PASSWORD = "password";
/**
- * The view contains a phone number.
+ * Hint indicating that this view can be autofilled with a phone number.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PHONE}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_PHONE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_PHONE = "phone";
/**
- * The view contains a postal address.
+ * Hint indicating that this view can be autofilled with a postal address.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_ADDRESS}"
- * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_POSTAL_ADDRESS}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
/**
- * The view contains a postal code.
+ * Hint indicating that this view can be autofilled with a postal code.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_CODE}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_POSTAL_CODE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
/**
- * The view contains a credit card number.
+ * Hint indicating that this view can be autofilled with a credit card number.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_NUMBER}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_NUMBER}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
/**
- * The view contains a credit card security code.
+ * Hint indicating that this view can be autofilled with a credit card security code.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
/**
- * The view contains a credit card expiration date.
+ * Hint indicating that this view can be autofilled with a credit card expiration date.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>It should be used when the credit card expiration date is represented by just one view;
+ * if it is represented by more than one (for example, one view for the month and another view
+ * for the year), then each of these views should use the hint specific for the unit
+ * ({@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH},
+ * or {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}).
+ *
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE =
"creditCardExpirationDate";
/**
- * The view contains the month a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration month.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH =
"creditCardExpirationMonth";
/**
- * The view contains the year a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration year.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR =
"creditCardExpirationYear";
/**
- * The view contains the day a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration day.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
@@ -1189,7 +1229,8 @@
public @interface AutofillFlags {}
/**
- * Flag requesting you to add views not-important for autofill to the assist data.
+ * Flag requesting you to add views that are marked as not important for autofill
+ * (see {@link #setImportantForAutofill(int)}) to a {@link ViewStructure}.
*/
public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1;
@@ -7486,7 +7527,7 @@
* <li>Call {@link AutofillManager#commit()} when the autofill context
* of the view structure changed and you want the current autofill interaction if such
* to be commited.
- * <li>Call {@link AutofillManager#cancel()} ()} when the autofill context
+ * <li>Call {@link AutofillManager#cancel()} when the autofill context
* of the view structure changed and you want the current autofill interaction if such
* to be cancelled.
* <li> The {@code left} and {@code top} values set in
@@ -7516,15 +7557,22 @@
* <li>Passing the actual value to the equivalent setter in the view.
* </ol>
*
- * <p>For example, a text-field view would call:
+ * <p>For example, a text-field view could implement the method this way:
+ *
* <pre class="prettyprint">
- * CharSequence text = value.getTextValue();
- * if (text != null) {
- * setText(text);
+ * @Override
+ * public void autofill(AutofillValue value) {
+ * if (!value.isText() || !this.isEditable()) {
+ * return;
+ * }
+ * CharSequence text = value.getTextValue();
+ * if (text != null) {
+ * this.setText(text);
+ * }
* }
* </pre>
*
- * <p>If the value is updated asyncronously the next call to
+ * <p>If the value is updated asynchronously the next call to
* {@link AutofillManager#notifyValueChanged(View)} must happen <u>after</u> the value was
* changed to the autofilled value. If not, the view will not be considered autofilled.
*
@@ -7575,9 +7623,13 @@
}
/**
- * Describes the content of a view so that a autofill service can fill in the appropriate data.
+ * Gets the hints that help an {@link android.service.autofill.AutofillService} determine how
+ * to autofill the view with the user's data.
*
- * @return The hints set via the attribute or {@code null} if no hint it set.
+ * <p>See {@link #setAutofillHints(String...)} for more info about these hints.
+ *
+ * @return The hints set via the attribute or {@link #setAutofillHints(String...)}, or
+ * {@code null} if no hints were set.
*
* @attr ref android.R.styleable#View_autofillHints
*/
@@ -9242,8 +9294,26 @@
}
/**
- * Sets the hints that helps the autofill service to select the appropriate data to fill the
- * view.
+ * Sets the hints that help an {@link android.service.autofill.AutofillService} determine how
+ * to autofill the view with the user's data.
+ *
+ * <p>Typically, there is only one way to autofill a view, but there could be more than one.
+ * For example, if the application accepts either an username or email address to identify
+ * an user.
+ *
+ * <p>These hints are not validated by the Android System, but passed "as is" to the service.
+ * Hence, they can have any value, but it's recommended to use the {@code AUTOFILL_HINT_}
+ * constants such as:
+ * {@link #AUTOFILL_HINT_USERNAME}, {@link #AUTOFILL_HINT_PASSWORD},
+ * {@link #AUTOFILL_HINT_EMAIL_ADDRESS},
+ * {@link #AUTOFILL_HINT_NAME},
+ * {@link #AUTOFILL_HINT_PHONE},
+ * {@link #AUTOFILL_HINT_POSTAL_ADDRESS}, {@link #AUTOFILL_HINT_POSTAL_CODE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_NUMBER}, {@link #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH} or
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}.
*
* @param autofillHints The autofill hints to set. If the array is emtpy, {@code null} is set.
* @attr ref android.R.styleable#View_autofillHints
@@ -19801,18 +19871,23 @@
* Check whether we need to draw a default focus highlight when this view gets focused,
* which requires:
* <ul>
- * <li>In the background, {@link android.R.attr#state_focused} is not defined.</li>
+ * <li>In both background and foreground, {@link android.R.attr#state_focused}
+ * is not defined.</li>
* <li>This view is not in touch mode.</li>
* <li>This view doesn't opt out for a default focus highlight, via
* {@link #setDefaultFocusHighlightEnabled(boolean)}.</li>
* <li>This view is attached to window.</li>
* </ul>
* @return {@code true} if a default focus highlight is needed.
+ * @hide
*/
- private boolean isDefaultFocusHighlightNeeded(Drawable background) {
- final boolean hasFocusStateSpecified = background == null || !background.isStateful()
- || !background.hasFocusStateSpecified();
- return !isInTouchMode() && getDefaultFocusHighlightEnabled() && hasFocusStateSpecified
+ @TestApi
+ public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+ final boolean lackFocusState = (background == null || !background.isStateful()
+ || !background.hasFocusStateSpecified())
+ && (foreground == null || !foreground.isStateful()
+ || !foreground.hasFocusStateSpecified());
+ return !isInTouchMode() && getDefaultFocusHighlightEnabled() && lackFocusState
&& isAttachedToWindow() && sUseDefaultFocusHighlight;
}
@@ -19824,7 +19899,8 @@
*/
private void switchDefaultFocusHighlight() {
if (isFocused()) {
- final boolean needed = isDefaultFocusHighlightNeeded(mBackground);
+ final boolean needed = isDefaultFocusHighlightNeeded(mBackground,
+ mForegroundInfo == null ? null : mForegroundInfo.mDrawable);
final boolean active = mDefaultFocusHighlight != null;
if (needed && !active) {
setDefaultFocusHighlight(getDefaultFocusHighlightDrawable());
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 50593f2..09464eec4 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -57,6 +57,7 @@
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.view.animation.Transformation;
+
import com.android.internal.R;
import java.util.ArrayList;
@@ -7715,14 +7716,15 @@
mMarginFlags |= RIGHT_MARGIN_UNDEFINED_MASK;
rightMargin = DEFAULT_MARGIN_RESOLVED;
}
- startMargin = a.getDimensionPixelSize(
- R.styleable.ViewGroup_MarginLayout_layout_marginStart,
- DEFAULT_MARGIN_RELATIVE);
- endMargin = a.getDimensionPixelSize(
- R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
- DEFAULT_MARGIN_RELATIVE);
}
+ startMargin = a.getDimensionPixelSize(
+ R.styleable.ViewGroup_MarginLayout_layout_marginStart,
+ DEFAULT_MARGIN_RELATIVE);
+ endMargin = a.getDimensionPixelSize(
+ R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
+ DEFAULT_MARGIN_RELATIVE);
+
if (verticalMargin >= 0) {
topMargin = verticalMargin;
bottomMargin = verticalMargin;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 28ded55..a720aae 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2330,7 +2330,7 @@
// Remember if we must report the next draw.
if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
- mReportNextDraw = true;
+ reportNextDraw();
}
boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;
@@ -2731,11 +2731,8 @@
/**
* A count of the number of calls to pendingDrawFinished we
* require to notify the WM drawing is complete.
- *
- * This starts at 1, for the ViewRootImpl surface itself.
- * Subsurfaces may debt the value with drawPending.
*/
- int mDrawsNeededToReport = 1;
+ int mDrawsNeededToReport = 0;
/**
* Delay notifying WM of draw finished until
@@ -2761,7 +2758,7 @@
private void reportDrawFinished() {
try {
- mDrawsNeededToReport = 1;
+ mDrawsNeededToReport = 0;
mWindowSession.finishDrawing(mWindow);
} catch (RemoteException e) {
// Have fun!
@@ -3772,13 +3769,12 @@
args.recycle();
if (msg.what == MSG_RESIZED_REPORT) {
- mReportNextDraw = true;
+ reportNextDraw();
}
if (mView != null && framesChanged) {
forceLayout(mView);
}
-
requestLayout();
}
break;
@@ -7343,6 +7339,14 @@
return false;
}
+
+ private void reportNextDraw() {
+ if (mReportNextDraw == false) {
+ drawPending();
+ }
+ mReportNextDraw = true;
+ }
+
/**
* Force the window to report its next draw.
* <p>
@@ -7352,7 +7356,7 @@
* @hide
*/
public void setReportNextDraw() {
- mReportNextDraw = true;
+ reportNextDraw();
invalidate();
}
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 6bdc9ff..ddfe697 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -304,13 +304,6 @@
public abstract void setAutofillId(@NonNull AutofillId parentId, int virtualId);
/**
- * @deprecated - use {@link #setAutofillId(AutofillId, int)} instead
- * @hide
- */
- @Deprecated
- public abstract void setAutofillId(@NonNull ViewStructure parent, int virtualId);
-
- /**
* Sets the {@link View#getAutofillType()} that can be used to autofill this node.
*/
public abstract void setAutofillType(@View.AutofillType int type);
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index dc53c22..13ffeec 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -401,6 +401,13 @@
boolean isAnimatingLw();
/**
+ * @return Whether the window can affect SystemUI flags, meaning that SystemUI (system bars,
+ * for example) will be affected by the flags specified in this window. This is the
+ * case when the surface is on screen but not exiting.
+ */
+ boolean canAffectSystemUiFlags();
+
+ /**
* Is this window considered to be gone for purposes of layout?
*/
boolean isGoneForLayoutLw();
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 39ac399..a2aff93 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -186,6 +186,10 @@
@GuardedBy("mLock")
@Nullable private TrackedViews mTrackedViews;
+ /** Views that are only tracked because they are fillable and could be anchoring the UI. */
+ @GuardedBy("mLock")
+ @Nullable private ArraySet<AutofillId> mFillableIds;
+
/** @hide */
public interface AutofillClient {
/**
@@ -238,13 +242,22 @@
boolean isVisibleForAutofill();
/**
- * Find views by traversing the hierarchies of the client.
+ * Finds views by traversing the hierarchies of the client.
*
* @param viewIds The accessibility ids of the views to find
*
- * @return And array containing the views, or {@code null} if not found
+ * @return And array containing the views (empty if no views found).
*/
@NonNull View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds);
+
+ /**
+ * Finds a view by traversing the hierarchies of the client.
+ *
+ * @param viewId The accessibility id of the views to find
+ *
+ * @return The view, or {@code null} if not found
+ */
+ @Nullable View findViewByAccessibilityIdTraversal(int viewId);
}
/**
@@ -375,9 +388,10 @@
/**
* Explicitly requests a new autofill context.
*
- * <p>Normally, the autofill context is automatically started when autofillable views are
- * focused, but this method should be used in the cases where it must be explicitly requested,
- * like a view that provides a contextual menu allowing users to autofill the activity.
+ * <p>Normally, the autofill context is automatically started if necessary when
+ * {@link #notifyViewEntered(View)} is called, but this method should be used in the
+ * cases where it must be explicitly started. For example, when the view offers an AUTOFILL
+ * option on its contextual overflow menu, and the user selects it.
*
* @param view view requesting the new autofill context.
*/
@@ -388,16 +402,29 @@
/**
* Explicitly requests a new autofill context for virtual views.
*
- * <p>Normally, the autofill context is automatically started when autofillable views are
- * focused, but this method should be used in the cases where it must be explicitly requested,
- * like a virtual view that provides a contextual menu allowing users to autofill the activity.
+ * <p>Normally, the autofill context is automatically started if necessary when
+ * {@link #notifyViewEntered(View, int, Rect)} is called, but this method should be used in the
+ * cases where it must be explicitly started. For example, when the virtual view offers an
+ * AUTOFILL option on its contextual overflow menu, and the user selects it.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
- * @param bounds child boundaries, relative to the top window.
+ * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+ * parent view uses {@code bounds} to draw the virtual view inside its Canvas,
+ * the absolute bounds could be calculated by:
+ *
+ * <pre class="prettyprint">
+ * int offset[] = new int[2];
+ * getLocationOnScreen(offset);
+ * Rect absBounds = new Rect(bounds.left + offset[0],
+ * bounds.top + offset[1],
+ * bounds.right + offset[0], bounds.bottom + offset[1]);
+ * </pre>
+ *
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param absBounds absolute boundaries of the virtual view in the screen.
*/
- public void requestAutofill(@NonNull View view, int childId, @NonNull Rect bounds) {
- notifyViewEntered(view, childId, bounds, FLAG_MANUAL_REQUEST);
+ public void requestAutofill(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+ notifyViewEntered(view, virtualId, absBounds, FLAG_MANUAL_REQUEST);
}
/**
@@ -471,8 +498,17 @@
*/
public void notifyViewVisibilityChange(@NonNull View view, boolean isVisible) {
synchronized (mLock) {
- if (mEnabled && mSessionId != NO_SESSION && mTrackedViews != null) {
- mTrackedViews.notifyViewVisibilityChange(view, isVisible);
+ if (mEnabled && mSessionId != NO_SESSION) {
+ if (!isVisible && mFillableIds != null) {
+ final AutofillId id = view.getAutofillId();
+ if (mFillableIds.contains(id)) {
+ if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible");
+ requestHideFillUi(id, view);
+ }
+ }
+ if (mTrackedViews != null) {
+ mTrackedViews.notifyViewVisibilityChange(view, isVisible);
+ }
}
}
}
@@ -480,15 +516,27 @@
/**
* Called when a virtual view that supports autofill is entered.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
- * @param bounds child boundaries, relative to the top window.
+ * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+ * parent, non-virtual view uses {@code bounds} to draw the virtual view inside its Canvas,
+ * the absolute bounds could be calculated by:
+ *
+ * <pre class="prettyprint">
+ * int offset[] = new int[2];
+ * getLocationOnScreen(offset);
+ * Rect absBounds = new Rect(bounds.left + offset[0],
+ * bounds.top + offset[1],
+ * bounds.right + offset[0], bounds.bottom + offset[1]);
+ * </pre>
+ *
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param absBounds absolute boundaries of the virtual view in the screen.
*/
- public void notifyViewEntered(@NonNull View view, int childId, @NonNull Rect bounds) {
- notifyViewEntered(view, childId, bounds, 0);
+ public void notifyViewEntered(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+ notifyViewEntered(view, virtualId, absBounds, 0);
}
- private void notifyViewEntered(View view, int childId, Rect bounds, int flags) {
+ private void notifyViewEntered(View view, int virtualId, Rect bounds, int flags) {
if (!hasAutofillFeature()) {
return;
}
@@ -501,7 +549,7 @@
callback = mCallback;
}
} else {
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
if (mSessionId == NO_SESSION) {
// Starts new session.
@@ -514,7 +562,7 @@
}
if (callback != null) {
- callback.onAutofillEvent(view, childId,
+ callback.onAutofillEvent(view, virtualId,
AutofillCallback.EVENT_INPUT_UNAVAILABLE);
}
}
@@ -522,10 +570,10 @@
/**
* Called when a virtual view that supports autofill is exited.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
*/
- public void notifyViewExited(@NonNull View view, int childId) {
+ public void notifyViewExited(@NonNull View view, int virtualId) {
if (!hasAutofillFeature()) {
return;
}
@@ -533,7 +581,7 @@
ensureServiceClientAddedIfNeededLocked();
if (mEnabled && mSessionId != NO_SESSION) {
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
// Update focus on existing session.
updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
@@ -593,13 +641,13 @@
}
/**
- * Called to indicate the value of an autofillable virtual {@link View} changed.
+ * Called to indicate the value of an autofillable virtual view has changed.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
* @param value new value of the child.
*/
- public void notifyValueChanged(View view, int childId, AutofillValue value) {
+ public void notifyValueChanged(View view, int virtualId, AutofillValue value) {
if (!hasAutofillFeature()) {
return;
}
@@ -608,7 +656,7 @@
return;
}
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -743,8 +791,8 @@
return new AutofillId(view.getAccessibilityViewId());
}
- private static AutofillId getAutofillId(View parent, int childId) {
- return new AutofillId(parent.getAccessibilityViewId(), childId);
+ private static AutofillId getAutofillId(View parent, int virtualId) {
+ return new AutofillId(parent.getAccessibilityViewId(), virtualId);
}
private void startSessionLocked(@NonNull AutofillId id, @NonNull Rect bounds,
@@ -1048,9 +1096,10 @@
*
* @param trackedIds The views to be tracked
* @param saveOnAllViewsInvisible Finish the session once all tracked views are invisible.
+ * @param fillableIds Views that might anchor FillUI.
*/
- private void setTrackedViews(int sessionId, List<AutofillId> trackedIds,
- boolean saveOnAllViewsInvisible) {
+ private void setTrackedViews(int sessionId, @Nullable AutofillId[] trackedIds,
+ boolean saveOnAllViewsInvisible, @Nullable AutofillId[] fillableIds) {
synchronized (mLock) {
if (mEnabled && mSessionId == sessionId) {
if (saveOnAllViewsInvisible) {
@@ -1058,15 +1107,32 @@
} else {
mTrackedViews = null;
}
+ if (fillableIds != null) {
+ if (mFillableIds == null) {
+ mFillableIds = new ArraySet<>(fillableIds.length);
+ }
+ for (AutofillId id : fillableIds) {
+ mFillableIds.add(id);
+ }
+ if (sVerbose) {
+ Log.v(TAG, "setTrackedViews(): fillableIds=" + fillableIds
+ + ", mFillableIds" + mFillableIds);
+ }
+ }
}
}
}
- private void requestHideFillUi(int sessionId, AutofillId id) {
+ private void requestHideFillUi(AutofillId id) {
final View anchor = findView(id);
+ if (sVerbose) Log.v(TAG, "requestHideFillUi(" + id + "): anchor = " + anchor);
if (anchor == null) {
return;
}
+ requestHideFillUi(id, anchor);
+ }
+
+ private void requestHideFillUi(AutofillId id, View anchor) {
AutofillCallback callback = null;
synchronized (mLock) {
@@ -1123,6 +1189,18 @@
*
* @return The array of viewIds.
*/
+ // TODO: move to Helper as static method
+ @NonNull private int[] getViewIds(@NonNull AutofillId[] autofillIds) {
+ final int numIds = autofillIds.length;
+ final int[] viewIds = new int[numIds];
+ for (int i = 0; i < numIds; i++) {
+ viewIds[i] = autofillIds[i].getViewId();
+ }
+
+ return viewIds;
+ }
+
+ // TODO: move to Helper as static method
@NonNull private int[] getViewIds(@NonNull List<AutofillId> autofillIds) {
final int numIds = autofillIds.size();
final int[] viewIds = new int[numIds];
@@ -1147,7 +1225,7 @@
return null;
}
- return client.findViewsByAccessibilityIdTraversal(new int[]{autofillId.getViewId()})[0];
+ return client.findViewByAccessibilityIdTraversal(autofillId.getViewId());
}
/** @hide */
@@ -1173,6 +1251,7 @@
*
* @return {@code true} iff set is not empty and value is in set
*/
+ // TODO: move to Helper as static method
private <T> boolean isInSet(@Nullable ArraySet<T> set, T value) {
return set != null && set.contains(value);
}
@@ -1186,6 +1265,7 @@
* @return The set including the new value. If set was {@code null}, a set containing only
* the new value.
*/
+ // TODO: move to Helper as static method
@NonNull
private <T> ArraySet<T> addToSet(@Nullable ArraySet<T> set, T valueToAdd) {
if (set == null) {
@@ -1206,6 +1286,7 @@
* @return The set without the removed value. {@code null} if set was null, or is empty
* after removal.
*/
+ // TODO: move to Helper as static method
@Nullable
private <T> ArraySet<T> removeFromSet(@Nullable ArraySet<T> set, T valueToRemove) {
if (set == null) {
@@ -1226,11 +1307,8 @@
*
* @param trackedIds The views to be tracked
*/
- TrackedViews(List<AutofillId> trackedIds) {
- mVisibleTrackedIds = null;
- mInvisibleTrackedIds = null;
-
- AutofillClient client = getClientLocked();
+ TrackedViews(@Nullable AutofillId[] trackedIds) {
+ final AutofillClient client = getClientLocked();
if (trackedIds != null && client != null) {
final boolean[] isVisible;
@@ -1238,12 +1316,12 @@
isVisible = client.getViewVisibility(getViewIds(trackedIds));
} else {
// All false
- isVisible = new boolean[trackedIds.size()];
+ isVisible = new boolean[trackedIds.length];
}
- final int numIds = trackedIds.size();
+ final int numIds = trackedIds.length;
for (int i = 0; i < numIds; i++) {
- final AutofillId id = trackedIds.get(i);
+ final AutofillId id = trackedIds[i];
if (isVisible[i]) {
mVisibleTrackedIds = addToSet(mVisibleTrackedIds, id);
@@ -1294,6 +1372,9 @@
}
if (mVisibleTrackedIds == null) {
+ if (sVerbose) {
+ Log.v(TAG, "No more visible ids. Invisibile = " + mInvisibleTrackedIds);
+ }
finishSessionLocked();
}
}
@@ -1415,11 +1496,12 @@
* Called after a change in the autofill state associated with a virtual view.
*
* @param view parent view associated with the change.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param virtualId id identifying the virtual child inside the parent view.
*
* @param event currently either {@link #EVENT_INPUT_SHOWN} or {@link #EVENT_INPUT_HIDDEN}.
*/
- public void onAutofillEvent(@NonNull View view, int childId, @AutofillEventType int event) {
+ public void onAutofillEvent(@NonNull View view, int virtualId,
+ @AutofillEventType int event) {
}
}
@@ -1473,8 +1555,7 @@
public void requestHideFillUi(int sessionId, AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.requestHideFillUi(sessionId, id));
+ afm.mContext.getMainThreadHandler().post(() -> afm.requestHideFillUi(id));
}
}
@@ -1501,12 +1582,12 @@
}
@Override
- public void setTrackedViews(int sessionId, List<AutofillId> ids,
- boolean saveOnAllViewsInvisible) {
+ public void setTrackedViews(int sessionId, AutofillId[] ids,
+ boolean saveOnAllViewsInvisible, AutofillId[] fillableIds) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible)
+ afm.mContext.getMainThreadHandler().post(() ->
+ afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible, fillableIds)
);
}
}
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 1d66f7f..d18b181 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -52,8 +52,8 @@
* Sets the views to track. If saveOnAllViewsInvisible is set and all these view are invisible
* the session is finished automatically.
*/
- void setTrackedViews(int sessionId, in List<AutofillId> ids,
- boolean saveOnAllViewsInvisible);
+ void setTrackedViews(int sessionId, in @nullable AutofillId[] savableIds,
+ boolean saveOnAllViewsInvisible, in @nullable AutofillId[] fillableIds);
/**
* Requests showing the fill UI.
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 32fae73..ab1d034 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -67,11 +67,6 @@
CharSequence text, int startIndex, int endIndex, LocaleList defaultLocales) {
return TextClassification.EMPTY;
}
-
- @Override
- public LinksInfo getLinks(CharSequence text, int linkMask, LocaleList defaultLocales) {
- return LinksInfo.NO_OP;
- }
};
/**
@@ -138,8 +133,10 @@
* @hide
*/
@WorkerThread
- LinksInfo getLinks(
- @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales);
+ default LinksInfo getLinks(
+ @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales) {
+ return LinksInfo.NO_OP;
+ }
/**
* Logs a TextClassifier event.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index ecb25fe..dda5df6 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2654,19 +2654,23 @@
* {@link ViewStructure#setAutofillHints(String[])}.
* <li>The {@code type} attribute of {@code INPUT} tags maps to
* {@link ViewStructure#setInputType(int)}.
- * <li>The {@code value} attribute maps to {@link ViewStructure#setText(CharSequence)}.
+ * <li>The {@code value} attribute of {@code INPUT} tags maps to
+ * {@link ViewStructure#setText(CharSequence)}.
+ * <li>If the view is editalbe, the {@link ViewStructure#setAutofillType(int)} and
+ * {@link ViewStructure#setAutofillValue(AutofillValue)} must be set.
* <li>The {@code placeholder} attribute maps to {@link ViewStructure#setHint(CharSequence)}.
- * <li>{@link ViewStructure#setDataIsSensitive(boolean)} whould only be called with
- * {@code true} for form fields whose {@code value} attribute was not pre-loaded.
* <li>Other HTML attributes can be represented through
* {@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}.
* </ol>
*
+ * <p>It should also call {@code structure.setDataIsSensitive(false)} for fields whose value
+ * were not dynamically changed (for example, through Javascript).
+ *
* <p>Example1: an HTML form with 2 fields for username and password.
*
* <pre class="prettyprint">
- * <input type="text" name="username" id="user" value="mr.sparkle" autocomplete="username" placeholder="Email or username">
- * <input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password">
+ * <input type="text" name="username" id="user" value="Type your username" autocomplete="username" placeholder="Email or username">
+ * <input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password">
* </pre>
*
* <p>Would map to:
@@ -2674,38 +2678,40 @@
* <pre class="prettyprint">
* int index = structure.addChildCount(2);
* ViewStructure username = structure.newChild(index);
- * username.setAutofillId(structure, 1); // id 1 - first child
+ * username.setAutofillId(structure.getAutofillId(), 1); // id 1 - first child
* username.setClassName("input");
* username.setInputType("android.widget.EditText");
* username.setAutofillHints("username");
- * username.setHtmlInfo(child.newHtmlInfoBuilder("input")
+ * username.setHtmlInfo(username.newHtmlInfoBuilder("input")
+ * .addAttribute("type", "text")
* .addAttribute("name", "username")
* .addAttribute("id", "user")
* .build());
* username.setHint("Email or username");
* username.setAutofillType(View.AUTOFILL_TYPE_TEXT);
- * username.setAutofillValue(AutofillValue.forText("mr.sparkle"));
- * username.setText("mr.sparkle");
- * username.setDataIsSensitive(true); // Contains real username, which is sensitive
+ * username.setAutofillValue(AutofillValue.forText("Type your username"));
+ * username.setText("Type your username");
+ * // Value of the field is not sensitive because it was not dynamically changed:
+ * username.setDataIsSensitive(false);
*
* ViewStructure password = structure.newChild(index + 1);
* username.setAutofillId(structure, 2); // id 2 - second child
* password.setInputType("android.widget.EditText");
* password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
* password.setAutofillHints("current-password");
- * password.setHtmlInfo(child.newHtmlInfoBuilder("input")
+ * password.setHtmlInfo(password.newHtmlInfoBuilder("input")
+ * .addAttribute("type", "password")
* .addAttribute("name", "password")
* .addAttribute("id", "pass")
* .build());
* password.setHint("Password");
* password.setAutofillType(View.AUTOFILL_TYPE_TEXT);
- * password.setDataIsSensitive(false); // Value is not set
* </pre>
*
* <p>Example2: an IFRAME tag.
*
* <pre class="prettyprint">
- * <iframe src="https://example.com/login"/>
+ * <iframe src="https://example.com/login"/>
* </pre>
*
* <p>Would map to:
@@ -2713,8 +2719,9 @@
* <pre class="prettyprint">
* int index = structure.addChildCount(1);
* ViewStructure iframe = structure.newChildFor(index);
- * iframe.setHtmlInfo(child.newHtmlInfoBuilder("iframe")
- * .addAttribute("url", "https://example.com/login")
+ * iframe.setAutofillId(structure.getAutofillId(), 1);
+ * iframe.setHtmlInfo(iframe.newHtmlInfoBuilder("iframe")
+ * .addAttribute("src", "https://example.com/login")
* .build());
* </pre>
*/
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 9a39a17..121a8c5 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -24,6 +24,8 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
@@ -403,6 +405,7 @@
}
popupWindow.getListView().setContentDescription(mContext.getString(
R.string.activitychooserview_choose_application));
+ popupWindow.getListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
}
}
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index ca1bf58..636519b 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -112,6 +112,7 @@
// Set up and attach container.
mContainer = (ViewGroup) inflater.inflate(layoutResourceId, mDelegator, false);
+ mContainer.setSaveFromParentEnabled(false);
mDelegator.addView(mContainer);
// Set up header views.
diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java
index fc2d1fa..4f9316f 100644
--- a/core/java/android/widget/DatePickerSpinnerDelegate.java
+++ b/core/java/android/widget/DatePickerSpinnerDelegate.java
@@ -115,7 +115,8 @@
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(layoutResourceId, mDelegator, true);
+ final View view = inflater.inflate(layoutResourceId, mDelegator, true);
+ view.setSaveFromParentEnabled(false);
OnValueChangeListener onChangeListener = new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 57818e2..1dc5b44 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -19,6 +19,7 @@
import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -1640,4 +1641,13 @@
super.encodeProperties(stream);
stream.addProperty("layout:baseline", getBaseline());
}
+
+ /** @hide */
+ @Override
+ @TestApi
+ public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+ final boolean lackFocusState = mDrawable == null || !mDrawable.isStateful()
+ || !mDrawable.hasFocusStateSpecified();
+ return super.isDefaultFocusHighlightNeeded(background, foreground) && lackFocusState;
+ }
}
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 3d54fe7..142412a 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -73,9 +73,10 @@
// Do not call the TextClassifier if there is no selection.
startActionMode(null);
} else {
- resetTextClassificationHelper();
+ resetTextClassificationHelper(true /* resetSelectionTag */);
+ final TextView tv = mEditor.getTextView();
mTextClassificationAsyncTask = new TextClassificationAsyncTask(
- mEditor.getTextView(),
+ tv,
TIMEOUT_DURATION,
adjustSelection
? mTextClassificationHelper::suggestSelection
@@ -92,7 +93,7 @@
// Do not call the TextClassifier if there is no selection.
invalidateActionMode(null);
} else {
- resetTextClassificationHelper();
+ resetTextClassificationHelper(false /* resetSelectionTag */);
mTextClassificationAsyncTask = new TextClassificationAsyncTask(
mEditor.getTextView(), TIMEOUT_DURATION,
mTextClassificationHelper::classifyText, this::invalidateActionMode)
@@ -101,12 +102,12 @@
}
public void onSelectionAction() {
- mSelectionTracker.onSelectionAction(mTextClassificationHelper.getClassifierTag());
+ mSelectionTracker.onSelectionAction(mTextClassificationHelper.getSelectionTag());
}
public boolean resetSelection(int textIndex) {
if (mSelectionTracker.resetSelection(
- textIndex, mEditor, mTextClassificationHelper.getClassifierTag())) {
+ textIndex, mEditor, mTextClassificationHelper.getSelectionTag())) {
invalidateActionModeAsync();
return true;
}
@@ -158,7 +159,7 @@
}
if (result != null) {
mSelectionTracker.onSelectionStarted(
- result.mStart, result.mEnd, mTextClassificationHelper.getClassifierTag());
+ result.mStart, result.mEnd, mTextClassificationHelper.getSelectionTag());
}
}
mEditor.setRestartActionModeOnNextRefresh(false);
@@ -174,15 +175,15 @@
final TextView textView = mEditor.getTextView();
mSelectionTracker.onSelectionUpdated(
textView.getSelectionStart(), textView.getSelectionEnd(),
- mTextClassificationHelper.getClassifierTag());
+ mTextClassificationHelper.getSelectionTag());
mTextClassificationAsyncTask = null;
}
- private void resetTextClassificationHelper() {
+ private void resetTextClassificationHelper(boolean resetSelectionTag) {
final TextView textView = mEditor.getTextView();
mTextClassificationHelper.reset(textView.getTextClassifier(), textView.getText(),
textView.getSelectionStart(), textView.getSelectionEnd(),
- textView.getTextLocales());
+ resetSelectionTag, textView.getTextLocales());
}
/**
@@ -195,10 +196,14 @@
// Log event: Smart selection happened.
private static final String LOG_EVENT_MULTI_SELECTION =
"textClassifier_multiSelection";
+ private static final String LOG_EVENT_SINGLE_SELECTION =
+ "textClassifier_singleSelection";
// Log event: Smart selection acted upon.
private static final String LOG_EVENT_MULTI_SELECTION_ACTION =
"textClassifier_multiSelection_action";
+ private static final String LOG_EVENT_SINGLE_SELECTION_ACTION =
+ "textClassifier_singleSelection_action";
// Log event: Smart selection was reset to original selection.
private static final String LOG_EVENT_MULTI_SELECTION_RESET =
@@ -207,6 +212,8 @@
// Log event: Smart selection was user modified.
private static final String LOG_EVENT_MULTI_SELECTION_MODIFIED =
"textClassifier_multiSelection_modified";
+ private static final String LOG_EVENT_SINGLE_SELECTION_MODIFIED =
+ "textClassifier_singleSelection_modified";
private final TextClassifier mClassifier;
@@ -215,7 +222,8 @@
private int mSelectionStart;
private int mSelectionEnd;
- private boolean mSmartSelectionActive;
+ private boolean mMultiSelection;
+ private boolean mClassifierSelection;
SelectionTracker(TextClassifier classifier) {
mClassifier = classifier;
@@ -227,23 +235,26 @@
public void setOriginalSelection(int selectionStart, int selectionEnd) {
mOriginalStart = selectionStart;
mOriginalEnd = selectionEnd;
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
/**
- * Called when selection action mode is started.
+ * Called when selection action mode is started and the results come from a classifier.
* If the selection indices are different from the original selection indices, we have a
* smart selection.
*/
public void onSelectionStarted(int selectionStart, int selectionEnd, String logTag) {
+ mClassifierSelection = !logTag.isEmpty();
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
// If the started selection is different from the original selection, we have a
// smart selection.
- mSmartSelectionActive =
+ mMultiSelection =
mSelectionStart != mOriginalStart || mSelectionEnd != mOriginalEnd;
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION);
}
}
@@ -254,10 +265,12 @@
final boolean selectionChanged =
selectionStart != mSelectionStart || selectionEnd != mSelectionEnd;
if (selectionChanged) {
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_MODIFIED);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_MODIFIED);
}
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
}
@@ -265,15 +278,17 @@
* Called when the selection action mode is destroyed.
*/
public void onSelectionDestroyed() {
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
/**
* Logs if the action was taken on a smart selection.
*/
public void onSelectionAction(String logTag) {
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_ACTION);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_ACTION);
}
}
@@ -285,16 +300,21 @@
*/
public boolean resetSelection(int textIndex, Editor editor, String logTag) {
final CharSequence text = editor.getTextView().getText();
- if (mSmartSelectionActive
+ if (mMultiSelection
&& textIndex >= mSelectionStart && textIndex <= mSelectionEnd
&& text instanceof Spannable) {
// Only allow a reset once.
- mSmartSelectionActive = false;
+ resetSelectionFlags();
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_RESET);
return editor.selectCurrentWord();
}
return false;
}
+
+ private void resetSelectionFlags() {
+ mMultiSelection = false;
+ mClassifierSelection = false;
+ }
}
/**
@@ -321,6 +341,7 @@
@NonNull TextView textView, int timeOut,
@NonNull Supplier<SelectionResult> selectionResultSupplier,
@NonNull Consumer<SelectionResult> selectionResultCallback) {
+ super(textView != null ? textView.getHandler() : null);
mTextView = Preconditions.checkNotNull(textView);
mTimeOutDuration = timeOut;
mSelectionResultSupplier = Preconditions.checkNotNull(selectionResultSupplier);
@@ -372,7 +393,8 @@
/** End index relative to mText. */
private int mSelectionEnd;
private LocaleList mLocales;
- private String mClassifierTag = "";
+ /** A tag for the classifier that returned the latest smart selection. */
+ private String mSelectionTag = "";
/** Trimmed text starting from mTrimStart in mText. */
private CharSequence mTrimmedText;
@@ -392,12 +414,13 @@
TextClassificationHelper(TextClassifier textClassifier,
CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
- reset(textClassifier, text, selectionStart, selectionEnd, locales);
+ reset(textClassifier, text, selectionStart, selectionEnd, true, locales);
}
@UiThread
public void reset(TextClassifier textClassifier,
- CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
+ CharSequence text, int selectionStart, int selectionEnd,
+ boolean resetSelectionTag, LocaleList locales) {
mTextClassifier = Preconditions.checkNotNull(textClassifier);
mText = Preconditions.checkNotNull(text).toString();
mLastClassificationText = null; // invalidate.
@@ -405,6 +428,9 @@
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
mLocales = locales;
+ if (resetSelectionTag) {
+ mSelectionTag = "";
+ }
}
@WorkerThread
@@ -437,12 +463,12 @@
mTrimmedText, mRelativeStart, mRelativeEnd, mLocales);
mSelectionStart = Math.max(0, sel.getSelectionStartIndex() + mTrimStart);
mSelectionEnd = Math.min(mText.length(), sel.getSelectionEndIndex() + mTrimStart);
- mClassifierTag = sel.getSourceClassifier();
+ mSelectionTag = sel.getSourceClassifier();
return classifyText();
}
- String getClassifierTag() {
- return mClassifierTag;
+ String getSelectionTag() {
+ return mSelectionTag;
}
private void trimText() {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 3a4d008..de56092 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -746,17 +746,17 @@
// Default value for the step size in pixels.
private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
// Use this to specify that any of the auto-size configuration int values have not been set.
- private static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1;
+ private static final float UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1f;
// Auto-size text type.
private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
// Specify if auto-size text is needed.
private boolean mNeedsAutoSizeText = false;
// Step size for auto-sizing in pixels.
- private int mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Minimum text size for auto-sizing in pixels.
- private int mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Maximum text size for auto-sizing in pixels.
- private int mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from
// when auto-sizing text.
private int[] mAutoSizeTextSizesInPx = EmptyArray.INT;
@@ -987,9 +987,9 @@
CharSequence text = "";
CharSequence hint = null;
boolean password = false;
- int autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
- int autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
- int autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int inputType = EditorInfo.TYPE_NULL;
a = theme.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
@@ -1363,17 +1363,17 @@
break;
case com.android.internal.R.styleable.TextView_autoSizeStepGranularity:
- autoSizeStepGranularityInPx = a.getDimensionPixelSize(attr,
+ autoSizeStepGranularityInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMinTextSize:
- autoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr,
+ autoSizeMinTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize:
- autoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr,
+ autoSizeMaxTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
@@ -1692,14 +1692,14 @@
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
- autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics);
}
if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
- autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics);
@@ -1744,11 +1744,11 @@
break;
case AUTO_SIZE_TEXT_TYPE_UNIFORM:
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
- final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics);
- final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics);
@@ -1797,11 +1797,11 @@
int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) {
if (supportsAutoSizeText()) {
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
- final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMinTextSize, displayMetrics);
- final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMaxTextSize, displayMetrics);
- final int autoSizeStepGranularityInPx = (int) TypedValue.applyDimension(
+ final float autoSizeStepGranularityInPx = TypedValue.applyDimension(
unit, autoSizeStepGranularity, displayMetrics);
validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx,
@@ -1843,8 +1843,8 @@
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// Convert all to sizes to pixels.
for (int i = 0; i < presetSizesLength; i++) {
- presetSizesInPx[i] = (int) TypedValue.applyDimension(unit, presetSizes[i],
- displayMetrics);
+ presetSizesInPx[i] = Math.round(TypedValue.applyDimension(unit,
+ presetSizes[i], displayMetrics));
}
}
@@ -1886,7 +1886,7 @@
* @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
*/
public int getAutoSizeStepGranularity() {
- return mAutoSizeStepGranularityInPx;
+ return Math.round(mAutoSizeStepGranularityInPx);
}
/**
@@ -1899,7 +1899,7 @@
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMinTextSize() {
- return mAutoSizeMinTextSizeInPx;
+ return Math.round(mAutoSizeMinTextSizeInPx);
}
/**
@@ -1912,7 +1912,7 @@
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMaxTextSize() {
- return mAutoSizeMaxTextSizeInPx;
+ return Math.round(mAutoSizeMaxTextSizeInPx);
}
/**
@@ -1955,8 +1955,8 @@
*
* @throws IllegalArgumentException if any of the params are invalid
*/
- private void validateAndSetAutoSizeTextTypeUniformConfiguration(int autoSizeMinTextSizeInPx,
- int autoSizeMaxTextSizeInPx, int autoSizeStepGranularityInPx) {
+ private void validateAndSetAutoSizeTextTypeUniformConfiguration(float autoSizeMinTextSizeInPx,
+ float autoSizeMaxTextSizeInPx, float autoSizeStepGranularityInPx) {
// First validate.
if (autoSizeMinTextSizeInPx <= 0) {
throw new IllegalArgumentException("Minimum auto-size text size ("
@@ -2022,18 +2022,19 @@
// Calculate sizes to choose from based on the current auto-size configuration.
int autoSizeValuesLength = (int) Math.ceil(
(mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
- / (float) mAutoSizeStepGranularityInPx);
+ / mAutoSizeStepGranularityInPx);
// Also reserve a slot for the max size if it fits.
if ((mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
% mAutoSizeStepGranularityInPx == 0) {
autoSizeValuesLength++;
}
- mAutoSizeTextSizesInPx = new int[autoSizeValuesLength];
- int sizeToAdd = mAutoSizeMinTextSizeInPx;
+ int[] autoSizeTextSizesInPx = new int[autoSizeValuesLength];
+ float sizeToAdd = mAutoSizeMinTextSizeInPx;
for (int i = 0; i < autoSizeValuesLength; i++) {
- mAutoSizeTextSizesInPx[i] = sizeToAdd;
+ autoSizeTextSizesInPx[i] = Math.round(sizeToAdd);
sizeToAdd += mAutoSizeStepGranularityInPx;
}
+ mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(autoSizeTextSizesInPx);
}
mNeedsAutoSizeText = true;
@@ -8256,6 +8257,7 @@
* Automatically computes and sets the text size.
*/
private void autoSizeText() {
+ if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0) return;
final int maxWidth = getWidth() - getTotalPaddingLeft() - getTotalPaddingRight();
final int maxHeight = getHeight() - getExtendedPaddingBottom() - getExtendedPaddingTop();
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index 05d0f96..d3c83ee 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -137,6 +137,7 @@
final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout,
R.layout.time_picker_material);
final View mainView = inflater.inflate(layoutResourceId, delegator);
+ mainView.setSaveFromParentEnabled(false);
mRadialTimePickerHeader = mainView.findViewById(R.id.time_header);
mRadialTimePickerHeader.setOnTouchListener(new NearestTouchDelegate());
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java
index 813c30e3..7a7d9a9 100644
--- a/core/java/android/widget/TimePickerSpinnerDelegate.java
+++ b/core/java/android/widget/TimePickerSpinnerDelegate.java
@@ -83,7 +83,8 @@
a.recycle();
final LayoutInflater inflater = LayoutInflater.from(mContext);
- inflater.inflate(layoutResourceId, mDelegator, true);
+ final View view = inflater.inflate(layoutResourceId, mDelegator, true);
+ view.setSaveFromParentEnabled(false);
// hour
mHourSpinner = delegator.findViewById(R.id.hour);
diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java
index ee5f6fd..5ab17e44 100644
--- a/core/java/com/android/internal/app/ResolverListController.java
+++ b/core/java/com/android/internal/app/ResolverListController.java
@@ -99,6 +99,14 @@
| (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0)
| (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0)
| PackageManager.MATCH_INSTANT);
+ // Remove any activities that are not exported.
+ int totalSize = infos.size();
+ for (int j = totalSize - 1; j >= 0 ; j--) {
+ ResolveInfo info = infos.get(j);
+ if (info.activityInfo != null && !info.activityInfo.exported) {
+ infos.remove(j);
+ }
+ }
if (infos != null) {
if (resolvedComponents == null) {
resolvedComponents = new ArrayList<>();
diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java
index d279746..797cf2b 100644
--- a/core/java/com/android/internal/notification/SystemNotificationChannels.java
+++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java
@@ -47,7 +47,6 @@
public static String RETAIL_MODE = "RETAIL_MODE";
public static String USB = "USB";
public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
- public static String ALERT_WINDOW = "ALERT_WINDOW";
public static void createAll(Context context) {
final NotificationManager nm = context.getSystemService(NotificationManager.class);
@@ -138,11 +137,6 @@
context.getString(R.string.notification_channel_foreground_service),
NotificationManager.IMPORTANCE_MIN));
- channelsList.add(new NotificationChannel(
- ALERT_WINDOW,
- context.getString(R.string.alert_windows_notification_channel_name),
- NotificationManager.IMPORTANCE_MIN));
-
nm.createNotificationChannels(channelsList);
}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index f28e862..31064ac 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -185,7 +185,7 @@
switch (msg.what) {
case MSG_UPDATE_WAKELOCKS:
synchronized (BatteryStatsImpl.this) {
- updateCpuTimeLocked();
+ updateCpuTimeLocked(false /* updateCpuFreqData */);
}
if (cb != null) {
cb.batteryNeedsCpuUpdate();
@@ -3480,7 +3480,7 @@
Slog.d(TAG, "Updating cpu time because screen is now " +
(unpluggedScreenOff ? "off" : "on"));
}
- updateCpuTimeLocked();
+ updateCpuTimeLocked(true /* updateCpuFreqData */);
mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime);
for (int i = 0; i < mUidStats.size(); i++) {
mUidStats.valueAt(i).updateOnBatteryScreenOffBgTimeBase(uptime, realtime);
@@ -10002,7 +10002,7 @@
* and we are on battery with screen off, we give more of the cpu time to those apps holding
* wakelocks. If the screen is on, we just assign the actual cpu time an app used.
*/
- public void updateCpuTimeLocked() {
+ public void updateCpuTimeLocked(boolean updateCpuFreqData) {
if (mPowerProfile == null) {
return;
}
@@ -10049,7 +10049,7 @@
// Read the CPU data for each UID. This will internally generate a snapshot so next time
// we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise
// we just ignore the data.
- final long startTimeMs = mClocks.elapsedRealtime();
+ final long startTimeMs = mClocks.uptimeMillis();
mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
new KernelUidCpuTimeReader.Callback() {
@Override
@@ -10117,9 +10117,11 @@
}
});
- readKernelUidCpuFreqTimesLocked();
+ if (updateCpuFreqData) {
+ readKernelUidCpuFreqTimesLocked();
+ }
- final long elapse = (mClocks.elapsedRealtime() - startTimeMs);
+ final long elapse = (mClocks.uptimeMillis() - startTimeMs);
if (DEBUG_ENERGY_CPU || (elapse >= 100)) {
Slog.d(TAG, "Reading cpu stats took " + elapse + " ms");
}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index a9bec41..2013ac0 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -762,14 +762,6 @@
public static void applyInvokeWithSystemProperty(Arguments args) {
if (args.invokeWith == null && args.niceName != null) {
String property = "wrap." + args.niceName;
- if (property.length() > 31) {
- // Properties with a trailing "." are illegal.
- if (property.charAt(30) != '.') {
- property = property.substring(0, 31);
- } else {
- property = property.substring(0, 30);
- }
- }
args.invokeWith = SystemProperties.get(property);
if (args.invokeWith != null && args.invokeWith.length() == 0) {
args.invokeWith = null;
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 9823431..ba3aa36 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1759,8 +1759,9 @@
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
+ mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
final FloatingActionMode mode =
- new FloatingActionMode(mContext, callback, originatingView);
+ new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -1775,8 +1776,6 @@
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
- mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
- ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);
diff --git a/core/java/com/android/internal/util/DumpUtils.java b/core/java/com/android/internal/util/DumpUtils.java
index ce89501..66b777e 100644
--- a/core/java/com/android/internal/util/DumpUtils.java
+++ b/core/java/com/android/internal/util/DumpUtils.java
@@ -31,7 +31,7 @@
*/
public final class DumpUtils {
private static final String TAG = "DumpUtils";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private DumpUtils() {
}
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index effe219..ff211b6 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -16,6 +16,7 @@
package com.android.internal.view;
+import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
@@ -36,26 +37,26 @@
import java.util.Arrays;
-public class FloatingActionMode extends ActionMode {
+public final class FloatingActionMode extends ActionMode {
private static final int MAX_HIDE_DURATION = 3000;
private static final int MOVING_HIDE_DELAY = 50;
- private final Context mContext;
- private final ActionMode.Callback2 mCallback;
- private final MenuBuilder mMenu;
- private final Rect mContentRect;
- private final Rect mContentRectOnScreen;
- private final Rect mPreviousContentRectOnScreen;
- private final int[] mViewPositionOnScreen;
- private final int[] mPreviousViewPositionOnScreen;
- private final int[] mRootViewPositionOnScreen;
- private final Rect mViewRectOnScreen;
- private final Rect mPreviousViewRectOnScreen;
- private final Rect mScreenRect;
- private final View mOriginatingView;
+ @NonNull private final Context mContext;
+ @NonNull private final ActionMode.Callback2 mCallback;
+ @NonNull private final MenuBuilder mMenu;
+ @NonNull private final Rect mContentRect;
+ @NonNull private final Rect mContentRectOnScreen;
+ @NonNull private final Rect mPreviousContentRectOnScreen;
+ @NonNull private final int[] mViewPositionOnScreen;
+ @NonNull private final int[] mPreviousViewPositionOnScreen;
+ @NonNull private final int[] mRootViewPositionOnScreen;
+ @NonNull private final Rect mViewRectOnScreen;
+ @NonNull private final Rect mPreviousViewRectOnScreen;
+ @NonNull private final Rect mScreenRect;
+ @NonNull private final View mOriginatingView;
+ @NonNull private final Point mDisplaySize;
private final int mBottomAllowance;
- private final Point mDisplaySize;
private final Runnable mMovingOff = new Runnable() {
public void run() {
@@ -75,11 +76,12 @@
}
};
- private FloatingToolbar mFloatingToolbar;
- private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
+ @NonNull private FloatingToolbar mFloatingToolbar;
+ @NonNull private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
public FloatingActionMode(
- Context context, ActionMode.Callback2 callback, View originatingView) {
+ Context context, ActionMode.Callback2 callback,
+ View originatingView, FloatingToolbar floatingToolbar) {
mContext = Preconditions.checkNotNull(context);
mCallback = Preconditions.checkNotNull(callback);
mMenu = new MenuBuilder(context).setDefaultShowAsAction(
@@ -110,17 +112,13 @@
mBottomAllowance = context.getResources()
.getDimensionPixelSize(R.dimen.content_rect_bottom_clip_allowance);
mDisplaySize = new Point();
+ setFloatingToolbar(Preconditions.checkNotNull(floatingToolbar));
}
- public void setFloatingToolbar(FloatingToolbar floatingToolbar) {
+ private void setFloatingToolbar(FloatingToolbar floatingToolbar) {
mFloatingToolbar = floatingToolbar
.setMenu(mMenu)
- .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return mMenu.performItemAction(item, 0);
- }
- });
+ .setOnMenuItemClickListener(item -> mMenu.performItemAction(item, 0));
mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar);
mFloatingToolbarVisibilityHelper.activate();
}
@@ -142,21 +140,17 @@
@Override
public void invalidate() {
- checkToolbarInitialized();
mCallback.onPrepareActionMode(this, mMenu);
invalidateContentRect(); // Will re-layout and show the toolbar if necessary.
}
@Override
public void invalidateContentRect() {
- checkToolbarInitialized();
mCallback.onGetContentRect(this, mOriginatingView, mContentRect);
repositionToolbar();
}
public void updateViewLocationInWindow() {
- checkToolbarInitialized();
-
mOriginatingView.getLocationOnScreen(mViewPositionOnScreen);
mOriginatingView.getRootView().getLocationOnScreen(mRootViewPositionOnScreen);
mOriginatingView.getGlobalVisibleRect(mViewRectOnScreen);
@@ -172,8 +166,6 @@
}
private void repositionToolbar() {
- checkToolbarInitialized();
-
mContentRectOnScreen.set(mContentRect);
// Offset the content rect into screen coordinates, taking into account any transformations
@@ -235,8 +227,6 @@
@Override
public void hide(long duration) {
- checkToolbarInitialized();
-
if (duration == ActionMode.DEFAULT_HIDE_DURATION) {
duration = ViewConfiguration.getDefaultActionModeHideDuration();
}
@@ -253,14 +243,12 @@
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
- checkToolbarInitialized();
mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus);
mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
}
@Override
public void finish() {
- checkToolbarInitialized();
reset();
mCallback.onDestroyActionMode(this);
}
@@ -290,14 +278,6 @@
return new MenuInflater(mContext);
}
- /**
- * @throws IllegalStateException
- */
- private void checkToolbarInitialized() {
- Preconditions.checkState(mFloatingToolbar != null);
- Preconditions.checkState(mFloatingToolbarVisibilityHelper != null);
- }
-
private void reset() {
mFloatingToolbar.dismiss();
mFloatingToolbarVisibilityHelper.deactivate();
diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
index 65cd4fa2..5d7fa6a 100644
--- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
+++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
@@ -76,6 +76,7 @@
private final Rect mLastBaseContentInsets = new Rect();
private final Rect mContentInsets = new Rect();
private final Rect mBaseInnerInsets = new Rect();
+ private final Rect mLastBaseInnerInsets = new Rect();
private final Rect mInnerInsets = new Rect();
private final Rect mLastInnerInsets = new Rect();
@@ -323,6 +324,10 @@
mBaseInnerInsets.set(systemInsets);
computeFitSystemWindows(mBaseInnerInsets, mBaseContentInsets);
+ if (!mLastBaseInnerInsets.equals(mBaseInnerInsets)) {
+ changed = true;
+ mLastBaseContentInsets.set(mBaseContentInsets);
+ }
if (!mLastBaseContentInsets.equals(mBaseContentInsets)) {
changed = true;
mLastBaseContentInsets.set(mBaseContentInsets);
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 8c71cf7..40796e1 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -52,7 +52,6 @@
import android.view.animation.Transformation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -67,6 +66,7 @@
import com.android.internal.R;
import com.android.internal.util.Preconditions;
+import java.util.Objects;
/**
* A floating toolbar for showing contextual menu items.
@@ -82,12 +82,7 @@
public static final String FLOATING_TOOLBAR_TAG = "floating_toolbar";
private static final MenuItem.OnMenuItemClickListener NO_OP_MENUITEM_CLICK_LISTENER =
- new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return false;
- }
- };
+ item -> false;
private final Context mContext;
private final Window mWindow;
@@ -97,7 +92,7 @@
private final Rect mPreviousContentRect = new Rect();
private Menu mMenu;
- private List<Object> mShowingMenuItems = new ArrayList<Object>();
+ private List<MenuItem> mShowingMenuItems = new ArrayList<>();
private MenuItem.OnMenuItemClickListener mMenuItemClickListener = NO_OP_MENUITEM_CLICK_LISTENER;
private int mSuggestedWidth;
@@ -237,7 +232,7 @@
if (!isCurrentlyShowing(menuItems) || mWidthChanged) {
mPopup.dismiss();
mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth);
- mShowingMenuItems = getShowingMenuItemsReferences(menuItems);
+ mShowingMenuItems = menuItems;
}
if (!mPopup.isShowing()) {
mPopup.show(mContentRect);
@@ -252,7 +247,23 @@
* Returns true if this floating toolbar is currently showing the specified menu items.
*/
private boolean isCurrentlyShowing(List<MenuItem> menuItems) {
- return mShowingMenuItems.equals(getShowingMenuItemsReferences(menuItems));
+ if (mShowingMenuItems == null || menuItems.size() != mShowingMenuItems.size()) {
+ return false;
+ }
+
+ final int size = menuItems.size();
+ for (int i = 0; i < size; i++) {
+ final MenuItem menuItem = menuItems.get(i);
+ final MenuItem showingItem = mShowingMenuItems.get(i);
+ if (menuItem.getItemId() != showingItem.getItemId()
+ || !TextUtils.equals(menuItem.getTitle(), showingItem.getTitle())
+ || !Objects.equals(menuItem.getIcon(), showingItem.getIcon())
+ || menuItem.getGroupId() != showingItem.getGroupId()) {
+ return false;
+ }
+ }
+
+ return true;
}
/**
@@ -260,7 +271,7 @@
* This method is recursive.
*/
private List<MenuItem> getVisibleAndEnabledMenuItems(Menu menu) {
- List<MenuItem> menuItems = new ArrayList<MenuItem>();
+ List<MenuItem> menuItems = new ArrayList<>();
for (int i = 0; (menu != null) && (i < menu.size()); i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem.isVisible() && menuItem.isEnabled()) {
@@ -305,22 +316,6 @@
}
}
- private List<Object> getShowingMenuItemsReferences(List<MenuItem> menuItems) {
- List<Object> references = new ArrayList<Object>();
- for (MenuItem menuItem : menuItems) {
- if (menuItem.getItemId() != Menu.NONE) {
- references.add(menuItem.getItemId());
- } else if (!TextUtils.isEmpty(menuItem.getTitle())) {
- references.add(menuItem.getTitle());
- } else if (menuItem.getIcon() != null){
- references.add(menuItem.getIcon());
- } else {
- references.add(menuItem);
- }
- }
- return references;
- }
-
private void registerOrientationHandler() {
unregisterOrientationHandler();
mWindow.getDecorView().addOnLayoutChangeListener(mOrientationChangeHandler);
@@ -383,19 +378,15 @@
private final Point mCoordsOnWindow = new Point(); // popup window coordinates.
/* Temporary data holders. Reset values before using. */
private final int[] mTmpCoords = new int[2];
- private final Rect mTmpRect = new Rect();
private final Region mTouchableRegion = new Region();
private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
- new ViewTreeObserver.OnComputeInternalInsetsListener() {
- public void onComputeInternalInsets(
- ViewTreeObserver.InternalInsetsInfo info) {
- info.contentInsets.setEmpty();
- info.visibleInsets.setEmpty();
- info.touchableRegion.set(mTouchableRegion);
- info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo
- .TOUCHABLE_INSETS_REGION);
- }
+ info -> {
+ info.contentInsets.setEmpty();
+ info.visibleInsets.setEmpty();
+ info.touchableRegion.set(mTouchableRegion);
+ info.setTouchableInsets(
+ ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
};
private final int mLineHeight;
@@ -1407,18 +1398,15 @@
final ImageButton overflowButton = (ImageButton) LayoutInflater.from(mContext)
.inflate(R.layout.floating_popup_overflow_button, null);
overflowButton.setImageDrawable(mOverflow);
- overflowButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mIsOverflowOpen) {
- overflowButton.setImageDrawable(mToOverflow);
- mToOverflow.start();
- closeOverflow();
- } else {
- overflowButton.setImageDrawable(mToArrow);
- mToArrow.start();
- openOverflow();
- }
+ overflowButton.setOnClickListener(v -> {
+ if (mIsOverflowOpen) {
+ overflowButton.setImageDrawable(mToOverflow);
+ mToOverflow.start();
+ closeOverflow();
+ } else {
+ overflowButton.setImageDrawable(mToArrow);
+ mToArrow.start();
+ openOverflow();
}
});
return overflowButton;
@@ -1441,13 +1429,10 @@
};
overflowPanel.setAdapter(adapter);
- overflowPanel.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position);
- if (mOnMenuItemClickListener != null) {
- mOnMenuItemClickListener.onMenuItemClick(menuItem);
- }
+ overflowPanel.setOnItemClickListener((parent, view, position, id) -> {
+ MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position);
+ if (mOnMenuItemClickListener != null) {
+ mOnMenuItemClickListener.onMenuItemClick(menuItem);
}
});
@@ -1479,12 +1464,9 @@
public void onAnimationEnd(Animation animation) {
// Posting this because it seems like this is called before the animation
// actually ends.
- mContentContainer.post(new Runnable() {
- @Override
- public void run() {
- setPanelsStatesAtRestingPosition();
- setContentAreaAsTouchableSurface();
- }
+ mContentContainer.post(() -> {
+ setPanelsStatesAtRestingPosition();
+ setContentAreaAsTouchableSurface();
});
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index cab4758..eb11182 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -318,6 +318,13 @@
# is not being compiled with that level. Remove once this has changed.
LOCAL_CLANG_CFLAGS += -Wno-c++11-extensions
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_CFLAGS += -D__ANDROID_DEBUGGABLE__
+endif
+ifneq (,$(filter true, $(PRODUCT_FULL_TREBLE)))
+LOCAL_CFLAGS += -D__ANDROID_TREBLE__
+endif
+
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 369bb7f..785fd2c 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -16,7 +16,7 @@
#define ATRACE_TAG ATRACE_TAG_DALVIK
#define LOG_TAG "AndroidRuntime"
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#include <android_runtime/AndroidRuntime.h>
#include <binder/IBinder.h>
@@ -661,7 +661,7 @@
checkJni = true;
}
}
- ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
+ ALOGV("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
if (checkJni) {
/* extended JNI checking */
addOption("-Xcheck:jni");
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 0e67d30..b171a7e 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -1019,6 +1019,12 @@
///////////////////////////////////////////////////////////////////////////////
+// This is the maximum possible size because the SkColorSpace must be
+// representable (and therefore serializable) using a matrix and numerical
+// transfer function. If we allow more color space representations in the
+// framework, we may need to update this maximum size.
+static constexpr uint32_t kMaxColorSpaceSerializedBytes = 80;
+
static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
if (parcel == NULL) {
SkDebugf("-------- unparcel parcel is NULL\n");
@@ -1035,7 +1041,17 @@
if (kRGBA_F16_SkColorType == colorType) {
colorSpace = SkColorSpace::MakeSRGBLinear();
} else if (colorSpaceSize > 0) {
- colorSpace = SkColorSpace::Deserialize(p->readInplace(colorSpaceSize), colorSpaceSize);
+ if (colorSpaceSize > kMaxColorSpaceSerializedBytes) {
+ ALOGD("Bitmap_createFromParcel: Serialized SkColorSpace is larger than expected: "
+ "%d bytes\n", colorSpaceSize);
+ }
+
+ const void* data = p->readInplace(colorSpaceSize);
+ if (data) {
+ colorSpace = SkColorSpace::Deserialize(data, colorSpaceSize);
+ } else {
+ ALOGD("Bitmap_createFromParcel: Unable to read serialized SkColorSpace data\n");
+ }
}
const int width = p->readInt32();
const int height = p->readInt32();
@@ -1178,6 +1194,11 @@
size_t size = data->size();
p->writeUint32(size);
if (size > 0) {
+ if (size > kMaxColorSpaceSerializedBytes) {
+ ALOGD("Bitmap_writeToParcel: Serialized SkColorSpace is larger than expected: "
+ "%zu bytes\n", size);
+ }
+
p->write(data->data(), size);
}
} else {
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index 214d97c..5f803da 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -50,11 +50,14 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) {
- SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle);
+static void Shader_safeUnref(SkShader* shader) {
SkSafeUnref(shader);
}
+static jlong Shader_getNativeFinalizer(JNIEnv*, jobject) {
+ return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Shader_safeUnref));
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////
static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap,
@@ -284,7 +287,7 @@
};
static const JNINativeMethod gShaderMethods[] = {
- { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref },
+ { "nativeGetFinalizer", "()J", (void*)Shader_getNativeFinalizer },
};
static const JNINativeMethod gBitmapShaderMethods[] = {
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
index b6b1ac7..18cf8ca 100644
--- a/core/jni/android_hardware_Radio.cpp
+++ b/core/jni/android_hardware_Radio.cpp
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#define LOG_TAG "Radio-JNI"
#include <utils/Log.h>
@@ -955,7 +955,7 @@
int ret = RegisterMethodsOrDie(env, kRadioModuleClassPathName, gModuleMethods, NELEM(gModuleMethods));
- ALOGI("%s DONE", __FUNCTION__);
+ ALOGV("%s DONE", __FUNCTION__);
return ret;
}
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp
index dcb2300..19f779f 100644
--- a/core/jni/android_os_HwBinder.cpp
+++ b/core/jni/android_os_HwBinder.cpp
@@ -23,6 +23,8 @@
#include "android_os_HwParcel.h"
#include "android_os_HwRemoteBinder.h"
+#include <cstring>
+
#include <JNIHelp.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <android/hidl/base/1.0/IBase.h>
@@ -331,8 +333,19 @@
IServiceManager::Transport transport = transportRet;
- if ( transport != IServiceManager::Transport::EMPTY
- && transport != IServiceManager::Transport::HWBINDER) {
+#ifdef __ANDROID_TREBLE__
+#ifdef __ANDROID_DEBUGGABLE__
+ const char* testingOverride = std::getenv("TREBLE_TESTING_OVERRIDE");
+ const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY)
+ && testingOverride && !strcmp(testingOverride, "true");
+#else // __ANDROID_TREBLE__ but not __ANDROID_DEBUGGABLE__
+ const bool vintfLegacy = false;
+#endif // __ANDROID_DEBUGGABLE__
+#else // not __ANDROID_TREBLE__
+ const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY);
+#endif // __ANDROID_TREBLE__";
+
+ if (transport != IServiceManager::Transport::HWBINDER && !vintfLegacy) {
LOG(ERROR) << "service " << ifaceName << " declares transport method "
<< toString(transport) << " but framework expects hwbinder.";
signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index e1c0a21..192e3bb 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -25,6 +25,10 @@
#include <GraphicsJNI.h>
#include <ScopedPrimitiveArray.h>
+#include <gui/BufferItemConsumer.h>
+#include <gui/BufferQueue.h>
+#include <gui/Surface.h>
+
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <private/EGL/cache.h>
@@ -851,6 +855,75 @@
return RenderProxy::copySurfaceInto(surface, left, top, right, bottom, &bitmap);
}
+class ContextFactory : public IContextFactory {
+public:
+ virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
+ return new AnimationContext(clock);
+ }
+};
+
+static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode(JNIEnv* env,
+ jobject clazz, jlong renderNodePtr, jint jwidth, jint jheight) {
+ RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+ if (jwidth <= 0 || jheight <= 0) {
+ ALOGW("Invalid width %d or height %d", jwidth, jheight);
+ return nullptr;
+ }
+
+ uint32_t width = jwidth;
+ uint32_t height = jheight;
+
+ // Create a Surface wired up to a BufferItemConsumer
+ sp<IGraphicBufferProducer> producer;
+ sp<IGraphicBufferConsumer> rawConsumer;
+ BufferQueue::createBufferQueue(&producer, &rawConsumer);
+ rawConsumer->setMaxBufferCount(1);
+ sp<BufferItemConsumer> consumer = new BufferItemConsumer(rawConsumer,
+ GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER);
+ consumer->setDefaultBufferSize(width, height);
+ sp<Surface> surface = new Surface(producer);
+
+ // Render into the surface
+ {
+ ContextFactory factory;
+ RenderProxy proxy{false, renderNode, &factory};
+ proxy.loadSystemProperties();
+ proxy.setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
+ proxy.initialize(surface);
+ // Shadows can't be used via this interface, so just set the light source
+ // to all 0s.
+ proxy.setup(0, 0, 0);
+ proxy.setLightCenter((Vector3){0, 0, 0});
+ nsecs_t vsync = systemTime(CLOCK_MONOTONIC);
+ UiFrameInfoBuilder(proxy.frameInfo())
+ .setVsync(vsync, vsync)
+ .addFlag(FrameInfoFlags::SurfaceCanvas);
+ proxy.syncAndDrawFrame();
+ }
+
+ // Yank out the GraphicBuffer
+ BufferItem bufferItem;
+ status_t err;
+ if ((err = consumer->acquireBuffer(&bufferItem, 0, true)) != OK) {
+ ALOGW("Failed to acquireBuffer, error %d (%s)", err, strerror(-err));
+ return nullptr;
+ }
+ sp<GraphicBuffer> buffer = bufferItem.mGraphicBuffer;
+ // We don't really care if this fails or not since we're just going to destroy this anyway
+ consumer->releaseBuffer(bufferItem);
+ if (!buffer.get()) {
+ ALOGW("GraphicBuffer is null?");
+ return nullptr;
+ }
+ if (buffer->getWidth() != width || buffer->getHeight() != height) {
+ ALOGW("GraphicBuffer size mismatch, got %dx%d expected %dx%d",
+ buffer->getWidth(), buffer->getHeight(), width, height);
+ // Continue I guess?
+ }
+ sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer);
+ return createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_Mutable);
+}
+
// ----------------------------------------------------------------------------
// FrameMetricsObserver
// ----------------------------------------------------------------------------
@@ -947,6 +1020,8 @@
(void*)android_view_ThreadedRenderer_removeFrameMetricsObserver },
{ "nCopySurfaceInto", "(Landroid/view/Surface;IIIILandroid/graphics/Bitmap;)I",
(void*)android_view_ThreadedRenderer_copySurfaceInto },
+ { "nCreateHardwareBitmap", "(JII)Landroid/graphics/Bitmap;",
+ (void*)android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode },
};
int register_android_view_ThreadedRenderer(JNIEnv* env) {
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 6000fb5..d73e7dd 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -27,6 +27,7 @@
#include <fcntl.h>
#include <grp.h>
#include <inttypes.h>
+#include <malloc.h>
#include <mntent.h>
#include <paths.h>
#include <signal.h>
@@ -519,6 +520,9 @@
// The child process.
gMallocLeakZygoteChild = 1;
+ // Set the jemalloc decay time to 1.
+ mallopt(M_DECAY_TIME, 1);
+
// Clean up any descriptors which must be closed immediately
DetachDescriptors(env, fdsToClose);
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 18cfc99..f8044e2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1901,6 +1901,10 @@
android:description="@string/permdesc_useDataInBackground"
android:protectionLevel="normal" />
+ <!-- @hide Allows an application to set display offsets for the screen.
+ This permission is not available to third party applications. -->
+ <permission android:name="android.permission.SET_DISPLAY_OFFSET"
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
@@ -3317,12 +3321,16 @@
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
-
- <!-- Allows the holder to access the instant applications on the device.
+ <!-- Allows the holder to access and manage instant applications on the device.
@hide -->
<permission android:name="android.permission.ACCESS_INSTANT_APPS"
android:protectionLevel="signature|installer|verifier" />
+ <!-- Allows the holder to view the instant applications on the device.
+ @hide -->
+ <permission android:name="android.permission.VIEW_INSTANT_APPS"
+ android:protectionLevel="signature|preinstalled" />
+
<!-- Allows receiving the usage of media resource e.g. video/audio codec and
graphic memory.
@hide -->
diff --git a/core/res/res/layout/activity_chooser_view_list_item.xml b/core/res/res/layout/activity_chooser_view_list_item.xml
index 66e400a..4678f76 100644
--- a/core/res/res/layout/activity_chooser_view_list_item.xml
+++ b/core/res/res/layout/activity_chooser_view_list_item.xml
@@ -21,7 +21,7 @@
android:paddingStart="?attr/listPreferredItemPaddingStart"
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:minWidth="196dip"
- android:background="?attr/activatedBackgroundIndicator"
+ android:background="?attr/selectableItemBackground"
android:orientation="vertical" >
<LinearLayout
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 600b8fe..d78a980 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om taal en uitleg te kies"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Programaktiwiteit"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> word bo-oor ander programme gewys"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wys bo-oor ander programme"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SKAKEL AF"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index c42da99..475167e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ቋንቋ እና አቀማመጥን ለመምረጥ መታ ያድርጉ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"የመተግበሪያ እንቅስቃሴ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"አጥፋ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 1c1d821..3c42334 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1292,7 +1292,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"انقر لاختيار لغة وتنسيق"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"نشاط التطبيقات"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر تعطيلها."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"إيقاف"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 41fa6bd..f9c699c 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dil və tərtibatı seçmək üçün tıklayın"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Tətbiq fəaliyyəti"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> digər tətbiqlər üzərindən göstərilir"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> tətbiq üzərindən göstərilir"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> adlı şəxsin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTİV EDİN"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 3d278fb..b7bdb69 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1226,7 +1226,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste izabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnosti u aplikacijama"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplikacija"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplik."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite ovu funkciju za <xliff:g id="NAME">%s</xliff:g>, dodirnite da biste otvorili podešavanja i isključili je."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index a233114..6515803 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Дакраніцеся, каб выбраць мову і раскладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Актыўнасць праграмы"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> паказваецца паверх іншых праграм"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> паказв. паверх іншых праграм"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць гэта."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"АДКЛЮЧЫЦЬ"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 65ce3b8..ba640b5 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Докоснете, за да изберете език и подредба"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активност в приложенията"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се показва върху други приложения"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИЗКЛЮЧВАНЕ"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 657bfc9..ec7bc7d 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"অ্যাপের কার্যকলাপ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপ্লিকেশানের ওপরেও প্রদর্শিত"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের ওপর প্রদর্শিত হচ্ছে"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে, ট্যাপ করে সেটিংসে যান ও বৈশিষ্ট্যটি বন্ধ করে দিন।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"বন্ধ করুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 14744f9..649cadd 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -447,7 +447,7 @@
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"prikaz mrežnih veza"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Omogućava aplikaciji pregled informacija o mrežnim vezama, npr. koje mreže postoje i koje su povezane."</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"ima potpuni pristup mreži"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ova dozvola nije potrebna za vršenje te radnje."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ovo odobrenje nije potrebno za vršenje te radnje."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"izmjene povezivanja na mrežu"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Dozvoljava aplikaciji izmjenu stanja mrežne povezanosti."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"izmjene podijeljenog povezivanja"</string>
@@ -848,7 +848,7 @@
<string name="permdesc_setAlarm" msgid="316392039157473848">"Dozvoljava aplikaciji postavljanje alarma u instaliranom budilniku. Moguće je da neki budilnici neće primijeniti ovu funkciju."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"dodavanje govorne pošte"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"Dozvoljava aplikaciji dodavanje poruka u vašu ulaznu govornu poštu."</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih dozvola preglednika"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih odobrenja preglednika"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Dozvoljava aplikaciji mijenjanje geolokacijskih odobrenja preglednika. Zlonamjerne aplikacije mogu to iskoristiti i dozvoliti slanje informacija o lokaciji proizvoljnim web lokcacijama."</string>
<string name="save_password_message" msgid="767344687139195790">"Želite li da preglednik zapamti ovu lozinku?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Ne sada"</string>
@@ -1204,7 +1204,7 @@
<string name="date_time_done" msgid="2507683751759308828">"Gotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NOVO: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> omogućava."</string>
- <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebne dozvole"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string>
<string name="usb_charging_notification_title" msgid="6895185153353640787">"Ovaj uređaj se puni preko USB-a"</string>
@@ -1231,7 +1231,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnost aplikacija"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva ostale aplikacije"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva druge apl."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index d8e2387..c644866 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca per seleccionar l\'idioma i el disseny"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activitat en aplicacions"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"S\'està superposant <xliff:g id="NAME">%s</xliff:g> a altres aplicacions"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVA"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index dedb67d..e33b3df 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozvržení"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivita v aplikacích"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikace <xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNOUT"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 33a510c..cdb8a2b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryk for at vælge sprog og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ FRA"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 273b965..58f3204 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App-Aktivitäten"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTIVIEREN"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index a166ddb..780c69d 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Πατήστε για να επιλέξετε γλώσσα και διάταξη"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Δραστηριότητα εφαρμογών"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> προβάλλεται πάνω από άλλες εφαρμογές"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικαλύπτει άλλες"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index c9b7076..2d823ea 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index c9b7076..2d823ea 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index c9b7076..2d823ea 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index b634bf7..45584b5 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Presiona para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividad en apps"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index af146e5..926ee47 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividad en aplicaciones"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras aplicaciones"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 945abb8..7e690be 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Puudutage keele ja paigutuse valimiseks"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Rakenduse tegevus"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Rakendus <xliff:g id="NAME">%s</xliff:g> kuvatakse teiste rakenduste peal"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> kuvat. teiste rakenduste peal"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"LÜLITA VÄLJA"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index b21f4570..1407479 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -864,7 +864,7 @@
<string name="searchview_description_query" msgid="5911778593125355124">"Bilaketa-kontsulta"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"Garbitu kontsulta"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Bidali kontsulta"</string>
- <string name="searchview_description_voice" msgid="2453203695674994440">"Ahots bidezko bilaketa"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Ahozko bilaketa"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\"Arakatu ukituta\" eginbidea gaitu nahi duzu?"</string>
<string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo tabletarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string>
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string>
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Hizkuntza eta diseinua hautatzeko, sakatu hau"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aplikazioetako jarduerak"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> aplikazioen gainean agertzea"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Besteen gainean agertzen da <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESAKTIBATU"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 72734fc..8b894ee 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"برای انتخاب زبان و چیدمان ضربه بزنید"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"فعالیت برنامه"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"خاموش کردن"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index d1eedbe..af1a061 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Valitse kieli ja asettelu koskettamalla."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Sovellustoiminta"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> näkyy muiden sovellusten päällä"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> näkyy sovellusten päällä"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"POISTA KÄYTÖSTÄ"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d258d22..ba2c01e 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Touchez pour sélectionner la langue et la configuration du clavier"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activité des applications"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> affiche du contenu par-dessus d\'autres applications"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> aff. contenu par-dessus applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalités, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index cc7aa6d..12c6866 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activité dans les applications"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> est affichée sur les autres applications"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'affiche sur autres applis"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index a8083bc..68998c3 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar o idioma e o deseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividade das aplicacións"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Mostrando <xliff:g id="NAME">%s</xliff:g> sobre outras aplicacións"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> móstrase sobre outras aplicacións"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactívaa."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index dfd6dcc..7cae6b6 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ઍપ્લિકેશન પ્રવૃત્તિ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનોની ઉપર પ્રદર્શિત થઈ રહ્યું છે"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર દેખાઈ છે"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"બંધ કરો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index ae7dab2..224710d 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा और लेआउट चुनने के लिए टैप करें"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ऐप्लिकेशन गतिविधि"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index fc2a1d1..61d1862 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1226,7 +1226,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste odabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnost aplikacije"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se preko drugih aplikacija"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Apl. <xliff:g id="NAME">%s</xliff:g> zakriva druge aplikacije"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index fd4b981..e5105b8 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Alkalmazástevékenység"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A(z) <xliff:g id="NAME">%s</xliff:g> a többi alkalmazás felett jelenik meg"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> – a többi alkalmazás felett"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KIKAPCSOLÁS"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 0a32f58..215d83a 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Հավելվածների պատմություն"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ԱՆՋԱՏԵԼ"</string>
@@ -1301,7 +1301,7 @@
<string name="submit" msgid="1602335572089911941">"Ուղարկել"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Մեքենայի ռեժիմը միացված է"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Հպեք` մեքենայի ռեժիմից դուրս գալու համար:"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Մուտքը կամ թեժ կետը ակտիվ է"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string>
<string name="back_button_label" msgid="2300470004503343439">"Հետ"</string>
<string name="next_button_label" msgid="1080555104677992408">"Հաջորդը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index db98b4d..c9a8942 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivitas aplikasi"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"NONAKTIFKAN"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index d179f57..9e8e022 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ýttu til að velja tungumál og útlit"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Forritavirkni"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÖKKVA"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 11245ea..975bb57 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tocca per selezionare la lingua e il layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Attività app"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"App <xliff:g id="NAME">%s</xliff:g> visualizzata sopra altre app"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DISATTIVA"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 21fa22c..6eafaaf 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"הקש כדי לבחור שפה ופריסה"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"פעילות באפליקציות"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"תצוגה של <xliff:g id="NAME">%s</xliff:g> מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> מוצגת מעל אפליקציות אחרות"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"אם אינך רוצה ש-<xliff:g id="NAME">%s</xliff:g> תשתמש בתכונה הזו, הקש כדי לפתוח את ההגדרות ולכבות אותה."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"כבה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7fbd108..2a3d9e1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"タップして言語とレイアウトを選択してください"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"アプリのアクティビティ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>が他のアプリの上に表示されています"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"OFF にする"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 3e7b285..1c3f970 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"შეეხეთ ენისა და განლაგების ასარჩევად"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"აპებში აქტივობა"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"თუ არ გსურთ <xliff:g id="NAME">%s</xliff:g>-ის მიერ ამ ფუნქციის გამოყენება, შეეხეთ პარამეტრების გასახსნელად და გამორთეთ."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"გამორთვა"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 812763c..4e11c56 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тіл мен пернетақта схемасын таңдау үшін түртіңіз"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Қолданба белсенділігі"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен шықты"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл функцияны пайдалануына жол бермеу үшін параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨШІРУ"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 85c2a02..6994d7f 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1206,7 +1206,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ប៉ះដើម្បីជ្រើសភាសា និងប្លង់"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"សកម្មភាពកម្មវិធី"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះទេ សូមចុចដើម្បីបើកការកំណត់ រួចបិទវា។"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"បិទ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 02a3f94..b3f42d1 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1205,8 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) -->
- <skip />
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ಇತರವುಗಳ ಮೇಲೆ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ಆಫ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 97545c1..e7f9a7f 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"탭하여 언어와 레이아웃을 선택하세요."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"앱 활동"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"사용 중지"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index a591263..d627e61 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тил жана калып тандоо үчүн таптап коюңуз"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Колдонмодогу аракеттер"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: башка колдонмолордун үстүнөн"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨЧҮРҮҮ"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 98e7907..5dc58f6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ແຕະເພື່ອເລືອກພາສາ ແລະ ໂຄງແປ້ນພິມ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ກິດຈະກຳແອັບ"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນຢູເທິງແອັບອື່ນຢູ່"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ປິດໄວ້"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7e51808..14de0a2 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Palieskite, kad pasirinktumėte kalbą ir išdėstymą"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Programų veikla"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jei nenorite, kad <xliff:g id="NAME">%s</xliff:g> naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IŠJUNGTI"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 6ca2131..b191747 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1226,7 +1226,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Pieskarieties, lai atlasītu valodu un izkārtojumu"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Darbības lietotnēs"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Lietotne <xliff:g id="NAME">%s</xliff:g> tiek rādīta pāri citām lietotnēm"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Lietotne <xliff:g id="NAME">%s</xliff:g> pāri citām lietotnēm"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un to izslēgtu."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZSLĒGT"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index fd333d6..2e115fc 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Допрете за избирање јазик и распоред"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активност на апликациите"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз други апликации"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз апликации"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и исклучете ја."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЛУЧИ"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 46b38ad..8bc3ff8 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -1205,8 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ഭാഷയും ലേഔട്ടും തിരഞ്ഞെടുക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) -->
- <skip />
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ഓഫാക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 5e7f70e..8309d77 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Хэл болон бүдүүвчийг сонгохын тулд дарна уу"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Аппын үйл ажиллагаа"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Бусад апп дээгүүр <xliff:g id="NAME">%s</xliff:g>-г харуулж байна"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>-г бусад апп дээр харуулж байна"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглахыг хүсэхгүй байгаа бол тохиргоог нээгээд, унтраана уу."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"УНТРААХ"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 849c6be..c0bc82c 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा आणि लेआउट निवडण्यासाठी टॅप करा"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"अॅप क्रियाकलाप"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर प्रदर्शित करीत आहे"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अॅप्सवर प्रदर्शित करीत आहे"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपण इच्छित असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करा"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e3c5e88..8c4bb4c 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketik untuk memilih bahasa dan susun atur"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktiviti apl"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikannya."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"MATIKAN"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 88b812b..f5a1429 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"အက်ပ်လုပ်ဆောင်ချက်"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပြပါသည်"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ကို အခြားအက်ပ်များပေါ်တွင် မြင်နေရပါသည်။"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ကို ဤဝန်ဆောင်မှုအား အသုံးမပြုစေလိုလျှင် ဆက်တင်ကို တို့၍ ဖွင့်ပြီး ၎င်းကို ပိတ်လိုက်ပါ။"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ပိတ်ပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index e804b07..5972329 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trykk for å velge språk og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ AV"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index c971133..7283936 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1210,7 +1210,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा र लेआउट चयन गर्न ट्याप गर्नुहोस्"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"अनुप्रयोगको गतिविधि"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो विशेषता प्रयोग नगरेको चाहनुहुन्न भने सेटिङहरू खोली यसलाई निष्क्रिय पार्न ट्याप गर्नुहोस्।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"निष्क्रिय पार्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index b34c4d0..09cfa70 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om een taal en indeling te selecteren"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App-activiteit"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over apps"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"UITSCHAKELEN"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index d5c5d9c..c89224d 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1205,8 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) -->
- <skip />
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ਬੰਦ ਕਰੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c1ef118..cac8e583 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -773,7 +773,7 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj się"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Błędna nazwa użytkownika lub hasło."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Nie pamiętasz nazwy użytkownika lub hasła?\nOdwiedź stronę "<b>"google.com/accounts/recovery"</b></string>
- <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzanie…"</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzam…"</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Wyłącz dźwięk"</string>
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Kliknij, by wybrać język i układ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktywność w aplikacjach"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Wyświetlanie aplikacji <xliff:g id="NAME">%s</xliff:g> nad innymi"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"WYŁĄCZ"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 99a67d9..fe6b766 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de apps"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index a151733..4c04879 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -63,8 +63,8 @@
<string name="needPuk2" msgid="4526033371987193070">"Introduza o PUK2 para desbloquear o cartão SIM."</string>
<string name="enablePin" msgid="209412020907207950">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
+ <item quantity="one">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
<item quantity="other">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item>
- <item quantity="one">Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar bloqueado.</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -179,8 +179,8 @@
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
+ <item quantity="one">Certificate authorities installed</item>
<item quantity="other">Autoridades de certificação instaladas</item>
- <item quantity="one">Autoridade de certificação instalada</item>
</plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo administrador do seu perfil de trabalho"</string>
@@ -235,8 +235,8 @@
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="7210859858969115745">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
<item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desativado"</string>
@@ -871,8 +871,8 @@
<string name="oneMonthDurationPast" msgid="7396384508953779925">"Há 1 mês"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Há mais de 1 mês"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
+ <item quantity="one">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">Último <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<string name="last_month" msgid="3959346739979055432">"Último mês"</string>
<string name="older" msgid="5211975022815554840">"Mais antiga"</string>
@@ -893,68 +893,68 @@
<string name="years" msgid="6881577717993213522">"anos"</string>
<string name="now_string_shortest" msgid="8912796667087856402">"agora"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>a</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>a</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
</plurals>
<plurals name="duration_hours_relative" formatted="false" msgid="676894109982008411">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
</plurals>
<plurals name="duration_days_relative" formatted="false" msgid="2203515825765397130">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<plurals name="duration_years_relative" formatted="false" msgid="4820062134188885734">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="4655043589817680966">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">dentro <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
</plurals>
<plurals name="duration_hours_relative_future" formatted="false" msgid="8084579714205223891">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="333215369363433992">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="8644862986413104011">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo não é válido para transmissão em fluxo contínuo neste aparelho."</string>
@@ -1102,12 +1102,12 @@
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Sons de notificação"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Desconhecido"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
+ <item quantity="one">Wi-Fi networks available</item>
<item quantity="other">Redes Wi-Fi disponíveis</item>
- <item quantity="one">Rede Wi-Fi disponível</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
+ <item quantity="one">Open Wi-Fi networks available</item>
<item quantity="other">Redes Wi-Fi abertas disponíveis</item>
- <item quantity="one">Rede Wi-Fi aberta disponível</item>
</plurals>
<string name="wifi_available_sign_in" msgid="9157196203958866662">"Iniciar sessão na rede Wi-Fi"</string>
<string name="network_available_sign_in" msgid="1848877297365446605">"Início de sessão na rede"</string>
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o esquema"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de aplicações"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A aplicação <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplicações"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplic."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
@@ -1309,8 +1309,8 @@
<string name="no_matches" msgid="8129421908915840737">"Sem correspondências"</string>
<string name="find_on_page" msgid="1946799233822820384">"Localizar na página"</string>
<plurals name="matches_found" formatted="false" msgid="1210884353962081884">
+ <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 correspondência</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string>
<string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"A apagar memória de armazenamento USB..."</string>
@@ -1595,8 +1595,8 @@
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não correspondem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688">
+ <item quantity="one">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
<item quantity="other">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="one">Tente novamente dentro de 1 segundo</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="8394201622932303336">"Visualização de ecrã inteiro"</string>
@@ -1628,36 +1628,36 @@
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
+ <item quantity="one">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante um minuto (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597">
+ <item quantity="one">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d min (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante 1 min (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <item quantity="one">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante uma hora (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
+ <item quantity="one">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d h (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante 1 h (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571">
+ <item quantity="one">For %d minutes</item>
<item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante um minuto</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128">
+ <item quantity="one">For %d min</item>
<item quantity="other">Durante %d min</item>
- <item quantity="one">Durante 1 min</item>
</plurals>
<plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <item quantity="one">For %d hours</item>
<item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante uma hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
+ <item quantity="one">For %d hr</item>
<item quantity="other">Durante %d h</item>
- <item quantity="one">Durante 1 h</item>
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string>
@@ -1692,8 +1692,8 @@
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
<string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item>
</plurals>
<string name="default_notification_channel_label" msgid="5929663562028088222">"Sem categoria"</string>
<string name="importance_from_user" msgid="7318955817386549931">"Definiu a importância destas notificações."</string>
@@ -1756,8 +1756,8 @@
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher automaticamente o conteúdo"</string>
<string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"Sem sugestões do preenchimento automático"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
+ <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item>
- <item quantity="one">Uma sugestão do preenchimento automático</item>
</plurals>
<string name="autofill_save_title" msgid="3345527308992082601">"Pretende guardar no <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
<string name="autofill_save_title_with_type" msgid="8637809388029313305">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> no <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 99a67d9..fe6b766 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de apps"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 6420a32..835c9ac 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1226,7 +1226,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Atingeți pentru a selecta limba și aspectul"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activitate din aplicații"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se afișează peste alte aplicații"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se afișează peste aplicații"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEZACTIVAȚI"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index ca0eded..69fe42f 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Нажмите, чтобы выбрать язык и раскладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"История приложений"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Чтобы отключить эту функцию для приложения <xliff:g id="NAME">%s</xliff:g>, перейдите в настройки."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ОТКЛЮЧИТЬ"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index c35e852..373fe07 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1206,7 +1206,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"භාෂාව හා පිරිසැලසුම තේරීමට තට්ටු කරන්න"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"යෙදුම් ක්රියාකාරකම"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> සංදර්ශනය කරමින්"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> දිස් වේ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ක්රියා විරහිත කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 37f50b5..4352a36 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozloženie"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivita v aplikáciách"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNÚŤ"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index b47ad16..c6f4404 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dotaknite se, če želite izbrati jezik in postavitev."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Dejavnost v aplikacijah"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZKLOP"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index b82ae96..70a3efb 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trokit për të zgjedhur gjuhën dhe strukturën"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktiviteti i aplikacionit"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> afishohet mbi aplikacionet e tjera"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> shfaqet mbi apl. e tjera"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ÇAKTIVIZO"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 7854a91..f46505bf 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1226,7 +1226,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Додирните да бисте изабрали језик и распоред"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активности у апликацијама"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се приказује преко других аплик."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не желите ову функцију за <xliff:g id="NAME">%s</xliff:g>, додирните да бисте отворили подешавања и искључили је."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЉУЧИ"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index c7fec34..a3fb085 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Om du inte vill att den här funktionen används för <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"INAKTIVERA"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 6ec9c9f..ce4a469 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -81,7 +81,7 @@
<string name="CnirMmi" msgid="3062102121430548731">"Kupiga nambari kumezuiwa"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"Upigaji simu kwa njia tatu"</string>
<string name="RuacMmi" msgid="7827887459138308886">"Ukataaji wa simu zinazokera zisizohitajika"</string>
- <string name="CndMmi" msgid="3116446237081575808">"Uwasilishaji nambari ya kupiga simu"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Kuonyeshwa kwa nambari inayopiga"</string>
<string name="DndMmi" msgid="1265478932418334331">"Usisumbue"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
@@ -1202,7 +1202,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Shughuli za programu"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine."</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> kutumia kipengele hiki, gonga ili ufungue mipangilio na ukizime."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ZIMA"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 32a1e83..f45789b 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"பயன்பாட்டுச் செயல்பாடு"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> பிற பயன்பாடுகளின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"முடக்கு"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 10b5385..68065b9 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1205,8 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"భాష మరియు లేఅవుట్ను ఎంచుకోవడానికి నొక్కండి"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) -->
- <skip />
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ఆఫ్ చేయి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 6ae45b2..51d932d 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"แตะเพื่อเลือกภาษาและรูปแบบ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"กิจกรรมแอป"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ปิด"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index b4cf33a..ee01ff2 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"I-tap upang pumili ng wika at layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktibidad sa app"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Ipinapakita sa itaas ng iba pang app ang <xliff:g id="NAME">%s</xliff:g>."</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"Nasa ibabaw ng ibang app ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Kung ayaw mong gamitin ng <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"I-OFF"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index f833c4e..bbae91a 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için dokunun"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Uygulama etkinliği"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde görüntüleniyor"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde gösteriliyor"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KAPAT"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index fe0efb4..f187c03 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1248,7 +1248,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Торкніться, щоб вибрати мову та розкладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активність додатків"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Додаток <xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Щоб у додатку <xliff:g id="NAME">%s</xliff:g> не працювала ця функція, вимкніть її в налаштуваннях."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ВИМКНУТИ"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 3e8c2b3..310bddd 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"زبان اور لے آؤٹ منتخب کرنے کیلئے تھپتھپائیں"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ایپ کی سرگرمی"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر دکھایا کیا جا رہا ہے"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> دیگر ایپس پر ڈسپلے ہو رہی ہے"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے بند کریں۔"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"آف کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 812338d..bd53da5 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1205,7 +1205,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Til va sxemani belgilash uchun bosing"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Ilova tarixi"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"O‘CHIRIB QO‘YISH"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index ec777b5..655bdc7 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Nhấn để chọn ngôn ngữ và bố cục"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Hoạt động ứng dụng"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên các ứng dụng khác"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên ứng dụng khác"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TẮT"</string>
diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml
index 0053c12..fd88102 100644
--- a/core/res/res/values-watch/styles_material.xml
+++ b/core/res/res/values-watch/styles_material.xml
@@ -95,7 +95,7 @@
</style>
<style name="DialogWindowTitle.Material">
- <item name="maxLines">@empty</item>
+ <item name="maxLines">@null</item>
<item name="scrollHorizontally">false</item>
<item name="textAppearance">@style/TextAppearance.Material.DialogWindowTitle</item>
<item name="gravity">center_horizontal|top</item>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 24f86b3..c19e3d2 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"应用活动"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想让<xliff:g id="NAME">%s</xliff:g>使用此功能,请点按以打开设置,然后关闭此功能。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"关闭"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 6a1039d..415c1ac 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕按即可選取語言和鍵盤配置"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"應用程式活動"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」目前可顯示在其他應用程式上面"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 35185a0..36f9a9e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕觸即可選取語言和版面配置"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"應用程式活動"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index aefe4be..ff35931 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1204,7 +1204,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Thepha ukuze ukhethe ulimi nesakhiwo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Umsebenzi wohlelo lokusebenza"</string>
+ <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ukubonisa ngaphezu kwezinye izinhlelo zokusebenza"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ibonisa ngaphezu kwezinye izinhlelo zokusebenza"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Uma ungafuni ukuthi i-<xliff:g id="NAME">%s</xliff:g> isebenzise lesi sici, thepha ukuze uvule izilungiselelo bese usivale."</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VALA"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index cfe25b3..79bb109 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2290,8 +2290,9 @@
<!-- Sets the padding, in pixels, of all four edges. Padding is defined as
space between the edges of the view and the view's content. This value will take
- precedence over any of the edge-specific values, including
- paddingHorizontal and paddingVertical, if set. A view's size
+ precedence over any of the edge-specific values (paddingLeft, paddingTop,
+ paddingRight, paddingBottom, paddingHorizontal and paddingVertical), but will
+ not override paddingStart or paddingEnd, if set. A view's size
will include its padding. If a {@link android.R.attr#background}
is provided, the padding will initially be set to that (0 if the
drawable does not have padding). Explicitly setting a padding value
@@ -2299,7 +2300,7 @@
<attr name="padding" format="dimension" />
<!-- Sets the padding, in pixels, of the left and right edges; see
{@link android.R.attr#padding}. This value will take precedence over
- paddingLeft, paddingRight, paddingStart, and paddingEnd, if set. -->
+ paddingLeft and paddingRight, but not paddingStart or paddingEnd (if set). -->
<attr name="paddingHorizontal" format="dimension" />
<!-- Sets the padding, in pixels, of the top and bottom edges; see
{@link android.R.attr#padding}. This value will take precedence over
@@ -3203,11 +3204,10 @@
<attr name="layout_marginEnd" format="dimension" />
<!-- Specifies extra space on the left and right sides of this view.
Specifying layout_marginHorizontal is equivalent to specifying
- either layout_marginLeft and layout_marginRight or
- layout_marginStart and layout_marginEnd with that same value.
- If both layout_marginHorizontal and any of layout_marginLeft,
- layout_marginRight, layout_marginStart, and layout_marginEnd are
- also specified, the layout_marginHorizontal value will take precedence over the
+ layout_marginLeft and layout_marginRight.
+ If both layout_marginHorizontal and either/both of layout_marginLeft
+ and layout_marginRight are also specified, the layout_marginHorizontal
+ value will take precedence over the
edge-specific values. Also, layout_margin will always take precedence over
any of these values, including layout_marginHorizontal.
This space is outside this view's bounds.
@@ -3216,7 +3216,7 @@
<!-- Specifies extra space on the top and bottom sides of this view.
Specifying layout_marginVertical is equivalent to specifying
layout_marginTop and layout_marginBottom with that same value.
- If both layout_marginVertical and either/both layout_marginTop and
+ If both layout_marginVertical and either/both of layout_marginTop and
layout_marginBottom are also specified, the layout_marginVertical value
will take precedence over the edge-specific values.
Also, layout_margin will always take precedence over
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index fcabe31..f747d3d 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3225,7 +3225,7 @@
<skip />
<!-- Name of notification channel the system post notification to inform the use about apps
that are drawing ui on-top of other apps (alert-windows) [CHAR LIMIT=NONE] -->
- <string name="alert_windows_notification_channel_name">App activity</string>
+ <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> displaying over other apps</string>
<!-- Notification title when an application is displaying ui on-top of other apps
[CHAR LIMIT=30] -->
<string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> is displaying over other apps</string>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 7517946..8755e37 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -758,6 +758,14 @@
<item name="colorControlNormal">?attr/textColorPrimary</item>
</style>
+ <style name="Theme.DeviceDefault.QuickSettings.Dialog" parent="Theme.DeviceDefault.Light.Dialog">
+ <!-- Color palette -->
+ <item name="colorPrimary">@color/primary_device_default_settings_light</item>
+ <item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
+ <item name="colorSecondary">@color/secondary_device_default_settings_light</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ </style>
+
<!-- Variant of {@link #Theme_DeviceDefault_Settings_Dark} with no action bar -->
<style name="Theme.DeviceDefault.Settings.Dark.NoActionBar" parent="Theme.Material.NoActionBar">
<!-- Color palette -->
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index ebab129..5a7bca4 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -50,14 +50,11 @@
import android.content.ClipData;
import android.content.ClipboardManager;
-import android.text.TextUtils;
-import android.text.Spanned;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.ViewAssertion;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
-import android.view.View;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
@@ -72,8 +69,6 @@
import com.android.frameworks.coretests.R;
-import junit.framework.AssertionFailedError;
-
/**
* Tests the TextView widget from an Activity
*/
@@ -694,6 +689,51 @@
assertFalse(textView.hasTransientState());
}
+ public void testResetMenuItemTitle() throws Exception {
+ getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final int itemId = 1;
+ final String title1 = " AFIGBO";
+ final int index = title1.indexOf('I');
+ final String title2 = title1.substring(index);
+ final String[] title = new String[]{title1};
+ textView.post(() -> textView.setCustomSelectionActionModeCallback(
+ new ActionMode.Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
+ menu.removeItem(itemId);
+ menu.add(Menu.NONE /* group */, itemId, 0 /* order */, title[0]);
+ return true;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode actionMode) {
+ }
+ }));
+ onView(withId(R.id.textview)).perform(replaceText(title1));
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarContainsItem(title1);
+
+ // Change the menu item title.
+ title[0] = title2;
+ // Change the selection to invalidate the action mode without restarting it.
+ onHandleView(com.android.internal.R.id.selection_start_handle)
+ .perform(dragHandle(textView, Handle.SELECTION_START, index));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarContainsItem(title2);
+ }
+
public void testAssistItemIsAtIndexZero() throws Exception {
getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
index fd57baa..115af5e 100644
--- a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
@@ -180,7 +180,9 @@
try {
table.getValue(key);
- throw new Exception("Exception not thrown after mismatched reset calls.");
+ // Turn off this assertion because the check in SparseMappingTable.assertConsistency
+ // is also turned off.
+ //throw new Exception("Exception not thrown after mismatched reset calls.");
} catch (RuntimeException ex) {
// Good
}
diff --git a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
index 906d7e9..a249925 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
@@ -38,6 +38,7 @@
public void setup() {
mContext = InstrumentationRegistry.getTargetContext();
mView = new ImageFloatingTextView(mContext, null, 0, 0);
+ mView.setMaxLines(9);
mTextView = new TextView(mContext, null, 0, 0);
mTextView.setMaxLines(9);
}
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index 0b1141a..70a5f53 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -76,8 +76,9 @@
mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
}
+ /** @hide */
@Override
- void verifyNativeInstance() {
+ protected void verifyNativeInstance() {
if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
|| mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
// Child shader native instance has been updated,
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index e62df8f..e3b4740 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -529,6 +529,7 @@
setTextLocales(LocaleList.getAdjustedDefault());
setElegantTextHeight(false);
mFontFeatureSettings = null;
+ mFontVariationSettings = null;
}
/**
@@ -565,6 +566,7 @@
mBidiFlags = paint.mBidiFlags;
mLocales = paint.mLocales;
mFontFeatureSettings = paint.mFontFeatureSettings;
+ mFontVariationSettings = paint.mFontVariationSettings;
}
/** @hide */
@@ -1594,10 +1596,13 @@
return true;
}
+ // The null typeface is valid and it is equivalent to Typeface.DEFAULT.
+ // To call isSupportedAxes method, use Typeface.DEFAULT instance.
+ Typeface targetTypeface = mTypeface == null ? Typeface.DEFAULT : mTypeface;
FontVariationAxis[] axes = FontVariationAxis.fromFontVariationSettings(settings);
final ArrayList<FontVariationAxis> filteredAxes = new ArrayList<FontVariationAxis>();
for (final FontVariationAxis axis : axes) {
- if (mTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
+ if (targetTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
filteredAxes.add(axis);
}
}
@@ -1605,7 +1610,7 @@
return false;
}
mFontVariationSettings = settings;
- setTypeface(Typeface.createFromTypefaceWithVariation(mTypeface, filteredAxes));
+ setTypeface(Typeface.createFromTypefaceWithVariation(targetTypeface, filteredAxes));
return true;
}
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 8410ab2..0209cea 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -19,6 +19,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import libcore.util.NativeAllocationRegistry;
+
/**
* Shader is the based class for objects that return horizontal spans of colors
* during drawing. A subclass of Shader is installed in a Paint calling
@@ -26,6 +28,12 @@
* drawn with that paint will get its color(s) from the shader.
*/
public class Shader {
+
+ private static class NoImagePreloadHolder {
+ public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ Shader.class.getClassLoader(), nativeGetFinalizer(), 50);
+ }
+
/**
* @deprecated Use subclass constructors directly instead.
*/
@@ -37,6 +45,8 @@
* is called - otherwise may be out of date with java setters/properties.
*/
private long mNativeInstance;
+ // Runnable to do immediate destruction
+ private Runnable mCleaner;
/**
* Current matrix - always set to null if local matrix is identity.
@@ -80,7 +90,8 @@
/**
* Set the shader's local matrix. Passing null will reset the shader's
- * matrix to identity.
+ * matrix to identity. If the matrix has scale value as 0, the drawing
+ * result is undefined.
*
* @param localM The shader's new local matrix, or null to specify identity
*/
@@ -105,9 +116,11 @@
return 0;
}
- void discardNativeInstance() {
+ /** @hide */
+ protected final void discardNativeInstance() {
if (mNativeInstance != 0) {
- nativeSafeUnref(mNativeInstance);
+ mCleaner.run();
+ mCleaner = null;
mNativeInstance = 0;
}
}
@@ -115,20 +128,9 @@
/**
* Callback for subclasses to call {@link #discardNativeInstance()} if the most recently
* constructed native instance is no longer valid.
+ * @hide
*/
- void verifyNativeInstance() {
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- if (mNativeInstance != 0) {
- nativeSafeUnref(mNativeInstance);
- }
- mNativeInstance = -1;
- } finally {
- super.finalize();
- }
+ protected void verifyNativeInstance() {
}
/**
@@ -150,20 +152,20 @@
/**
* @hide
*/
- public long getNativeInstance() {
- if (mNativeInstance == -1) {
- throw new IllegalStateException("attempting to use a finalized Shader");
- }
-
+ public final long getNativeInstance() {
// verify mNativeInstance is valid
verifyNativeInstance();
if (mNativeInstance == 0) {
mNativeInstance = createNativeInstance(mLocalMatrix == null
? 0 : mLocalMatrix.native_instance);
+ mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(
+ this, mNativeInstance);
}
return mNativeInstance;
}
- private static native void nativeSafeUnref(long nativeInstance);
+ private static native long nativeGetFinalizer();
+
}
+
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 5a56f53..c4b56c3 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -725,8 +725,8 @@
}
/** @hide */
- public static Typeface createFromTypefaceWithVariation(Typeface family,
- List<FontVariationAxis> axes) {
+ public static Typeface createFromTypefaceWithVariation(@Nullable Typeface family,
+ @NonNull List<FontVariationAxis> axes) {
final long ni = family == null ? 0 : family.native_instance;
return new Typeface(nativeCreateFromTypefaceWithVariation(ni, axes));
}
@@ -1056,7 +1056,7 @@
}
}
}
- return Arrays.binarySearch(mSupportedAxes, axis) > 0;
+ return Arrays.binarySearch(mSupportedAxes, axis) >= 0;
}
private static native long nativeCreateFromTypeface(long native_instance, int style);
diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index ab10e97..8616d58 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -84,7 +84,7 @@
/**
* Launcher icons design guideline
*/
- private static final float SAFEZONE_SCALE = 72f/66f;
+ private static final float SAFEZONE_SCALE = 66f/72f;
/**
* All four sides of the layers are padded with extra inset so as to provide
@@ -676,12 +676,7 @@
@Override
public int getAlpha() {
- final Drawable dr = getFirstNonNullDrawable();
- if (dr != null) {
- return dr.getAlpha();
- } else {
- return super.getAlpha();
- }
+ return PixelFormat.TRANSLUCENT;
}
@Override
@@ -719,17 +714,6 @@
}
}
- private Drawable getFirstNonNullDrawable() {
- final ChildDrawable[] array = mLayerState.mChildren;
- for (int i = 0; i < mLayerState.N_CHILDREN; i++) {
- final Drawable dr = array[i].mDrawable;
- if (dr != null) {
- return dr;
- }
- }
- return null;
- }
-
public void setOpacity(int opacity) {
mLayerState.mOpacityOverride = opacity;
}
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index bfd0604..8f314c9 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -58,11 +58,11 @@
* mask using {@code setId(..., android.R.id.mask)} or an existing mask layer
* may be replaced using {@code setDrawableByLayerId(android.R.id.mask, ...)}.
* <pre>
- * <code><!-- A red ripple masked against an opaque rectangle. --/>
- * <ripple android:color="#ffff0000">
- * <item android:id="@android:id/mask"
+ * <code><!-- A red ripple masked against an opaque rectangle. --/>
+ * <ripple android:color="#ffff0000">
+ * <item android:id="@android:id/mask"
* android:drawable="@android:color/white" />
- * </ripple></code>
+ * </ripple></code>
* </pre>
* <p>
* If a mask layer is set, the ripple effect will be masked against that layer
@@ -71,15 +71,15 @@
* If no mask layer is set, the ripple effect is masked against the composite
* of the child layers.
* <pre>
- * <code><!-- A green ripple drawn atop a black rectangle. --/>
- * <ripple android:color="#ff00ff00">
- * <item android:drawable="@android:color/black" />
- * </ripple>
+ * <code><!-- A green ripple drawn atop a black rectangle. --/>
+ * <ripple android:color="#ff00ff00">
+ * <item android:drawable="@android:color/black" />
+ * </ripple>
*
- * <!-- A blue ripple drawn atop a drawable resource. --/>
- * <ripple android:color="#ff0000ff">
- * <item android:drawable="@drawable/my_drawable" />
- * </ripple></code>
+ * <!-- A blue ripple drawn atop a drawable resource. --/>
+ * <ripple android:color="#ff0000ff">
+ * <item android:drawable="@drawable/my_drawable" />
+ * </ripple></code>
* </pre>
* <p>
* If no child layers or mask is specified and the ripple is set as a View
@@ -87,8 +87,8 @@
* background within the View's hierarchy. In this case, the drawing region
* may extend outside of the Drawable bounds.
* <pre>
- * <code><!-- An unbounded red ripple. --/>
- * <ripple android:color="#ffff0000" /></code>
+ * <code><!-- An unbounded red ripple. --/>
+ * <ripple android:color="#ffff0000" /></code>
* </pre>
*
* @attr ref android.R.styleable#RippleDrawable_color
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index a0366de..2fdfcd4 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -223,7 +223,6 @@
///////////////////////////////////////////////////////////////////////////////
void Caches::clearGarbage() {
- textureCache.clearGarbage();
pathCache.clearGarbage();
patchCache.clearGarbage();
}
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 63a6a2c..710cdd9 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -191,25 +191,14 @@
return texture;
}
-void TextureCache::releaseTexture(uint32_t pixelRefStableID) {
- Mutex::Autolock _l(mLock);
- mGarbage.push_back(pixelRefStableID);
-}
-
-void TextureCache::clearGarbage() {
- Mutex::Autolock _l(mLock);
- size_t count = mGarbage.size();
- for (size_t i = 0; i < count; i++) {
- uint32_t pixelRefId = mGarbage[i];
- auto hardwareIter = mHardwareTextures.find(pixelRefId);
- if (hardwareIter == mHardwareTextures.end()) {
- mCache.remove(pixelRefId);
- } else {
- hardwareIter->second->deleteTexture();
- mHardwareTextures.erase(hardwareIter);
- }
+bool TextureCache::destroyTexture(uint32_t pixelRefStableID) {
+ auto hardwareIter = mHardwareTextures.find(pixelRefStableID);
+ if (hardwareIter != mHardwareTextures.end()) {
+ hardwareIter->second->deleteTexture();
+ mHardwareTextures.erase(hardwareIter);
+ return true;
}
- mGarbage.clear();
+ return mCache.remove(pixelRefStableID);
}
void TextureCache::clear() {
diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h
index db4ff39..776ff8a 100644
--- a/libs/hwui/TextureCache.h
+++ b/libs/hwui/TextureCache.h
@@ -94,14 +94,10 @@
Texture* get(Bitmap* bitmap);
/**
- * Removes the texture associated with the specified pixelRef. This is meant
- * to be called from threads that are not the EGL context thread.
+ * Removes the texture associated with the specified pixelRef. Must be called from RenderThread
+ * Returns true if a texture was destroyed, false if no texture with that id was found
*/
- ANDROID_API void releaseTexture(uint32_t pixelRefStableID);
- /**
- * Process deferred removals.
- */
- void clearGarbage();
+ bool destroyTexture(uint32_t pixelRefStableID);
/**
* Clears the cache. This causes all textures to be deleted.
@@ -139,9 +135,7 @@
bool mDebugEnabled;
- std::vector<uint32_t> mGarbage;
std::unordered_map<uint32_t, std::unique_ptr<Texture>> mHardwareTextures;
- mutable Mutex mLock;
}; // class TextureCache
}; // namespace uirenderer
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index d765584..bb1e674 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -416,9 +416,7 @@
}
- if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID());
- }
+ android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID());
}
bool Bitmap::hasHardwareMipMap() const {
@@ -486,7 +484,13 @@
void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
if (isHardware()) {
- outBitmap->allocPixels(info());
+ if (uirenderer::Properties::isSkiaEnabled()) {
+ // TODO: add color correctness for Skia pipeline - pass null color space for now
+ outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
+ info().colorType(), info().alphaType(), nullptr));
+ } else {
+ outBitmap->allocPixels(info());
+ }
uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
return;
}
@@ -495,9 +499,13 @@
}
void Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) {
- outBitmap->setInfo(info(), rowBytes());
- outBitmap->setPixelRef(this);
- outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
+ if (isHardware() && uirenderer::Properties::isSkiaEnabled()) {
+ getSkBitmap(outBitmap);
+ } else {
+ outBitmap->setInfo(info(), rowBytes());
+ outBitmap->setPixelRef(this);
+ outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
+ }
}
void Bitmap::getBounds(SkRect* bounds) const {
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index c8833d2..ed96d49 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -122,6 +122,13 @@
mCaches->flush(mode);
}
+void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
+ if (mCaches && mCaches->textureCache.destroyTexture(pixelRefId)) {
+ glFlush();
+ GL_CHECKPOINT(MODERATE);
+ }
+}
+
void RenderState::setViewport(GLsizei width, GLsizei height) {
mViewportWidth = width;
mViewportHeight = height;
diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h
index f78bf7a..787946f 100644
--- a/libs/hwui/renderstate/RenderState.h
+++ b/libs/hwui/renderstate/RenderState.h
@@ -63,6 +63,7 @@
void onVkContextDestroyed();
void flush(Caches::FlushMode flushMode);
+ void onBitmapDestroyed(uint32_t pixelRefId);
void setViewport(GLsizei width, GLsizei height);
void getViewport(GLsizei* outWidth, GLsizei* outHeight);
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index a1f1717..eed5238 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -24,6 +24,7 @@
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"
#include "renderthread/RenderThread.h"
+#include "renderstate/RenderState.h"
#include "utils/Macros.h"
#include "utils/TimeUtils.h"
@@ -693,6 +694,20 @@
}
}
+CREATE_BRIDGE2(onBitmapDestroyed, RenderThread* thread, uint32_t pixelRefId) {
+ args->thread->renderState().onBitmapDestroyed(args->pixelRefId);
+ return nullptr;
+}
+
+void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) {
+ if (!RenderThread::hasInstance()) return;
+ SETUP_TASK(onBitmapDestroyed);
+ RenderThread& thread = RenderThread::getInstance();
+ args->thread = &thread;
+ args->pixelRefId = pixelRefId;
+ thread.queue(task);
+}
+
void RenderProxy::post(RenderTask* task) {
mRenderThread.queue(task);
}
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index a60ed55..b21772c 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -135,6 +135,8 @@
static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
+
+ static void onBitmapDestroyed(uint32_t pixelRefId);
private:
RenderThread& mRenderThread;
CanvasContext* mContext;
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 6b8a279..14bc555 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -36,14 +36,14 @@
* session.
*/
public final class AudioPlaybackConfiguration implements Parcelable {
- private final static String TAG = new String("AudioPlaybackConfiguration");
+ private static final String TAG = new String("AudioPlaybackConfiguration");
- private final static boolean DEBUG = false;
+ private static final boolean DEBUG = false;
/** @hide */
- public final static int PLAYER_PIID_INVALID = -1;
+ public static final int PLAYER_PIID_INVALID = -1;
/** @hide */
- public final static int PLAYER_UPID_INVALID = -1;
+ public static final int PLAYER_UPID_INVALID = -1;
// information about the implementation
/**
@@ -51,37 +51,62 @@
* An unknown type of player
*/
@SystemApi
- public final static int PLAYER_TYPE_UNKNOWN = -1;
+ public static final int PLAYER_TYPE_UNKNOWN = -1;
/**
* @hide
* Player backed by a java android.media.AudioTrack player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
+ public static final int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
/**
* @hide
* Player backed by a java android.media.MediaPlayer player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
+ public static final int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
/**
* @hide
* Player backed by a java android.media.SoundPool player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
+ public static final int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
/**
* @hide
* Player backed by a C OpenSL ES AudioPlayer player with a BufferQueue source
*/
@SystemApi
- public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
+ public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
/**
* @hide
* Player backed by a C OpenSL ES AudioPlayer player with a URI or FD source
*/
@SystemApi
- public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+ public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+
+ /**
+ * @hide
+ * Player backed an AAudio player.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_AAUDIO = 13;
+
+ /**
+ * @hide
+ * Player backed a hardware source, whose state is visible in the Android audio policy manager.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_HW_SOURCE = 14;
+
+ /**
+ * @hide
+ * Player is a proxy for an audio player whose audio and state doesn't go through the Android
+ * audio framework.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_EXTERNAL_PROXY = 15;
/** @hide */
@IntDef({
@@ -251,11 +276,20 @@
* {@link #PLAYER_TYPE_JAM_AUDIOTRACK}, {@link #PLAYER_TYPE_JAM_MEDIAPLAYER},
* {@link #PLAYER_TYPE_JAM_SOUNDPOOL}, {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE},
* {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD}, or {@link #PLAYER_TYPE_UNKNOWN}.
+ * <br>Note that player types not exposed in the system API will be represented as
+ * {@link #PLAYER_TYPE_UNKNOWN}.
* @return the type of the player.
*/
@SystemApi
public @PlayerType int getPlayerType() {
- return mPlayerType;
+ switch (mPlayerType) {
+ case PLAYER_TYPE_AAUDIO:
+ case PLAYER_TYPE_HW_SOURCE:
+ case PLAYER_TYPE_EXTERNAL_PROXY:
+ return PLAYER_TYPE_UNKNOWN;
+ default:
+ return mPlayerType;
+ }
}
/**
@@ -442,7 +476,7 @@
//=====================================================================
// Inner class for corresponding IPlayer and its death monitoring
- final static class IPlayerShell implements IBinder.DeathRecipient {
+ static final class IPlayerShell implements IBinder.DeathRecipient {
final AudioPlaybackConfiguration mMonitor; // never null
private IPlayer mIPlayer;
@@ -494,6 +528,9 @@
return "OpenSL ES AudioPlayer (Buffer Queue)";
case PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD:
return "OpenSL ES AudioPlayer (URI/FD)";
+ case PLAYER_TYPE_AAUDIO: return "AAudio";
+ case PLAYER_TYPE_HW_SOURCE: return "hardware source";
+ case PLAYER_TYPE_EXTERNAL_PROXY: return "external proxy";
default:
return "unknown player type - FIXME";
}
diff --git a/native/android/Android.bp b/native/android/Android.bp
index eacda93..14f6ed3 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -19,3 +19,31 @@
first_version: "9",
unversioned_until: "current",
}
+
+cc_defaults {
+ name: "libandroid_defaults",
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
+
+// Network library.
+cc_library_shared {
+ name: "libandroid_net",
+ defaults: ["libandroid_defaults"],
+ srcs: ["net.c"],
+
+ shared_libs: ["libnetd_client"],
+
+ include_dirs: ["bionic/libc/dns/include"],
+}
+
+llndk_library {
+ name: "libandroid_net",
+ export_include_dirs: ["include"],
+ symbol_file: "libandroid_net.map.txt",
+ unversioned: true,
+}
diff --git a/native/android/Android.mk b/native/android/Android.mk
index 6e15331..97dbf0f 100644
--- a/native/android/Android.mk
+++ b/native/android/Android.mk
@@ -58,20 +58,3 @@
LOCAL_CFLAGS += $(common_cflags)
include $(BUILD_SHARED_LIBRARY)
-
-# Network library.
-include $(CLEAR_VARS)
-LOCAL_MODULE := libandroid_net
-LOCAL_CFLAGS := $(common_cflags)
-LOCAL_SRC_FILES:= \
- net.c \
-
-LOCAL_SHARED_LIBRARIES := \
- libnetd_client \
-
-LOCAL_C_INCLUDES += \
- frameworks/base/native/include \
- bionic/libc/dns/include \
- system/netd/include \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/native/android/include/multinetwork.h b/native/android/include/multinetwork.h
new file mode 120000
index 0000000..f9d051a
--- /dev/null
+++ b/native/android/include/multinetwork.h
@@ -0,0 +1 @@
+../../../../native/include/android/multinetwork.h
\ No newline at end of file
diff --git a/native/android/libandroid_net.map.txt b/native/android/libandroid_net.map.txt
new file mode 100644
index 0000000..9b5a5a1
--- /dev/null
+++ b/native/android/libandroid_net.map.txt
@@ -0,0 +1,10 @@
+# These functions have been part of the NDK since API 24.
+# They are also all available to vendor code.
+LIBANDROID_NET {
+ global:
+ android_setsocknetwork; # vndk
+ android_setprocnetwork; # vndk
+ android_getaddrinfofornetwork; # vndk
+ local:
+ *;
+};
diff --git a/packages/SettingsLib/res/color/batterymeter_frame_color.xml b/packages/SettingsLib/res/color/meter_background_color.xml
similarity index 100%
rename from packages/SettingsLib/res/color/batterymeter_frame_color.xml
rename to packages/SettingsLib/res/color/meter_background_color.xml
diff --git a/packages/SettingsLib/res/color/batterymeter_charge_color.xml b/packages/SettingsLib/res/color/meter_consumed_color.xml
similarity index 100%
rename from packages/SettingsLib/res/color/batterymeter_charge_color.xml
rename to packages/SettingsLib/res/color/meter_consumed_color.xml
diff --git a/packages/SettingsLib/res/layout/restricted_switch_preference.xml b/packages/SettingsLib/res/layout/restricted_switch_preference.xml
index 0e4ef6b..64b47b6 100644
--- a/packages/SettingsLib/res/layout/restricted_switch_preference.xml
+++ b/packages/SettingsLib/res/layout/restricted_switch_preference.xml
@@ -27,7 +27,7 @@
android:id="@+id/icon_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:minWidth="60dp"
+ android:minWidth="56dp"
android:gravity="start|center_vertical"
android:orientation="horizontal"
android:paddingEnd="12dp"
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index e89b21a..4f52812 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Agtergrondproses-limiet"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Wys alle ANRe"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Wys Program reageer nie-dialoog vir agtergrond programme"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Programme verplig ekstern toegelaat"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Maak dat enige program in eksterne berging geskryf kan word, ongeag manifeswaardes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Verplig verstelbare groottes vir aktiwiteite"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index d8150d1..465e253 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"የዳራ አሂድ ወሰን"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ሁሉንም ANRs አሳይ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ለዳራ መተግበሪያዎች ምላሽ የማይሰጥ መገናኛ ትግበራ አሳይ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 034653f..a4ee8fd 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"حد العمليات بالخلفية"</string>
<string name="show_all_anrs" msgid="28462979638729082">"عرض جميع رسائل ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"فرض السماح للتطبيقات على الخارجي"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"فرض إمكانية تغيير على الأنشطة"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 603f6918..690e589 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fon prosesi limiti"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Bütün ANRları göstər"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Arxa tətbiqlər dialoquna cavab verməyən tətbiqi göstər"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tətbiqlərə xaricdən məcburi icazə"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 70c6e47..e59dac6 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskih procesa"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Prinudno dozvoli aplikacije u spoljnoj"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Prinudno omogući promenu veličine aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f8eec7f..b1ec8678 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ліміт фонавага працэсу"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Паказаць усе ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Паказаць дыялогавае акно \"Праграма не адказвае\" для фонавых прыкладанняў"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Прымусова дазволіць праграмы на вонкавым сховішчы"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Робіць любую праграму даступнай для запісу на вонкавае сховішча, незалежна ад значэнняў маніфеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Зрабіць вокны дзеянняў даступнымі для змены памеру"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 53c50b9..a8039eb 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Лимит за фонови процеси"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Всички нереагиращи прил."</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Диалог. прозорец „НП“ за приложения на заден план"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Външно хран.: Принуд. разрешаване на приложенията"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави всички приложения да отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Възможност за преоразмеряване на активностите"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 841c96e..3f0de25 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"পশ্চাদপট প্রক্রিয়ার সীমা"</string>
<string name="show_all_anrs" msgid="28462979638729082">"সব ANR দেখান"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"পশ্চাদপটের অ্যাপ্লিকেশানগুলির জন্য অ্যাপ্লিকেশান কোনো প্রতিক্রিয়া দিচ্ছে না এমন কথোপকথন দেখান"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 451a1ff..f91a8a8 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje procesa u pozadini"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prik. dijalog Aplikacija ne reagira za apl. u poz."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Nametni aplikacije na vanjskoj pohrani"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava da svaka aplikacija bude pogodna za upisivanje na vanjsku pohranu, bez obzira na prikazane vrijednosti"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Nametni aktivnostima mijenjanje veličina"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 2a4db1d..99c5d37 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límita processos en segon pla"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tots els errors sense resposta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que una aplicació en segon pla no respon"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Força permís d\'aplicacions a l\'emmagatzem. extern"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Força l\'ajust de la mida de les activitats"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 673d51b..7b3fb86 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Omezení procesů na pozadí"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Zobrazit všechny ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vynutit povolení aplikací na externím úložišti"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vynutit možnost změny velikosti aktivit"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index aa0becf..6ccf45b 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Grænse for baggrundsprocesser"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Vis alle \"Appen svarer ikke\""</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Vis \"Appen svarer ikke\" for baggrundsapps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Gennemtving tilladelse til eksternt lager"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til at kunne tilpasses"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 0a2cf33..db58ab2 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Hintergrundprozesslimit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Alle ANRS anzeigen"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Dialogfeld \"App antwortet nicht\" für Hintergrund-Apps anzeigen"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Externe Speichernutzung von Apps erlauben"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ermöglicht es jeder qualifizierten App, Daten auf externen Speicher zu schreiben, unabhängig von den Manifestwerten"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Anpassen der Größe von Aktivitäten erzwingen"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 24d3bf4..cde2066 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Όριο διεργασ. παρασκηνίου"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Εμφάνιση όλων των ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Εμφ.του παραθ. \"Η εφαρμ.δεν αποκρ.\" για εφ.παρασκ."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 1464d44..03d8cea9 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límite de procesos en segundo plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar diálogo cuando las aplic. en 2do plano no responden"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permisos en almacenamiento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar actividades para que cambien de tamaño"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 39d4a76..00dbf9c 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límitar procesos en segundo plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informar de que una aplicación en segundo plano no responde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicaciones de forma externa"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hace que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo, independientemente de los valores definidos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar el ajuste de tamaño de las actividades"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 36d19ef..4d0f5f6 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprotsesside piir"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Näita kõiki ANR-e"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Kuva taustarakendustele dial. Rakendus ei reageeri"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Luba rakendused välises salvestusruumis"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Muuda tegevuste suurused muudetavaks"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index fd20d47..6ed2d75 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Atzeko planoko prozesuen muga"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Erakutsi ANR guztiak"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"\"Erantzunik ez\" mezua atz. planoko aplikazioetarako"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Behartu aplikazioak onartzea kanpoko biltegian"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Behartu jardueren tamaina doitu ahal izatea"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 65fe22c..bb10b38 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"محدودیت پردازش در پسزمینه"</string>
<string name="show_all_anrs" msgid="28462979638729082">"نمایش تمام ANRها"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index d306e23..7dd2e58 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprosessi"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Näytä kaikki ANR:t"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Näytä Sovellus ei vastaa -ikkuna taustasovell."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Salli aina ulkoinen tallennus"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Pakota kaikki toiminnot hyväksymään koon muutos"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index f851581..5641d7c 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages «L\'application ne répond pas»"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher « L\'application ne répond plus » pour applis en arrière-plan"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forcer l\'autor. d\'applis sur stockage externe"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forcer les activités à être redimensionnables"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index c69f324..b0b532f 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher \"L\'application ne répond plus\" pour applis en arrière-plan"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forcer disponibilité stockage externe pour applis"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forcer possibilité de redimensionner les activités"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 399199d..81a1ca9 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límite proceso 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que aplicación segundo plano non responde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicacións de forma externa"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permite que calquera aplicación apta se poida escribir nun almacenamento externo, independentemente dos valores expresados"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar o axuste do tamaño das actividades"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index df9eda9..e4e1507 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"પૃષ્ઠભૂમિ પ્રક્રિયા સીમા"</string>
<string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index c729027..936e775 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सभी ANR दिखाएं"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि ऐप्स के लिए ऐप्स प्रतिसाद नहीं दे रहा डॉयलॉग दिखाएं"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ऐप्स को बाहरी मेमोरी पर बाध्य करें"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप्लिकेशन, मेनिफेस्ट मानों को अनदेखा करके, बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index e94b6df..be4ac19 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskog procesa"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz dijaloga o pozad. aplik. koja ne odgovara"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Nametni mogućnost promjene veličine za aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index d06417f..b791178 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Háttérfolyamat-korlátozás"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Összes ANR mutatása"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Az Alkalmazás nem válaszol ablak megjelenítése"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Külső tárhely alkalmazásainak engedélyezése"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tevékenységek átméretezésének kényszerítése"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 8dd85c3..da34ccc 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -91,11 +91,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Հեռացված ծրագրեր"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Հեռացված հավելվածներն ու օգտատերերը"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB միացում"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB մոդեմ"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Դյուրակիր թեժ կետ"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth-ը կապվում է"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Միացում"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Միացում և շարժական թեժ կետ"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth մոդեմ"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Մոդեմի ռեժիմ"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Մոդեմի ռեժիմ"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Բոլոր աշխատանքային հավելվածները"</string>
<string name="user_guest" msgid="8475274842845401871">"Հյուր"</string>
<string name="unknown" msgid="1592123443519355854">"Անհայտ"</string>
@@ -149,7 +149,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտատիրոջ"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-ի կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"Միակցման կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"Այս օգտատերը չի կարող փոխել մոդեմի ռեժիմի կարգավորումները"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Մատչման կետի անվան կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
<string name="enable_adb" msgid="7982306934419797485">"USB վրիպազերծում"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Կարգաբերել ռեժիմը, երբ USB-ն միացված է"</string>
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Հետնաշերտի գործընթացի սահմանաչափ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Ցույց տալ բոլոր ANR-երը"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Ցուցադրել այն ծրագիրը, որը չի արձագանքում երկխոսությունը հետնաշերտի ծրագրերի համար"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Միշտ թույլատրել ծրագրեր արտաքին պահեստում"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Ստիպել, որ ակտիվությունների չափերը լինեն փոփոխելի"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 9e7355b..13407fe 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Batas proses latar blkg"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tampilkan semua ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Tmplkn dialog Apl Tidak Merespons utk apl ltr blkg"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Paksa izinkan aplikasi di eksternal"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktivitas agar ukurannya dapat diubah"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index d4fde8a..6457e71 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Takmörkun á bakgrunnsvinnslum"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Öll forrit sem svara ekki"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Þvinga fram leyfi forrita í ytri geymslu"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Þvinga breytanlega stærð virkni"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 0ebe77e5..5182730 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processi background"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostra tutti errori ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostra finestra ANR per applicazioni in background"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forza autorizzazione app su memoria esterna"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Imponi formato modificabile alle attività"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 182d819..249fac4 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"מגבלה של תהליכים ברקע"</string>
<string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"הצג תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 440b04d..8837e97 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"バックグラウンドプロセスの上限"</string>
<string name="show_all_anrs" msgid="28462979638729082">"すべてのANRを表示"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"バックグラウンドアプリが応答しない場合に通知する"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"外部ストレージへのアプリの書き込みを許可"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"アクティビティをサイズ変更可能にする"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 08e6449..81416a0 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ფონური პროცესების ლიმიტი"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ყველა ANR-ის ჩვენება"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"აპების დაშვება გარე მეხსიერებაში"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ზომაცვლადი აქტივობების იძულება"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index cc8b662..66b4a0e 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Фондық үрдіс шектеуі"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Барлық ANR (қолданба жауап бермеді) хабарларын көрсетіңіз"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Фондық қолданбалардың жауап бермегенін көрсету"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Сыртқыда қолданбаларға мәжбүрлеп рұқсат ету"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест мәндеріне қарамастан кез келген қолданбаны сыртқы жадқа жазуға жарамды етеді"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Әрекеттерді өлшемін өзгертуге болатын етуге мәжбүрлеу"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 917415c..1adc432 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ដែនកំណត់ដំណើរការក្នុងផ្ទៃខាងក្រោយ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"បង្ហាញ ANRs ទាំងអស់"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 0120658..c545da7 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆ ಮಿತಿ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ಎಲ್ಲ ANR ಗಳನ್ನು ತೋರಿಸು"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸು"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index c5f842e..bbaeed7 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"백그라운드 프로세스 수 제한"</string>
<string name="show_all_anrs" msgid="28462979638729082">"모든 ANR 보기"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"백그라운드 앱에 대해 앱 응답 없음 대화상자 표시"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"외부에서 앱 강제 허용"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"매니페스트 값과 관계없이 모든 앱이 외부 저장소에 작성되도록 허용"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"활동의 크기가 조정 가능하도록 설정"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 492f71d..66f3769 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Фондогу процесстер чеги"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Бардык ANR\'лерди көрсөтүү"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Фондогу колдонмолорго Колдонмо Жооп Бербейт деп көрсөтүү"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Тышкы сактагычка сактоого уруксат берүү"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Аракеттердин өлчөмүн өзгөртүүнү мажбурлоо"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 5abd2a6..c909cbb 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ການຈຳກັດໂປຣເຊສໃນພື້ນຫຼັງ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ສະແດງ ANRs ທັງຫມົດ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ສະແດງໜ້າຈໍແອັບຯທີ່ບໍ່ຕອບສະໜອງສຳລັບແອັບຯພື້ນຫຼັງ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ບັງຄັບອະນຸຍາດແອັບຢູ່ພາຍນອກ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ບັງຄັງໃຫ້ກິດຈະກຳປ່ຽນຂະໜາດໄດ້"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 830abf0..274ce9a 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fono procesų apribojimas"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Rodyti visus ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Fon. programose rodyti dialogo langą „Neatsako“"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Priverstinai leisti programas išorinėje atmintin."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 5749954..e760d78 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fona procesu ierobežojums"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Rādīt visus ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Rādīt fona lietotņu dialoglodz. Lietotne nereaģē"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Pielāgot darbības"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 88b3675..1979451 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Граница на процес во зад."</string>
<string name="show_all_anrs" msgid="28462979638729082">"Прикажи ги сите ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи „Апл. не реагира“ за. апл. во заднина"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Принуд. дозволете апликации на надворешна меморија"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави секоја апликација да биде подобна за запишување на надворешна меморија, независно од вредностите на манифестот"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Принуди ги активностите да ја менуваат големината"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 3ed642d..06a9dc1 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"പശ്ചാത്തല പ്രോസസ്സ് പരിധി"</string>
<string name="show_all_anrs" msgid="28462979638729082">"എല്ലാ ANR-കളും ദൃശ്യമാക്കുക"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"പശ്ചാത്തല അപ്ലിക്കേഷനുകൾക്ക് അപ്ലിക്കേഷൻ പ്രതികരിക്കുന്നില്ല എന്ന ഡയലോഗ് കാണിക്കുക"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"വലിപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 12c52812..f400f5a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Далд процессын хязгаар"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Бүх ANRs харуулах"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Далд апп-уудад Апп Хариу Өгөхгүй байна гэснийг харуулах"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Аппыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест утгыг нь үл хамааран дурын апп-г гадаад санах ойд бичих боломжтой болгодог"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index a45648e..10632e0 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पार्श्वभूमी प्रक्रिया मर्यादा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सर्व ANR दर्शवा"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पार्श्वभूमी अॅप्ससाठी अॅप प्रतिसाद देत नाही संवाद दर्शवा"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यवर अॅप्सना अनुमती देण्याची सक्ती करा"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"क्रियाकलापाचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 6ca514b..cc6a935 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Had proses latar belakang"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tunjukkan semua ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Tunjukkan dialog Aplikasi Tidak Memberi Maklum Balas untuk aplikasi latar belakang"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Benarkan apl secara paksa pada storan luaran"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Menjadikan sebarang apl layak ditulis ke storan luaran, tanpa mengambil kira nilai manifes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktiviti supaya boleh diubah saiz"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index c2e8a94..3e718006 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"နောက်ခံလုပ်ငန်းစဉ်ကန့်သတ်ခြင်း"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ANRsအားလုံးအား ပြသရန်"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"နောက်ခံအပ်ပလီကေးရှင်းအတွက်တုံ့ပြန်မှုမရှိပြရန်"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"အပြင်မှာ အတင်း ခွင့်ပြုရန်"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို ဝင်ရောက်ခွင့်ပြုပါ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"လုပ်ဆောင်ချက်များ ဆိုက်ညှိရနိုင်ရန် လုပ်ခိုင်းပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 409ccab..61ce9cb 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Bakgrunnsprosessgrense"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Vis alle ANR-er"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tving frem tillatelse for ekstern lagring av apper"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Dette gjør at alle apper kan lagres på eksterne lagringsmedier – uavhengig av manifestverdier"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til å kunne endre størrelse"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 2f61e8c..e87cf2f 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सबै ANRs देखाउनुहोस्"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि अनुप्रयोगका लागि जवाफ नदिइरहेका अनुप्रयोगहरू देखाउनुहोस्"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"गतिविधिहरू रिसाइज गर्नको लागि बाध्य गर्नुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 77e311e..b98ea2b 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Achtergrondproceslimiet"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Alle ANR\'s weergeven"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"\'App reageert niet\' weerg. voor apps op achtergr."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Toestaan van apps op externe opslag afdwingen"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Formaat activiteiten geforceerd aanpasbaar maken"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 8534e856..08dd09d 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆ ਸੀਮਾ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ਸਾਰੇ ANR ਦਿਖਾਓ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ਪਿਛੋਕੜ ਐਪਸ ਲਈ ਐਪਸ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੇ ਡਾਇਲੌਗ ਦਿਖਾਓ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ਐਪਸ ਨੂੰ ਬਾਹਰਲੇ ਤੇ ਜ਼ਬਰਦਸਤੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 7624042..e559c69 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesów w tle"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Pokaż wszystkie ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Pokaż okno Aplikacja Nie Reaguje dla aplikacji w tle"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Wymuś zezwalanie na aplikacje w pamięci zewn."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Wymuś zmianę rozmiaru okien aktywności"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 80b8990..cce80ed 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 0059cdd..8124c4b 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite proc. em 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar erro \"Aplic. não Resp.\" p/ aplic. 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar perm. de aplicações no armazenamento ext."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar as atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 80b8990..cce80ed 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 0ae7049..3a174de 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limită procese fundal"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afișați toate elem. ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Aplicații din fundal: afișați Aplicația nu răspunde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forțați accesul aplicațiilor la stocarea externă"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Face orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forțați redimensionarea activităților"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index cc82236..cd8d956 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Лимит фоновых процессов"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Все ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Уведомлять о том, что приложение не отвечает"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Разрешить сохранение на внешние накопители"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Разрешить сохранение приложений на внешних накопителях (независимо от значений в манифесте)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Изменение размера в многооконном режиме"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 1623308..592c2f9 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"පසුබිම් ක්රියාවලි සීමාව"</string>
<string name="show_all_anrs" msgid="28462979638729082">"සියලුම ANR පෙන්වන්න"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"පසුබිම් යෙදුම් වලට යෙදුම ප්රතිචාර නොදක්වයි කවුළුව පෙන්වන්න"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් බාහිර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ක්රියාකාරකම් ප්රතිප්රමාණ කළ හැකි බවට බල කරන්න"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 028d561..d5c4061 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesov na pozadí"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Zobrazovať všetky ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovať dialóg „Aplikácia neodpovedá“ aj pre aplikácie na pozadí"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vynútiť povolenie aplikácií na externom úložisku"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vynútiť možnosť zmeny veľkosti aktivít"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 085621a..4e0085c 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Omejitev postopkov v ozadju"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Pokaži okna neodzivanj"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz pogovornega okna za neodzivanje aplikacije v ozadju"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vsili omogočanje aplikacij v zunanji shrambi"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vsili povečanje velikosti za aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index c9398a5..e8340bf 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Kufizimi i proceseve në sfond"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Shfaq raportet ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Detyro lejimin në hapësirën e jashtme"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Detyro madhësinë e ndryshueshme për aktivitetet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 15ba747..63ceb73 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ограничење позадинских процеса"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Прикажи све ANR-ове"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Принудно дозволи апликације у спољној"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Принудно омогући промену величине активности"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index cfae5ae..1f2ca23 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Begränsa bakgrundsprocess"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Visa alla som inte svarar"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tillåt appar i externt lagringsutrymme"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Framtvinga storleksanpassning för aktiviteter"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index ef43134..4d75fbc 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -234,7 +234,7 @@
<string name="debug_monitoring_category" msgid="7640508148375798343">"Ufuatiliaji"</string>
<string name="strict_mode" msgid="1938795874357830695">"Modi makinifu imewezeshwa"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"Mulika skrini wakati programu zinafanya uendeshaji mrefu kwenye mnyororo mkuu"</string>
- <string name="pointer_location" msgid="6084434787496938001">"Mahali pa pointa"</string>
+ <string name="pointer_location" msgid="6084434787496938001">"Mahali pa kiashiria"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Kuegeshwa kwa skrini ikionyesha data ya mguso ya sasa"</string>
<string name="show_touches" msgid="2642976305235070316">"Onyesha unapogonga"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"Onyesha maoni ya picha unapogonga"</string>
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Kiwango cha mchakato wa mandari nyuma"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Onyesha ANR zote"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Onyesha kisanduku kidadisi cha Programu Haiitikii kwa programu za usuli"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Lazima uruhusu programu kwenye hifadhi ya nje"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index e09db51..47f7586 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"பின்புலச் செயல்முறை வரம்பு"</string>
<string name="show_all_anrs" msgid="28462979638729082">"எல்லா ANRகளையும் காட்டு"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"பின்புலப் பயன்பாடுகளுக்குப் பயன்பாடு பதிலளிக்கவில்லை என்ற உரையாடலைக் காட்டு"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"பயன்பாடுகளை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், எல்லா பயன்பாட்டையும் வெளிப்புறச் சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index dabf7ed..1a7ad4d 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"నేపథ్య ప్రాసెస్ పరిమితి"</string>
<string name="show_all_anrs" msgid="28462979638729082">"అన్ని ANRలను చూపు"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య అనువర్తనాల కోసం అనువర్తనం ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"అనువర్తనాలను బాహ్య నిల్వలో నిర్బంధంగా అనుమతించు"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయడానికి అనుమతిస్తుంది"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"కార్యాచరణలను పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 9a265f5..aa0296c 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ขีดจำกัดกระบวนการพื้นหลัง"</string>
<string name="show_all_anrs" msgid="28462979638729082">"แสดง ANR ทั้งหมด"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"แสดงหน้าต่างแอปไม่ตอบสนอง สำหรับแอปพื้นหลัง"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ทำให้สามารถเขียนแอปใดๆ ก็ตามไปยังพื้นที่เก็บข้อมูลภายนอกได้ โดยไม่คำนึงถึงค่าในไฟล์ Manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"บังคับให้กิจกรรมปรับขนาดได้"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index c46ac78..988a88b 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limitasyon ng proseso sa background"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Ipakita ang lahat ng ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"App Not Responding dialog para sa background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Pwersahang payagan ang mga app sa external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ginagawang kwalipikado ang anumang app na mailagay sa external na storage, anuman ang mga value ng manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Sapilitang gawing resizable ang mga aktibidad"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 696b209..5eff6c3a 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Arka plan işlem sınırı"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tüm ANR\'leri göster"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Harici birimdeki uygulamalara izin vermeye zorla"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest değerlerinden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index d3f137f..419a8c0 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Обмеження фон. процесів"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Показувати всі ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Сповіщати, коли додаток не відповідає"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Примусово записувати додатки в зовнішню пам’ять"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Примусово масштабувати активність"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 3fceb98..55f7132 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"پس منظر پروسیس کی حد"</string>
<string name="show_all_anrs" msgid="28462979638729082">"سبھی ANRs کو دکھائیں"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"پس منظر کی ایپس کیلئے ایپ جواب نہیں دے رہی ہے ڈائلاگ دکھائیں"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"سرگرمیوں کو ری سائز ایبل بنائیں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index ad9dc3a..4b53da5 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fondagi jarayonlarni cheklash"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Hamma ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Ilova javob bermayotgani haqida xabar qilish"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 910e66c..a6a54d0 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Giới hạn quá trình nền"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Hiển thị tất cả ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Hiện hộp thoại Ứng dụng ko đáp ứng cho ứng dụng nền"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Giúp mọi ứng dụng đủ điều kiện để được ghi vào bộ nhớ ngoài, bất kể giá trị tệp kê khai là gì"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Buộc các hoạt động có thể thay đổi kích thước"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index b224c23..41c5f60 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"后台进程限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"显示所有“应用无响应”(ANR)"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"为后台应用显示“应用无响应”对话框"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"强制允许将应用写入外部存储设备"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"强制将活动设为可调整大小"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 03081af..00748b0 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"顯示所有 ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"顯示背景應用程式的「應用程式無回應」對話框"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"強制允許應用程式寫入到外部儲存空間"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"在任何資訊清單值下,允許將所有符合資格的應用程式寫入到外部儲存完間"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"強制可變更活動尺寸"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 050c556..3988edd 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"顯示所有無回應程式"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"為背景應用程式顯示「應用程式無回應」對話方塊"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"強制允許將應用程式寫入外部儲存空間"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"將活動強制設為可調整大小"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index d2a5743..11dfdcc 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Isilinganiso senqubo yesithombe sanemuva"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Bonisa wonke ama-ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Boniso idayalogi Yohlelo Lokusebenza Olungasabeli kwizinhlelo zokusebenza zasemuva"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Imisebenzi yamandla izonikezwa usayizi omusha"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 044392c..4921be1 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -684,6 +684,12 @@
<string name="show_all_anrs_summary">Show App Not Responding dialog
for background apps</string>
+ <!-- UI debug setting: show all ANRs? [CHAR LIMIT=25] -->
+ <string name="show_notification_channel_warnings">Show notification channel warnings</string>
+ <!-- UI debug setting: show all ANRs summary [CHAR LIMIT=50] -->
+ <string name="show_notification_channel_warnings_summary">Displays on-screen warning when an app posts a notification without a valid channel</string>
+
+
<!-- UI debug setting: force allow apps on external storage [CHAR LIMIT=50] -->
<string name="force_allow_on_external">Force allow apps on external</string>
<!-- UI debug setting: force allow on external summary [CHAR LIMIT=150] -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java b/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
deleted file mode 100644
index d9f4c44..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib;
-
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Toast;
-
-/**
- * A touch listener which consumes touches when another window is partly or wholly obscuring the
- * window containing the view this listener is attached to.
- * Optionally accepts a string to show the user as a toast when consuming an insecure touch
- */
-public class SecureTouchListener implements View.OnTouchListener {
-
- private static final long TAP_DEBOUNCE_TIME = 2000;
- private long mLastToastTime = 0;
- private String mWarningText;
-
- public SecureTouchListener() {
- this(null);
- }
-
- public SecureTouchListener(String warningText) {
- mWarningText = warningText;
- }
-
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0
- || (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
- if (mWarningText != null) {
- // Show a toast warning the user
- final long currentTime = SystemClock.uptimeMillis();
- if (currentTime - mLastToastTime > TAP_DEBOUNCE_TIME) {
- mLastToastTime = currentTime;
- Toast.makeText(v.getContext(), mWarningText, Toast.LENGTH_SHORT).show();
- }
- }
- // Consume the touch event
- return true;
- }
- return false;
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index 3a2397f..3d50f23 100755
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -141,7 +141,7 @@
mWarningTextPaint.setColor(mColors[1]);
}
- mChargeColor = Utils.getDefaultColor(mContext, R.color.batterymeter_charge_color);
+ mChargeColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color);
mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color));
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index eb513e1..b3565ea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -521,7 +521,8 @@
public boolean isMetered() {
return mIsScoredNetworkMetered
|| (mConfig != null && mConfig.meteredHint)
- || (mInfo != null && mInfo.getMeteredHint());
+ || (mInfo != null && mInfo.getMeteredHint()
+ || (mNetworkInfo != null && mNetworkInfo.isMetered()));
}
public NetworkInfo getNetworkInfo() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index be15e65..7a63b8a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -250,10 +250,17 @@
mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
updateAccessPointsLocked();
+ if (DBG) {
+ Log.d(TAG, "force update - internal access point list:\n" + mInternalAccessPoints);
+ }
+
// Synchronously copy access points
mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
mMainHandler.handleMessage(
Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
+ if (DBG) {
+ Log.d(TAG, "force update - external access point list:\n" + mAccessPoints);
+ }
}
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 56cb0a3..801844b 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.when;
@@ -237,7 +236,7 @@
homeSp.setFriendlyName("Test Provider");
config.setHomeSp(homeSp);
AccessPoint ap = new AccessPoint(mContext, config);
- assertTrue(ap.isPasspointConfig());
+ assertThat(ap.isPasspointConfig()).isTrue();
}
@Test
@@ -254,8 +253,8 @@
wifiInfo.setNetworkId(configuration.networkId);
accessPoint.update(configuration, wifiInfo, networkInfo);
- assertTrue(accessPoint.isMetered());
- };
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
@Test
public void testIsMetered_returnTrueWhenWifiInfoIsMetered() {
@@ -271,8 +270,25 @@
wifiInfo.setMeteredHint(true);
accessPoint.update(configuration, wifiInfo, networkInfo);
- assertTrue(accessPoint.isMetered());
- };
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
+
+ @Test
+ public void testIsMetered_returnTrueWhenNetworkInfoIsMetered() {
+ WifiConfiguration configuration = createWifiConfiguration();
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
+ networkInfo.setMetered(true);
+ AccessPoint accessPoint = new AccessPoint(mContext, configuration);
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
+ wifiInfo.setBSSID(configuration.BSSID);
+ wifiInfo.setNetworkId(configuration.networkId);
+ accessPoint.update(configuration, wifiInfo, networkInfo);
+
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
@Test
public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() {
@@ -286,8 +302,24 @@
true /* metered */));
ap.update(mWifiNetworkScoreCache, false /* scoringUiEnabled */);
- assertTrue(ap.isMetered());
- };
+ assertThat(ap.isMetered()).isTrue();
+ }
+
+ @Test
+ public void testIsMetered_returnFalseByDefault() {
+ WifiConfiguration configuration = createWifiConfiguration();
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
+ AccessPoint accessPoint = new AccessPoint(mContext, configuration);
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
+ wifiInfo.setBSSID(configuration.BSSID);
+ wifiInfo.setNetworkId(configuration.networkId);
+ accessPoint.update(configuration, wifiInfo, networkInfo);
+
+ assertThat(accessPoint.isMetered()).isFalse();
+ }
private AccessPoint createAccessPointWithScanResultCache() {
Bundle bundle = new Bundle();
@@ -400,7 +432,7 @@
String providerFriendlyName = "Test Provider";
AccessPoint ap = new TestAccessPointBuilder(mContext).setFqdn(fqdn)
.setProviderFriendlyName(providerFriendlyName).build();
- assertTrue(ap.isPasspointConfig());
+ assertThat(ap.isPasspointConfig()).isTrue();
assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn);
assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName);
}
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 415bf9a..348b02a 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -52,6 +52,7 @@
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.annotation.MainThread;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Notification;
@@ -126,6 +127,8 @@
* <li>Stops itself if it doesn't have any process left to monitor.
* </ol>
* </ol>
+ *
+ * TODO: There are multiple threads involved. Add synchronization accordingly.
*/
public class BugreportProgressService extends Service {
private static final String TAG = "BugreportProgressService";
@@ -201,11 +204,15 @@
private static final String NOTIFICATION_CHANNEL_ID = "bugreports";
+ private final Object mLock = new Object();
+
/** Managed dumpstate processes (keyed by id) */
private final SparseArray<DumpstateListener> mProcesses = new SparseArray<>();
private Context mContext;
- private ServiceHandler mMainHandler;
+
+ private Handler mMainThreadHandler;
+ private ServiceHandler mServiceHandler;
private ScreenshotHandler mScreenshotHandler;
private final BugreportInfoDialog mInfoDialog = new BugreportInfoDialog();
@@ -234,7 +241,8 @@
@Override
public void onCreate() {
mContext = getApplicationContext();
- mMainHandler = new ServiceHandler("BugreportProgressServiceMainThread");
+ mMainThreadHandler = new Handler(Looper.getMainLooper());
+ mServiceHandler = new ServiceHandler("BugreportProgressServiceMainThread");
mScreenshotHandler = new ScreenshotHandler("BugreportProgressServiceScreenshotThread");
mScreenshotsDir = new File(getFilesDir(), SCREENSHOT_DIR);
@@ -260,10 +268,10 @@
Log.v(TAG, "onStartCommand(): " + dumpIntent(intent));
if (intent != null) {
// Handle it in a separate thread.
- final Message msg = mMainHandler.obtainMessage();
+ final Message msg = mServiceHandler.obtainMessage();
msg.what = MSG_SERVICE_COMMAND;
msg.obj = intent;
- mMainHandler.sendMessage(msg);
+ mServiceHandler.sendMessage(msg);
}
// If service is killed it cannot be recreated because it would not know which
@@ -278,7 +286,7 @@
@Override
public void onDestroy() {
- mMainHandler.getLooper().quit();
+ mServiceHandler.getLooper().quit();
mScreenshotHandler.getLooper().quit();
super.onDestroy();
}
@@ -613,7 +621,7 @@
// ignore it
}
- mInfoDialog.initialize(mContext, info);
+ mMainThreadHandler.post(() -> mInfoDialog.initialize(mContext, info));
}
/**
@@ -652,11 +660,11 @@
private void takeScreenshot(int id, int delay) {
if (delay > 0) {
Log.d(TAG, "Taking screenshot for " + id + " in " + delay + " seconds");
- final Message msg = mMainHandler.obtainMessage();
+ final Message msg = mServiceHandler.obtainMessage();
msg.what = MSG_DELAYED_SCREENSHOT;
msg.arg1 = id;
msg.arg2 = delay - 1;
- mMainHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
+ mServiceHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
return;
}
@@ -696,7 +704,7 @@
boolean taken = takeScreenshot(mContext, screenshotFile);
setTakingScreenshot(false);
- Message.obtain(mMainHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
+ Message.obtain(mServiceHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
screenshotFile).sendToTarget();
}
@@ -958,17 +966,24 @@
}
final Intent notifIntent;
+ boolean useChooser = true;
// Send through warning dialog by default
if (getWarningState(mContext, STATE_UNKNOWN) != STATE_HIDE) {
notifIntent = buildWarningIntent(mContext, sendIntent);
+ // No need to show a chooser in this case.
+ useChooser = false;
} else {
notifIntent = sendIntent;
}
notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Send the share intent...
- sendShareIntent(mContext, notifIntent);
+ if (useChooser) {
+ sendShareIntent(mContext, notifIntent);
+ } else {
+ mContext.startActivity(notifIntent);
+ }
// ... and stop watching this process.
stopProgress(id);
@@ -981,6 +996,8 @@
// Since we may be launched behind lockscreen, make sure that ChooserActivity doesn't finish
// itself in onStop.
chooserIntent.putExtra(ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP, true);
+ // Starting the activity from a service.
+ chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooserIntent);
}
@@ -1109,6 +1126,12 @@
* description will be saved on {@code description.txt}.
*/
private void addDetailsToZipFile(BugreportInfo info) {
+ synchronized (mLock) {
+ addDetailsToZipFileLocked(info);
+ }
+ }
+
+ private void addDetailsToZipFileLocked(BugreportInfo info) {
if (info.bugreportFile == null) {
// One possible reason is a bug in the Parcelization code.
Log.wtf(TAG, "addDetailsToZipFile(): no bugreportFile on " + info);
@@ -1430,6 +1453,7 @@
/**
* Sets its internal state and displays the dialog.
*/
+ @MainThread
void initialize(final Context context, BugreportInfo info) {
final String dialogTitle =
context.getString(R.string.bugreport_info_dialog_title, info.id);
diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
index 823b9b1..8bfcc74 100644
--- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
+++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
@@ -355,7 +355,7 @@
assertProgressNotification(NEW_NAME, 00.00f);
Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID, mPlainTextPath,
- mScreenshotPath);
+ mScreenshotPath, TITLE);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE,
NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS);
@@ -410,7 +410,7 @@
assertProgressNotification(NEW_NAME, 00.00f);
Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID,
- plainText? mPlainTextPath : mZipPath, mScreenshotPath);
+ plainText? mPlainTextPath : mZipPath, mScreenshotPath, TITLE);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE,
NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS);
@@ -465,7 +465,7 @@
sendBugreportStarted(ID2, PID2, NAME2, 1000);
sendBugreportFinished(ID, mZipPath, mScreenshotPath);
- Bundle extras = acceptBugreportAndGetSharedIntent(ID);
+ Bundle extras = acceptBugreportAndGetSharedIntent(TITLE);
detailsUi = new DetailsUi(mUiBot, ID2, NAME2);
detailsUi.assertName(NAME2);
@@ -479,7 +479,7 @@
// Must use a different zip file otherwise it will fail because zip already contains
// title.txt and description.txt entries.
- extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT);
+ extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT, TITLE2);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, NO_SCREENSHOT, ID2, PID2, TITLE2,
NEW_NAME2, TITLE2, DESCRIPTION2, 0, RENAMED_SCREENSHOTS);
@@ -568,7 +568,7 @@
// Send notification and click on share.
sendBugreportFinished(NO_ID, mPlainTextPath, null);
- acceptBugreport(NO_ID);
+ mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, NO_ID));
// Handle the warning
mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm));
@@ -725,13 +725,26 @@
return acceptBugreportAndGetSharedIntent(id);
}
+ // TODO: document / merge these 3 sendBugreportFinishedAndGetSharedIntent methods
+ private Bundle sendBugreportFinishedAndGetSharedIntent(int id, String bugreportPath,
+ String screenshotPath, String notificationTitle) {
+ sendBugreportFinished(id, bugreportPath, screenshotPath);
+ return acceptBugreportAndGetSharedIntent(notificationTitle);
+ }
+
/**
* Accepts the notification to share the finished bugreport and waits for the result.
*
* @return extras sent in the shared intent.
*/
private Bundle acceptBugreportAndGetSharedIntent(int id) {
- acceptBugreport(id);
+ final String notificationTitle = mContext.getString(R.string.bugreport_finished_title, id);
+ return acceptBugreportAndGetSharedIntent(notificationTitle);
+ }
+
+ // TODO: document and/or merge these 2 acceptBugreportAndGetSharedIntent methods
+ private Bundle acceptBugreportAndGetSharedIntent(String notificationTitle) {
+ mUiBot.clickOnNotification(notificationTitle);
mUiBot.chooseActivity(UI_NAME);
return mListener.getExtras();
}
@@ -744,13 +757,6 @@
}
/**
- * Accepts the notification to share the finished bugreport.
- */
- private void acceptBugreport(int id) {
- mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, id));
- }
-
- /**
* Sends a "bugreport finished" intent.
*/
private void sendBugreportFinished(int id, String bugreportPath, String screenshotPath) {
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 79b02a5..c4e134b 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -531,7 +531,7 @@
<activity
android:name=".settings.BrightnessDialog"
android:label="@string/quick_settings_brightness_dialog_title"
- android:theme="@android:style/Theme.DeviceDefault.Light.Dialog"
+ android:theme="@*android:style/Theme.DeviceDefault.QuickSettings.Dialog"
android:finishOnCloseSystemDialogs="true"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index 4a5a681..d571243 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -62,6 +62,9 @@
View getHeader();
+ default void setHasNotifications(boolean hasNotifications) {
+ }
+
@ProvidesInterface(version = HeightListener.VERSION)
public interface HeightListener {
public static final int VERSION = 1;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
index 4ce1e36..3cd5d89 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
@@ -49,6 +49,8 @@
public boolean isDismissGesture(MotionEvent ev);
+ public boolean isFalseGesture(MotionEvent ev);
+
public boolean swipedFarEnough(float translation, float viewSize);
public boolean swipedFastEnough(float translation, float velocity);
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index 8fe2835..ed415b8 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -30,7 +30,6 @@
android:layout_height="wrap_content"
android:textColor="@color/clock_white"
style="@style/widget_label"
- android:textAllCaps="true"
android:letterSpacing="0.15"
android:gravity="center"
/>
@@ -41,7 +40,6 @@
android:drawableStart="@drawable/ic_access_alarms_big"
android:textColor="@color/clock_gray"
android:letterSpacing="0.15"
- android:textAllCaps="true"
style="@style/widget_label"
android:layout_marginStart="6dp"
android:gravity="center"
diff --git a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
index 469ce52..3fb86d0 100644
--- a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
@@ -16,5 +16,5 @@
-->
<resources>
- <dimen name="widget_big_font_size">84dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
index cb89cb4..3fb86d0 100644
--- a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
@@ -16,5 +16,5 @@
-->
<resources>
- <dimen name="widget_big_font_size">88dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 83ba8bf..7e208c2 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -91,13 +91,13 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
- <item quantity="one">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo.</item>
</plurals>
<string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cartão SIM inutilizável. Contacte o seu operador."</string>
<plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
<item quantity="other">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item>
- <item quantity="one">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável.</item>
</plurals>
<string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha ao introduzir o PIN do cartão SIM!"</string>
<string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha ao introduzir o PUK do cartão SIM!"</string>
@@ -117,16 +117,16 @@
<string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"Dispositivo bloqueado pelo administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o padrão.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o PIN.</item>
</plurals>
<plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item>
</plurals>
<string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
index a3b01b6..9e788be 100644
--- a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
@@ -26,7 +26,7 @@
<dimen name="keyguard_security_view_margin">12dp</dimen>
<!-- Overload default clock widget parameters -->
- <dimen name="widget_big_font_size">110dp</dimen>
+ <dimen name="widget_big_font_size">100dp</dimen>
<dimen name="widget_label_font_size">16sp</dimen>
<dimen name="bottom_text_spacing_digital">-1dp</dimen>
diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
index 210c7eb..7eb63d7 100644
--- a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
@@ -24,5 +24,5 @@
<!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) -->
<dimen name="keyguard_security_height">420dp</dimen>
- <dimen name="widget_big_font_size">122dp</dimen>
+ <dimen name="widget_big_font_size">100dp</dimen>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 7b952be2..3ca6e69 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -41,7 +41,7 @@
<!-- Default clock parameters -->
<dimen name="bottom_text_spacing_digital">-1dp</dimen>
<dimen name="widget_label_font_size">14sp</dimen>
- <dimen name="widget_big_font_size">78dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
<!-- The y translation to apply at the start in appear animations. -->
<dimen name="appear_y_translation_start">32dp</dimen>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
deleted file mode 100644
index 195849a..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32dp"
- android:viewportWidth="12.0"
- android:viewportHeight="12.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
deleted file mode 100644
index 68c4307..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
deleted file mode 100644
index 61ecc9c..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32dp"
- android:viewportWidth="12.0"
- android:viewportHeight="12.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
deleted file mode 100644
index 782fbe4..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
- android:viewportWidth="19.0"
- android:viewportHeight="19.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.6,7.8l0.7,0.0l0.0,1.3L4.6,9.1L4.6,11.0L3.0,11.0L3.0,9.2L0.1,9.2L0.0,8.2l3.0,-5.7l1.7,0.0L4.6,7.8L4.6,7.8zM1.7,7.8L3.0,7.8l0.0,-3.0L2.9,5.0L1.7,7.8z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.9,9.9c-0.2,0.4 -0.6,0.7 -1.0,0.9s-1.0,0.4 -1.8,0.4c-0.9,0.0 -1.7,-0.3 -2.2,-0.8S6.1,9.0 6.1,7.9L6.1,5.6c0.0,-1.1 0.3,-1.9 0.8,-2.4S8.2,2.4 9.0,2.4c1.0,0.0 1.7,0.2 2.1,0.7s0.7,1.2 0.7,2.1l-1.6,0.0c0.0,-0.5 -0.1,-0.9 -0.2,-1.1S9.5,3.7 9.0,3.7c-0.4,0.0 -0.7,0.2 -0.9,0.5S7.8,5.0 7.8,5.6l0.0,2.3c0.0,0.7 0.1,1.1 0.3,1.4c0.2,0.3 0.6,0.5 1.0,0.5c0.3,0.0 0.6,0.0 0.7,-0.1s0.3,-0.2 0.4,-0.3L10.2,7.8L9.0,7.8L9.0,6.6l2.9,0.0L11.9,9.9z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M17.7,4.4l-1.900001,0.0 0.0,-1.9 -1.2,0.0 0.0,1.9 -1.900001,0.0 0.0,1.2 1.900001,0.0 0.0,1.9 1.2,0.0 0.0,-1.9 1.900001,0.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
deleted file mode 100644
index dd5843d..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:autoMirrored="true"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M21.799999,22.299999l-1.199999,-1.299999 0.000000,0.000000 -9.600000,-10.000000 0.000000,0.000000 -6.400000,-6.700000 -1.300000,1.300000 6.400000,6.700000 -8.700000,8.700000 16.900000,0.000000 2.600000,2.700001z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M21.000000,1.000000l-8.600000,8.600000 8.600000,9.100000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
deleted file mode 100644
index 4232126..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group
- android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
deleted file mode 100644
index 0c512d7..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
deleted file mode 100644
index b9572b2..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group
- android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
deleted file mode 100644
index a381d03e..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml
deleted file mode 100644
index 3bed28a..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
- Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.0,9.7l2.0,0.0L4.0,11.0L0.4,11.0L0.4,2.5L2.0,2.5L2.0,9.7z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.3,3.8L7.0,3.8L7.0,11.0L5.4,11.0L5.4,3.8L4.0,3.8L4.0,2.5l4.3,0.0L8.3,3.8z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.4,7.3l-1.7,0.0l0.0,2.4l2.1,0.0L12.799999,11.0L9.0,11.0L9.0,2.5l3.7,0.0l0.0,1.3l-2.1,0.0l0.0,2.1l1.7,0.0L12.4,7.3L12.4,7.3z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M18.4,4.4l-1.9,0.0 0.0,-1.9 -1.2,0.0 0.0,1.9 -1.900001,0.0 0.0,1.2 1.900001,0.0 0.0,1.9 1.2,0.0 0.0,-1.9 1.9,0.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml
index f41c494..34e43ce 100644
--- a/packages/SystemUI/res/layout/qs_detail.xml
+++ b/packages/SystemUI/res/layout/qs_detail.xml
@@ -26,10 +26,6 @@
android:paddingBottom="8dp"
android:visibility="invisible">
- <com.android.systemui.ResizingSpace
- android:layout_width="match_parent"
- android:layout_height="@dimen/qs_detail_margin_top" />
-
<include
android:id="@+id/qs_detail_header"
layout="@layout/qs_detail_header"
diff --git a/packages/SystemUI/res/layout/qs_detail_header.xml b/packages/SystemUI/res/layout/qs_detail_header.xml
index 871ed67..a1f0ee7 100644
--- a/packages/SystemUI/res/layout/qs_detail_header.xml
+++ b/packages/SystemUI/res/layout/qs_detail_header.xml
@@ -20,34 +20,46 @@
android:layout_height="wrap_content"
android:paddingLeft="@dimen/qs_detail_header_padding"
android:paddingTop="@dimen/qs_detail_header_padding"
- android:paddingBottom="@dimen/qs_detail_header_bottom_padding"
+ android:paddingBottom="@dimen/qs_detail_items_padding_top"
android:paddingEnd="@dimen/qs_panel_padding"
android:background="@drawable/btn_borderless_rect"
+ android:orientation="vertical"
android:gravity="center">
- <TextView
- android:id="@android:id/title"
- android:paddingStart="@dimen/qs_detail_header_text_padding"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:textDirection="locale"
- android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+ <com.android.systemui.ResizingSpace
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_detail_margin_top" />
- <ImageView
- android:id="@+id/settings"
- android:layout_width="@dimen/qs_detail_image_width"
- android:layout_height="@dimen/qs_detail_image_height"
- android:background="?android:attr/selectableItemBackground"
- android:padding="@dimen/qs_detail_image_padding"
- android:src="@drawable/ic_settings"
- android:visibility="gone"/>
-
- <Switch
- android:id="@android:id/toggle"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:clickable="false"
- android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@android:id/title"
+ android:paddingStart="@dimen/qs_detail_header_text_padding"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textDirection="locale"
+ android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+ <ImageView
+ android:id="@+id/settings"
+ android:layout_width="@dimen/qs_detail_image_width"
+ android:layout_height="@dimen/qs_detail_image_height"
+ android:background="?android:attr/selectableItemBackground"
+ android:padding="@dimen/qs_detail_image_padding"
+ android:src="@drawable/ic_settings"
+ android:visibility="gone"/>
+
+ <Switch
+ android:id="@android:id/toggle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="false"
+ android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+ </LinearLayout>
</com.android.keyguard.AlphaOptimizedLinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_detail_items.xml b/packages/SystemUI/res/layout/qs_detail_items.xml
index b9cdf28..60cba67 100644
--- a/packages/SystemUI/res/layout/qs_detail_items.xml
+++ b/packages/SystemUI/res/layout/qs_detail_items.xml
@@ -20,7 +20,6 @@
xmlns:sysui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingTop="@dimen/qs_detail_items_padding_top"
android:paddingStart="@dimen/qs_detail_padding_start"
android:paddingEnd="16dp">
diff --git a/packages/SystemUI/res/layout/qs_footer.xml b/packages/SystemUI/res/layout/qs_footer.xml
index c92c811..871d1f3 100644
--- a/packages/SystemUI/res/layout/qs_footer.xml
+++ b/packages/SystemUI/res/layout/qs_footer.xml
@@ -27,20 +27,23 @@
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="0dp"
- android:paddingEnd="8dp"
- android:paddingStart="16dp"
+ android:background="#00000000"
android:gravity="center_vertical"
android:orientation="horizontal">
<include
android:id="@+id/date_time_alarm_group"
layout="@layout/status_bar_alarm_group"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
android:gravity="end">
<com.android.systemui.statusbar.phone.MultiUserSwitch
@@ -113,4 +116,9 @@
android:padding="14dp" />
</LinearLayout>
+ <include layout="@layout/qs_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_gravity="bottom" />
+
</com.android.systemui.qs.QSFooter>
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index fb47bbc..fb4ac04 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -35,6 +35,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
+ android:background="#00000000"
android:layout_marginBottom="48dp" />
<include layout="@layout/quick_status_bar_expanded_header" />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 65344b7..66c5dd5 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -24,11 +24,11 @@
android:layout_height="@dimen/status_bar_header_height"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:baselineAligned="false"
+ android:background="#00000000"
android:elevation="4dp"
android:clickable="false"
android:clipChildren="false"
android:clipToPadding="false"
- android:paddingBottom="48dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingStart="0dp">
@@ -40,8 +40,8 @@
android:clipChildren="false"
android:clipToPadding="false"
android:gravity="center"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
android:orientation="horizontal">
@@ -82,10 +82,9 @@
<com.android.systemui.qs.QuickQSPanel
android:id="@+id/quick_qs_panel"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="48dp"
android:layout_alignParentEnd="true"
- android:layout_marginTop="36dp"
- android:layout_marginBottom="8dp"
+ android:layout_marginTop="31dp"
android:layout_alignParentTop="true"
android:accessibilityTraversalAfter="@+id/date_time_group"
android:accessibilityTraversalBefore="@id/expand_indicator"
@@ -94,8 +93,7 @@
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:focusable="true"
- android:importantForAccessibility="yes"
- android:paddingTop="0dp"/>
+ android:importantForAccessibility="yes" />
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@+id/qs_detail_header_progress"
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index 8707840..200eabf 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -36,7 +36,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
- android:layout_marginTop="8dp"
android:layout_marginBottom="8dp" />
<RelativeLayout
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 18b9357..811b16c 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -719,8 +719,8 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string>
- <string name="pip_menu_title" msgid="3328510504196964712">"Menu PIP"</string>
- <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode PIP"</string>
+ <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
<string name="pip_play" msgid="1417176722760265888">"Lecture"</string>
<string name="pip_pause" msgid="8881063404466476571">"Suspendre"</string>
diff --git a/packages/SystemUI/res/values-fr/strings_tv.xml b/packages/SystemUI/res/values-fr/strings_tv.xml
index 3c0ad7a..43579af 100644
--- a/packages/SystemUI/res/values-fr/strings_tv.xml
+++ b/packages/SystemUI/res/values-fr/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture (PIP)"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programme sans titre)"</string>
<string name="pip_close" msgid="3480680679023423574">"Fermer mode PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Plein écran"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index ff3dba4..7481d1a 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -719,8 +719,8 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Pechar"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra cara abaixo para ignorar"</string>
- <string name="pip_menu_title" msgid="3328510504196964712">"Menú de imaxe superposta"</string>
- <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na imaxe superposta"</string>
+ <string name="pip_menu_title" msgid="3328510504196964712">"Menú de pantalla superposta"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactivala."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproducir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
diff --git a/packages/SystemUI/res/values-gl/strings_tv.xml b/packages/SystemUI/res/values-gl/strings_tv.xml
index c7f0ce1..87a636c 100644
--- a/packages/SystemUI/res/values-gl/strings_tv.xml
+++ b/packages/SystemUI/res/values-gl/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Imaxe superposta"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantalla superposta"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programa sen título)"</string>
<string name="pip_close" msgid="3480680679023423574">"Pechar PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 9567c91..92bc82e 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -470,7 +470,7 @@
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"जब तक कि आप मैन्युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"सूचनाएं अधिक तेज़ी से प्राप्त करें"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"आपके द्वारा उन्हें अनलॉक किए जाने से पहले देखें"</string>
- <string name="hidden_notifications_cancel" msgid="3690709735122344913">"नहीं धन्यवाद"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"रहने दें"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 4d1fc9f..1189b05 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"Բջջային ինտերնետ"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Բջջային տվյալները միացված են"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Բջջային տվյալներն անջատված են"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ը կապվում է:"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth մոդեմ"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ինքնաթիռի ռեժիմ"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"Միացնել VPN-ը։"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM քարտ չկա:"</string>
@@ -311,7 +311,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Միանում է..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Միացում"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Մոդեմի ռեժիմ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Թեժ կետ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ծանուցումներ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Լապտեր"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index c4f8e7b..273b390 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -750,8 +750,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"스크린샷"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"저장소"</string>
- <string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string>
- <string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string>
+ <string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
<string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string>
<string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c5089a4..74089b2 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Os ecrãs recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicações recentes"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
+ <item quantity="one">%d screens in Overview</item>
<item quantity="other">%d ecrãs na Vista geral</item>
- <item quantity="one">1 ecrã na Vista geral</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
@@ -252,8 +252,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
+ <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item>
<item quantity="other">Mais <xliff:g id="NUMBER_1">%s</xliff:g> notificações no grupo.</item>
- <item quantity="one">Mais <xliff:g id="NUMBER_0">%s</xliff:g> notificação no grupo.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Definições de notificação"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Definições do <xliff:g id="APP_NAME">%s</xliff:g>"</string>
@@ -552,13 +552,13 @@
<string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> categorias de notificação"</string>
<string name="notification_default_channel_desc" msgid="2506053815870808359">"Esta aplicação não tem categorias de notificação"</string>
<plurals name="notification_num_channels_desc" formatted="false" msgid="5492793452274077663">
+ <item quantity="one">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> notification categories from this app</item>
<item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias de notificação desta aplicação</item>
- <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoria de notificação desta aplicação</item>
</plurals>
<string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string>
<plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157">
+ <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, and <xliff:g id="NUMBER_5">%3$d</xliff:g> others</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> e mais <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
- <item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> e mais <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> abertos"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> fechados"</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 6604b6c..4245b11 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -249,7 +249,6 @@
<dimen name="qs_panel_padding_bottom">0dp</dimen>
<dimen name="qs_detail_header_height">56dp</dimen>
<dimen name="qs_detail_header_padding">0dp</dimen>
- <dimen name="qs_detail_header_bottom_padding">0dp</dimen>
<dimen name="qs_detail_image_width">56dp</dimen>
<dimen name="qs_detail_image_height">56dp</dimen>
<dimen name="qs_detail_image_padding">16dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c656b17..994a566 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1508,6 +1508,8 @@
<string name="snooze_option_30_min">30 minutes</string>
<!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
<string name="snooze_option_1_hour">1 hour</string>
+ <!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
+ <string name="snooze_option_2_hour">2 hours</string>
<!-- Notification: Menu row: Snooze undo button label. [CHAR LIMIT=50]-->
<string name="snooze_undo">UNDO</string>
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 9dd39d4..cf8747e 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -89,7 +89,7 @@
TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
defStyle, 0);
final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,
- context.getColor(R.color.batterymeter_frame_color));
+ context.getColor(R.color.meter_background_color));
mDrawable = new BatteryMeterDrawableBase(context, frameColor);
atts.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 9c03ea6..74b745f 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -653,15 +653,19 @@
}
public boolean isDismissGesture(MotionEvent ev) {
+ return ev.getActionMasked() == MotionEvent.ACTION_UP
+ && !isFalseGesture(ev) && (swipedFastEnough() || swipedFarEnough())
+ && mCallback.canChildBeDismissed(mCurrView);
+ }
+
+ public boolean isFalseGesture(MotionEvent ev) {
boolean falsingDetected = mCallback.isAntiFalsingNeeded();
if (mFalsingManager.isClassiferEnabled()) {
falsingDetected = falsingDetected && mFalsingManager.isFalseTouch();
} else {
falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold;
}
- return !falsingDetected && (swipedFastEnough() || swipedFarEnough())
- && ev.getActionMasked() == MotionEvent.ACTION_UP
- && mCallback.canChildBeDismissed(mCurrView);
+ return falsingDetected;
}
protected boolean swipedFastEnough() {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
index 68c8007..36dbb0f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
@@ -17,12 +17,13 @@
package com.android.systemui.pip;
import android.content.Context;
+import android.content.res.Configuration;
import java.io.PrintWriter;
public interface BasePipManager {
void initialize(Context context);
void showPictureInPictureMenu();
- void onConfigurationChanged();
+ void onConfigurationChanged(Configuration newConfig);
void dump(PrintWriter pw);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
index a1f6553..b7164cb 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
@@ -72,7 +72,7 @@
return;
}
- mPipManager.onConfigurationChanged();
+ mPipManager.onConfigurationChanged(newConfig);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 5ca9fa5..0373d77 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -25,6 +25,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ParceledListSlice;
+import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
@@ -196,7 +197,7 @@
/**
* Updates the PIP per configuration changed.
*/
- public void onConfigurationChanged() {
+ public void onConfigurationChanged(Configuration newConfig) {
mTouchHandler.onConfigurationChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index c35fdd5..854696e 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -716,9 +716,15 @@
* Updates the current movement bounds based on whether the menu is currently visible.
*/
private void updateMovementBounds(int menuState) {
- mMovementBounds = menuState == MENU_STATE_FULL
+ boolean isMenuExpanded = menuState == MENU_STATE_FULL;
+ mMovementBounds = isMenuExpanded
? mExpandedMovementBounds
: mNormalMovementBounds;
+ try {
+ mPinnedStackController.setMinEdgeSize(isMenuExpanded ? mExpandedShortestEdgeSize : 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not set minimized state", e);
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 6490b33..5414aad 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -26,6 +26,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect;
import android.media.session.MediaController;
@@ -116,6 +117,7 @@
private Rect mDefaultPipBounds = new Rect();
private Rect mSettingsPipBounds;
private Rect mMenuModePipBounds;
+ private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED;
private boolean mInitialized;
private int mPipTaskId = TASK_ID_NO_PIP;
private ComponentName mPipComponentName;
@@ -237,7 +239,7 @@
}
}
- loadConfigurationsAndApply();
+ loadConfigurationsAndApply(mContext.getResources().getConfiguration());
mMediaSessionManager =
(MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
@@ -250,7 +252,14 @@
mPipNotification = new PipNotification(context);
}
- private void loadConfigurationsAndApply() {
+ private void loadConfigurationsAndApply(Configuration newConfig) {
+ if (mLastOrientation != newConfig.orientation) {
+ // Don't resize the pinned stack on orientation change. TV does not care about this case
+ // and this could clobber the existing animation to the new bounds calculated by WM.
+ mLastOrientation = newConfig.orientation;
+ return;
+ }
+
Resources res = mContext.getResources();
mSettingsPipBounds = Rect.unflattenFromString(res.getString(
R.string.pip_settings_bounds));
@@ -267,8 +276,8 @@
/**
* Updates the PIP per configuration changed.
*/
- public void onConfigurationChanged() {
- loadConfigurationsAndApply();
+ public void onConfigurationChanged(Configuration newConfig) {
+ loadConfigurationsAndApply(newConfig);
mPipNotification.onConfigurationChanged(mContext);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
index 30240c3..c8f4185 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
@@ -194,7 +194,7 @@
private void dismissPipNotification() {
mNotified = false;
- mNotificationManager.cancel(SystemMessage.NOTE_TV_PIP);
+ mNotificationManager.cancel(NOTIFICATION_TAG, SystemMessage.NOTE_TV_PIP);
}
private boolean updateMediaControllerMetadata() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 189c04c..0d74b7a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -17,14 +17,11 @@
package com.android.systemui.qs;
import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
-import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.qs.customize.QSCustomizer;
@@ -44,6 +41,7 @@
private QSFooter mQSFooter;
private int mGutterHeight;
private View mBackground;
+ private float mFullElevation;
public QSContainerImpl(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -59,6 +57,17 @@
mQSFooter = findViewById(R.id.qs_footer);
mBackground = findViewById(R.id.qs_background);
mGutterHeight = getContext().getResources().getDimensionPixelSize(R.dimen.qs_gutter_height);
+ mFullElevation = mQSPanel.getElevation();
+
+ setClickable(true);
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
+ }
+
+ @Override
+ public boolean performClick() {
+ // Want to receive clicks so missing QQS tiles doesn't cause collapse, but
+ // don't want to do anything with them.
+ return true;
}
@Override
@@ -85,7 +94,7 @@
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- updateBottom();
+ updateExpansion();
}
/**
@@ -96,27 +105,47 @@
*/
public void setHeightOverride(int heightOverride) {
mHeightOverride = heightOverride;
- updateBottom();
+ updateExpansion();
}
- public void updateBottom() {
+ public void updateExpansion() {
int height = calculateContainerHeight();
- setBottom(getTop() + height + mGutterHeight);
+ int gutterHeight = Math.round(mQsExpansion * mGutterHeight);
+ setBottom(getTop() + height + gutterHeight);
mQSDetail.setBottom(getTop() + height);
- mBackground.setBottom(mQSDetail.getBottom());
+ mBackground.setBottom(getTop() + height);
// Pin QS Footer to the bottom of the panel.
mQSFooter.setTranslationY(height - mQSFooter.getHeight());
+
+ float elevation = mQsExpansion * mFullElevation;
+ mQSDetail.setElevation(elevation);
+ mBackground.setElevation(elevation);
+ mQSFooter.setElevation(elevation);
+ mQSPanel.setElevation(elevation);
}
protected int calculateContainerHeight() {
int heightOverride = mHeightOverride != -1 ? mHeightOverride : getMeasuredHeight();
return mQSCustomizer.isCustomizing() ? mQSCustomizer.getHeight()
- : (int) (mQsExpansion * (heightOverride - mHeader.getHeight()))
+ : Math.round(mQsExpansion * (heightOverride - mHeader.getHeight()))
+ mHeader.getHeight();
}
public void setExpansion(float expansion) {
mQsExpansion = expansion;
- updateBottom();
+ updateExpansion();
+ }
+
+ public void setGutterEnabled(boolean gutterEnabled) {
+ if (gutterEnabled == (mGutterHeight != 0)) {
+ return;
+ }
+ if (gutterEnabled) {
+ mGutterHeight = getContext().getResources().getDimensionPixelSize(
+ R.dimen.qs_gutter_height);
+ } else {
+ mGutterHeight = 0;
+ }
+ updateExpansion();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 063f5df..682c56c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -101,6 +101,8 @@
private boolean mShowEditIcon;
private TouchAnimator mAnimator;
private View mDateTimeGroup;
+ private boolean mKeyguardShowing;
+ private TouchAnimator mAlarmAnimator;
public QSFooter(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -163,13 +165,14 @@
int remaining = (width - numTiles * size) / (numTiles - 1);
int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
- final Builder builder = new Builder()
+ mAnimator = new Builder()
.addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0)
.addFloat(mSettingsButton, "rotation", -120, 0)
- .addFloat(mAlarmStatus, "alpha", 0, 1);
+ .build();
if (mAlarmShowing) {
- builder.addFloat(mDate, "alpha", 1, 0)
+ mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0)
.addFloat(mDateTimeGroup, "translationX", 0, -mDate.getWidth())
+ .addFloat(mAlarmStatus, "alpha", 0, 1)
.setListener(new ListenerAdapter() {
@Override
public void onAnimationAtStart() {
@@ -180,13 +183,13 @@
public void onAnimationStarted() {
mAlarmStatus.setVisibility(View.VISIBLE);
}
- });
+ }).build();
} else {
+ mAlarmAnimator = null;
mAlarmStatus.setVisibility(View.GONE);
mDate.setAlpha(1);
mDateTimeGroup.setTranslationX(0);
}
- mAnimator = builder.build();
setExpansion(mExpansionAmount);
}
@@ -235,6 +238,7 @@
}
TouchAnimator.Builder animatorBuilder = new TouchAnimator.Builder();
+ animatorBuilder.setStartDelay(QSAnimator.EXPANDED_TILE_DELAY);
if (mShowEditIcon) {
animatorBuilder.addFloat(mEdit, "alpha", 0, 1);
@@ -247,6 +251,11 @@
return animatorBuilder.build();
}
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ mKeyguardShowing = keyguardShowing;
+ setExpansion(mExpansionAmount);
+ }
+
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
@@ -274,6 +283,8 @@
public void setExpansion(float headerExpansionFraction) {
mExpansionAmount = headerExpansionFraction;
if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
+ if (mAlarmAnimator != null) mAlarmAnimator.setPosition(
+ mKeyguardShowing ? 0 : headerExpansionFraction);
if (mSettingsAlpha != null) {
mSettingsAlpha.setPosition(headerExpansionFraction);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 3f090f8..c9c3a7f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -34,7 +34,6 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.R.id;
-import com.android.systemui.R.style;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
@@ -130,6 +129,11 @@
return mHeader;
}
+ @Override
+ public void setHasNotifications(boolean hasNotifications) {
+ mContainer.setGutterEnabled(hasNotifications);
+ }
+
public void setPanelView(HeightListener panelView) {
mPanelView = panelView;
}
@@ -218,6 +222,7 @@
mQSAnimator.setOnKeyguard(keyguardShowing);
}
+ mFooter.setKeyguardShowing(keyguardShowing);
updateQsState();
}
@@ -307,7 +312,7 @@
public void notifyCustomizeChanged() {
// The customize state changed, so our height changed.
- mContainer.updateBottom();
+ mContainer.updateExpansion();
mQSPanel.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
mHeader.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
mFooter.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
@@ -340,7 +345,7 @@
}
public int getQsMinExpansionHeight() {
- return mHeader.getHeight() + mGutterHeight;
+ return mHeader.getHeight();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
index 8596b57..84524a6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
@@ -24,6 +24,7 @@
public interface QSHost {
void warn(String message, Throwable t);
void collapsePanels();
+ void forceCollapsePanels();
void openPanels();
Context getContext();
Collection<QSTile> getTiles();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 9330541..02937d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -143,6 +143,11 @@
}
@Override
+ public void forceCollapsePanels() {
+ mStatusBar.postAnimateForceCollapsePanels();
+ }
+
+ @Override
public void openPanels() {
mStatusBar.postAnimateOpenPanels();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 8539cb9..00b883a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -60,6 +60,12 @@
mTileLayout = new HeaderTileLayout(context);
mTileLayout.setListening(mListening);
addView((View) mTileLayout, 0 /* Between brightness and footer */);
+ super.setPadding(0, 0, 0, 0);
+ }
+
+ @Override
+ public void setPadding(int left, int top, int right, int bottom) {
+ // Always have no padding.
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index e457d72..abafd64 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -23,13 +23,11 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
-import android.widget.TextClock;
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.R.id;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.QSDetail.Callback;
import com.android.systemui.statusbar.SignalClusterView;
@@ -79,7 +77,7 @@
battery.setForceShowPercent(true);
// Don't show the Wi-Fi indicator here, because it is shown just below in the tile.
SignalClusterView signalCluster = findViewById(R.id.signal_cluster);
- signalCluster.setForceBlockWifi();
+ signalCluster.setQsSignalCluster();
mActivityStarter = Dependency.get(ActivityStarter.class);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index d2f3bb6..943a176 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -204,7 +204,7 @@
if (customTile != null) {
verifyCaller(customTile);
customTile.onDialogShown();
- mHost.collapsePanels();
+ mHost.forceCollapsePanels();
mServices.get(customTile).setShowingDialog(true);
}
}
@@ -224,7 +224,7 @@
CustomTile customTile = getTileForToken(token);
if (customTile != null) {
verifyCaller(customTile);
- mHost.collapsePanels();
+ mHost.forceCollapsePanels();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index ecc275d..74cc0ec 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -141,7 +141,7 @@
private final BatteryMeterDrawableBase mDrawable
= new BatteryMeterDrawableBase(
mHost.getContext(),
- mHost.getContext().getColor(R.color.batterymeter_frame_color));
+ mHost.getContext().getColor(R.color.meter_background_color));
private View mCurrentView;
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index 6f28838..f0d7d6c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -16,33 +16,33 @@
package com.android.systemui.qs.tiles;
+import static android.media.MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY;
+
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
+import android.media.MediaRouter;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.quicksettings.Tile;
-import android.support.v7.app.MediaRouteChooserDialog;
-import android.support.v7.app.MediaRouteControllerDialog;
-import android.support.v7.media.MediaControlIntent;
-import android.support.v7.media.MediaRouteSelector;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
+import com.android.internal.app.MediaRouteChooserDialog;
+import com.android.internal.app.MediaRouteControllerDialog;
+import com.android.internal.app.MediaRouteDialogPresenter;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.R.style;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
@@ -133,19 +133,12 @@
@Override
public void showDetail(boolean show) {
mUiHandler.post(() -> {
- Context context = new ContextThemeWrapper(mContext,
- R.style.Theme_AppCompat_Light_Dialog_Alert);
- if (mState.value) {
- mDialog = new MediaRouteControllerDialog(context);
- } else {
- // Instead of showing detail, show standard media routing UI.
- MediaRouteChooserDialog dialog = new MediaRouteChooserDialog(context);
- MediaRouteSelector selector = new MediaRouteSelector.Builder()
- .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
- .build();
- dialog.setRouteSelector(selector);
- mDialog = dialog;
- }
+ mDialog = MediaRouteDialogPresenter.createDialog(mContext, ROUTE_TYPE_REMOTE_DISPLAY,
+ v -> {
+ mDialog.dismiss();
+ Dependency.get(ActivityStarter.class)
+ .postStartActivityDismissingKeyguard(getLongClickIntent(), 0);
+ });
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
mUiHandler.post(() -> mDialog.show());
registerReceiver();
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index ecfa4ff..9e2ec57 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -160,7 +160,7 @@
private boolean mHomeStackResizable;
private boolean mAdjustedForIme;
private DividerState mState;
- private SurfaceFlingerVsyncChoreographer mSfChoreographer;
+ private final SurfaceFlingerVsyncChoreographer mSfChoreographer;
private final Handler mHandler = new Handler() {
@Override
@@ -250,20 +250,22 @@
};
public DividerView(Context context) {
- super(context);
+ this(context, null);
}
public DividerView(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ this(context, attrs, defStyleAttr, 0);
}
public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, context.getDisplay(),
+ Choreographer.getInstance());
}
@Override
@@ -313,8 +315,6 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
EventBus.getDefault().register(this);
- mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, getDisplay(),
- Choreographer.getInstance());
}
@Override
@@ -725,14 +725,21 @@
mMinimizedSnapAlgorithm = null;
mDockedStackMinimized = minimized;
initializeSnapAlgorithm();
- if (!mIsInMinimizeInteraction && minimized) {
- mIsInMinimizeInteraction = true;
- mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition(
- isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight,
- mDividerSize);
+ if (mIsInMinimizeInteraction != minimized) {
+ if (minimized) {
+ mIsInMinimizeInteraction = true;
+ mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition(
+ isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight,
+ mDividerSize);
- int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
- resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
+ int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
+ resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
+ } else {
+ resizeStack(mDividerPositionBeforeMinimized, mDividerPositionBeforeMinimized,
+ mSnapAlgorithm.calculateNonDismissingSnapTarget(
+ mDividerPositionBeforeMinimized));
+ mIsInMinimizeInteraction = false;
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 3a39e91..a81b140 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -91,6 +91,7 @@
}
private LayoutListener mLayoutListener;
+ private boolean mLowPriorityStateUpdated;
private final NotificationInflater mNotificationInflater;
private int mIconTransformContentShift;
private int mIconTransformContentShiftNoIcon;
@@ -813,10 +814,10 @@
public void onDensityOrFontScaleChanged() {
initDimens();
- if (mIsSummaryWithChildren) {
- if (mChildrenContainer != null) {
- mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
- }
+ // Let's update our childrencontainer. This is intentionally not guarded with
+ // mIsSummaryWithChildren since we might have had children but not anymore.
+ if (mChildrenContainer != null) {
+ mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
}
if (mGuts != null) {
View oldGuts = mGuts;
@@ -1121,6 +1122,15 @@
}
}
+
+ public void setLowPriorityStateUpdated(boolean lowPriorityStateUpdated) {
+ mLowPriorityStateUpdated = lowPriorityStateUpdated;
+ }
+
+ public boolean hasLowPriorityStateUpdated() {
+ return mLowPriorityStateUpdated;
+ }
+
public boolean isLowPriority() {
return mIsLowPriority;
}
@@ -1458,9 +1468,11 @@
public void setUserLocked(boolean userLocked) {
mUserLocked = userLocked;
mPrivateLayout.setUserExpanding(userLocked);
- if (mIsSummaryWithChildren) {
+ // This is intentionally not guarded with mIsSummaryWithChildren since we might have had
+ // children but not anymore.
+ if (mChildrenContainer != null) {
mChildrenContainer.setUserLocked(userLocked);
- if (userLocked || !isGroupExpanded()) {
+ if (mIsSummaryWithChildren && (userLocked || !isGroupExpanded())) {
updateBackgroundForGroupState();
}
}
@@ -2189,4 +2201,9 @@
}
}
}
+
+ @VisibleForTesting
+ protected void setChildrenContainer(NotificationChildrenContainer childrenContainer) {
+ mChildrenContainer = childrenContainer;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
new file mode 100644
index 0000000..22fd37c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar;
+
+/**
+ * An interface for running inflation tasks that allows aborting and superseding existing
+ * operations.
+ */
+public interface InflationTask {
+ void abort();
+
+ /**
+ * Supersedes an existing task. i.e another task was superceeded by this.
+ *
+ * @param task the task that was previously running
+ */
+ default void supersedeTask(InflationTask task) {}
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index f8bad05..1844946 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -24,7 +24,6 @@
import android.content.pm.PackageManager;
import android.content.Context;
import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
import android.os.RemoteException;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
@@ -84,7 +83,7 @@
public List<SnoozeCriterion> snoozeCriteria;
private int mCachedContrastColor = COLOR_INVALID;
private int mCachedContrastColorIsFor = COLOR_INVALID;
- private Abortable mRunningTask = null;
+ private InflationTask mRunningTask = null;
public Entry(StatusBarNotification n) {
this.key = n.getKey();
@@ -225,10 +224,14 @@
}
}
- public void setInflationTask(Abortable abortableTask) {
+ public void setInflationTask(InflationTask abortableTask) {
// abort any existing inflation
+ InflationTask existing = mRunningTask;
abortTask();
mRunningTask = abortableTask;
+ if (existing != null && mRunningTask != null) {
+ mRunningTask.supersedeTask(existing);
+ }
}
public void onInflationTaskFinished() {
@@ -236,7 +239,7 @@
}
@VisibleForTesting
- public Abortable getRunningTask() {
+ public InflationTask getRunningTask() {
return mRunningTask;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 7062216..427708b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -221,7 +221,9 @@
boolean nonBlockable = false;
try {
final PackageInfo pkgInfo = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
- nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo);
+ nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo)
+ && (mSingleNotificationChannel == null
+ || !mSingleNotificationChannel.isBlockableSystem());
} catch (PackageManager.NameNotFoundException e) {
// unlikely.
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
index d4b8920..570de18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
@@ -140,7 +140,7 @@
@Override
public void createMenu(ViewGroup parent) {
mParent = (ExpandableNotificationRow) parent;
- createMenuViews();
+ createMenuViews(true /* resetState */);
}
@Override
@@ -164,7 +164,7 @@
// Menu hasn't been created yet, no need to do anything.
return;
}
- createMenuViews();
+ createMenuViews(!isMenuVisible() /* resetState */);
}
@Override
@@ -179,7 +179,7 @@
mParent.removeListener();
}
- private void createMenuViews() {
+ private void createMenuViews(boolean resetState) {
// Filter the menu items based on the notification
if (mParent != null && mParent.getStatusBarNotification() != null) {
int flags = mParent.getStatusBarNotification().getNotification().flags;
@@ -201,7 +201,14 @@
for (int i = 0; i < mMenuItems.size(); i++) {
addMenuView(mMenuItems.get(i), mMenuContainer);
}
- resetState(false /* notify */);
+ if (resetState) {
+ resetState(false /* notify */);
+ } else {
+ mIconsPlaced = false;
+ setMenuLocation();
+ // If the # of items showing changed we need to update the snap position
+ showMenu(mParent, mOnLeft ? getSpaceForMenu() : -getSpaceForMenu(), 0 /* velocity */);
+ }
}
private void resetState(boolean notify) {
@@ -330,7 +337,8 @@
} else {
snapBack(animView, velocity);
}
- } else if ((swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
+ } else if (!mSwipeHelper.isFalseGesture(ev)
+ && (swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
|| (gestureTowardsMenu && !mSwipeHelper.isDismissGesture(ev))) {
// Menu has not been snapped to previously and this is menu revealing gesture
showMenu(animView, menuSnapTarget, velocity);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 78a5194..5cb3c1f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -227,7 +227,7 @@
}
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
float notificationClipEnd;
- boolean aboveShelf = row.getTranslationZ() > baseZHeight;
+ boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight;
boolean isLastChild = child == lastChild;
float rowTranslationY = row.getTranslationY();
if (isLastChild || aboveShelf || backgroundForceHidden) {
@@ -284,10 +284,15 @@
private void updateNotificationClipHeight(ExpandableNotificationRow row,
float notificationClipEnd) {
float viewEnd = row.getTranslationY() + row.getActualHeight();
+ boolean isPinned = row.isPinned() || row.isHeadsUpAnimatingAway();
if (viewEnd > notificationClipEnd
- && (mAmbientState.isShadeExpanded()
- || (!row.isPinned() && !row.isHeadsUpAnimatingAway()))) {
- row.setClipBottomAmount((int) (viewEnd - notificationClipEnd));
+ && (mAmbientState.isShadeExpanded() || !isPinned)) {
+ int clipBottomAmount = (int) (viewEnd - notificationClipEnd);
+ if (isPinned) {
+ clipBottomAmount = Math.min(row.getIntrinsicHeight() - row.getCollapsedHeight(),
+ clipBottomAmount);
+ }
+ row.setClipBottomAmount(clipBottomAmount);
} else {
row.setClipBottomAmount(0);
}
@@ -381,7 +386,8 @@
? fullTransitionAmount
: transitionAmount;
iconState.clampedAppearAmount = clampedAmount;
- float contentTransformationAmount = isLastChild || iconState.translateContent
+ float contentTransformationAmount = !row.isAboveShelf()
+ && (isLastChild || iconState.translateContent)
? iconTransitionAmount
: 0.0f;
row.setContentTransformationAmount(contentTransformationAmount, isLastChild);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index 8830c5d..8af1628 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -57,7 +57,7 @@
private ViewGroup mSnoozeOptionContainer;
private List<SnoozeOption> mSnoozeOptions;
private int mCollapsedHeight;
-
+ private SnoozeOption mDefaultOption;
private SnoozeOption mSelectedOption;
private boolean mSnoozing;
private boolean mExpanded;
@@ -86,7 +86,7 @@
createOptionViews();
// Default to first option in list
- setSelected(mSnoozeOptions.get(0));
+ setSelected(mDefaultOption);
}
public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) {
@@ -119,7 +119,9 @@
ArrayList<SnoozeOption> options = new ArrayList<>();
options.add(createOption(R.string.snooze_option_15_min, 15));
options.add(createOption(R.string.snooze_option_30_min, 30));
- options.add(createOption(R.string.snooze_option_1_hour, 60));
+ mDefaultOption = createOption(R.string.snooze_option_1_hour, 60);
+ options.add(mDefaultOption);
+ options.add(createOption(R.string.snooze_option_2_hour, 60 * 2));
return options;
}
@@ -232,7 +234,7 @@
@Override
public View getContentView() {
// Reset the view before use
- setSelected(mSnoozeOptions.get(0));
+ setSelected(mDefaultOption);
return this;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 28a858c..b4822ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -121,6 +121,7 @@
private boolean mBlockEthernet;
private boolean mActivityEnabled;
private boolean mForceBlockWifi;
+ private boolean mQsSignal;
public SignalClusterView(Context context) {
this(context, null);
@@ -152,9 +153,10 @@
updateActivityEnabled();
}
- public void setForceBlockWifi() {
+ public void setQsSignalCluster() {
mForceBlockWifi = true;
mBlockWifi = true;
+ mQsSignal = true;
if (isAttachedToWindow()) {
// Re-register to get new callbacks.
mNetworkController.removeCallback(this);
@@ -299,19 +301,23 @@
}
@Override
- public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ public void setMobileDataIndicators(IconState icon, IconState qsIcon, int type,
int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
String description, boolean isWide, int subId, boolean roaming) {
PhoneState state = getState(subId);
if (state == null) {
return;
}
- state.mMobileVisible = statusIcon.visible && !mBlockMobile;
- state.mMobileStrengthId = statusIcon.icon;
- state.mMobileTypeId = statusType;
- state.mMobileDescription = statusIcon.contentDescription;
+ if (mQsSignal) {
+ icon = qsIcon;
+ type = qsType;
+ }
+ state.mMobileVisible = icon.visible && !mBlockMobile;
+ state.mMobileStrengthId = icon.icon;
+ state.mMobileTypeId = type;
+ state.mMobileDescription = icon.contentDescription;
state.mMobileTypeDescription = typeContentDescription;
- state.mIsMobileTypeIconWide = statusType != 0 && isWide;
+ state.mIsMobileTypeIconWide = type != 0 && isWide;
state.mRoaming = roaming;
state.mActivityIn = activityIn && mActivityEnabled;
state.mActivityOut = activityOut && mActivityEnabled;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index f1c26cd..4b08f2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -28,7 +28,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationContentView;
import com.android.systemui.statusbar.NotificationData;
@@ -36,6 +36,13 @@
import com.android.systemui.util.Assert;
import java.util.HashMap;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A utility that inflates the right kind of contentView based on the state
@@ -50,6 +57,7 @@
private static final int FLAG_REINFLATE_HEADS_UP_VIEW = 1<<2;
private static final int FLAG_REINFLATE_PUBLIC_VIEW = 1<<3;
private static final int FLAG_REINFLATE_AMBIENT_VIEW = 1<<4;
+ private static final InflationExecutor EXECUTOR = new InflationExecutor();
private final ExpandableNotificationRow mRow;
private boolean mIsLowPriority;
@@ -122,6 +130,12 @@
*/
@VisibleForTesting
void inflateNotificationViews(int reInflateFlags) {
+ if (mRow.isRemoved()) {
+ // We don't want to reinflate anything for removed notifications. Otherwise views might
+ // be readded to the stack, leading to leaks. This may happen with low-priority groups
+ // where the removal of already removed children can lead to a reinflation.
+ return;
+ }
StatusBarNotification sbn = mRow.getEntry().notification;
new AsyncInflationTask(sbn, reInflateFlags, mRow, mIsLowPriority,
mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient,
@@ -330,14 +344,14 @@
cancellationSignal = newContentView.applyAsync(
result.packageContext,
parentLayout,
- null /* executor */,
+ EXECUTOR,
listener,
remoteViewClickHandler);
} else {
cancellationSignal = newContentView.reapplyAsync(
result.packageContext,
existingView,
- null /* executor */,
+ EXECUTOR,
listener,
remoteViewClickHandler);
}
@@ -477,17 +491,17 @@
}
public static class AsyncInflationTask extends AsyncTask<Void, Void, InflationProgress>
- implements InflationCallback, Abortable {
+ implements InflationCallback, InflationTask {
private final StatusBarNotification mSbn;
private final Context mContext;
- private final int mReInflateFlags;
private final boolean mIsLowPriority;
private final boolean mIsChildInGroup;
private final boolean mUsesIncreasedHeight;
private final InflationCallback mCallback;
private final boolean mUsesIncreasedHeadsUpHeight;
private final boolean mRedactAmbient;
+ private int mReInflateFlags;
private ExpandableNotificationRow mRow;
private Exception mError;
private RemoteViews.OnClickHandler mRemoteViewClickHandler;
@@ -500,8 +514,6 @@
InflationCallback callback,
RemoteViews.OnClickHandler remoteViewClickHandler) {
mRow = row;
- NotificationData.Entry entry = row.getEntry();
- entry.setInflationTask(this);
mSbn = notification;
mReInflateFlags = reInflateFlags;
mContext = mRow.getContext();
@@ -512,6 +524,13 @@
mRedactAmbient = redactAmbient;
mRemoteViewClickHandler = remoteViewClickHandler;
mCallback = callback;
+ NotificationData.Entry entry = row.getEntry();
+ entry.setInflationTask(this);
+ }
+
+ @VisibleForTesting
+ public int getReInflateFlags() {
+ return mReInflateFlags;
}
@Override
@@ -572,6 +591,14 @@
}
@Override
+ public void supersedeTask(InflationTask task) {
+ if (task instanceof AsyncInflationTask) {
+ // We want to inflate all flags of the previous task as well
+ mReInflateFlags |= ((AsyncInflationTask) task).mReInflateFlags;
+ }
+ }
+
+ @Override
public void handleInflationException(StatusBarNotification notification, Exception e) {
handleError(e);
}
@@ -604,4 +631,40 @@
public abstract void setResultView(View v);
public abstract RemoteViews getRemoteView();
}
+
+ /**
+ * A custom executor that allows more tasks to be queued. Default values are copied from
+ * AsyncTask
+ */
+ private static class InflationExecutor implements Executor {
+ private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
+ // We want at least 2 threads and at most 4 threads in the core pool,
+ // preferring to have 1 less than the CPU count to avoid saturating
+ // the CPU with background work
+ private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
+ private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
+ private static final int KEEP_ALIVE_SECONDS = 30;
+
+ private static final ThreadFactory sThreadFactory = new ThreadFactory() {
+ private final AtomicInteger mCount = new AtomicInteger(1);
+
+ public Thread newThread(Runnable r) {
+ return new Thread(r, "InflaterThread #" + mCount.getAndIncrement());
+ }
+ };
+
+ private final ThreadPoolExecutor mExecutor;
+
+ private InflationExecutor() {
+ mExecutor = new ThreadPoolExecutor(
+ CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<>(), sThreadFactory);
+ mExecutor.allowCoreThreadTimeOut(true);
+ }
+
+ @Override
+ public void execute(Runnable runnable) {
+ mExecutor.execute(runnable);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
index 1bfc0cc..3491f81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
@@ -22,14 +22,14 @@
import android.view.ViewGroup;
import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
/**
* An inflater task that asynchronously inflates a ExpandableNotificationRow
*/
-public class RowInflaterTask implements Abortable, AsyncLayoutInflater.OnInflateFinishedListener {
+public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInflateFinishedListener {
private RowInflationFinishedListener mListener;
private NotificationData.Entry mEntry;
private boolean mCancelled;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
index 8dab069..09aff1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
@@ -38,6 +38,7 @@
private boolean mReorderingAllowed;
private VisibilityLocationProvider mVisibilityLocationProvider;
private ArraySet<View> mAllowedReorderViews = new ArraySet<>();
+ private ArraySet<View> mLowPriorityReorderingViews = new ArraySet<>();
private ArraySet<View> mAddedChildren = new ArraySet<>();
private boolean mPulsing;
@@ -115,6 +116,9 @@
if (mAddedChildren.contains(row)) {
return true;
}
+ if (mLowPriorityReorderingViews.contains(row)) {
+ return true;
+ }
if (mAllowedReorderViews.contains(row)
&& !mVisibilityLocationProvider.isInVisibleLocation(row)) {
return true;
@@ -130,6 +134,7 @@
public void onReorderingFinished() {
mAllowedReorderViews.clear();
mAddedChildren.clear();
+ mLowPriorityReorderingViews.clear();
}
@Override
@@ -141,6 +146,10 @@
}
}
+ public void onLowPriorityUpdated(NotificationData.Entry entry) {
+ mLowPriorityReorderingViews.add(entry.row);
+ }
+
/**
* Notify the visual stability manager that a new view was added and should be allowed to
* reorder next time.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index c5f23c5..6b276f8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -53,6 +53,7 @@
private float mInFrontTarget;
private float mBehindTarget;
private boolean mDozingAborted;
+ private boolean mWakeAndUnlocking;
public DozeScrimController(ScrimController scrimController, Context context) {
mContext = context;
@@ -63,6 +64,7 @@
public void setDozing(boolean dozing, boolean animate) {
if (mDozing == dozing) return;
mDozing = dozing;
+ mWakeAndUnlocking = false;
if (mDozing) {
mDozingAborted = false;
abortAnimations();
@@ -85,6 +87,16 @@
}
}
+ public void setWakeAndUnlocking() {
+ // Immediately abort the doze scrims in case of wake-and-unlock
+ // for pulsing so the Keyguard fade-out animation scrim can take over.
+ if (!mWakeAndUnlocking) {
+ mWakeAndUnlocking = true;
+ mScrimController.setDozeBehindAlpha(0f);
+ mScrimController.setDozeInFrontAlpha(0f);
+ }
+ }
+
/** When dozing, fade screen contents in and out using the front scrim. */
public void pulse(@NonNull DozeHost.PulseCallback callback, int reason) {
if (callback == null) {
@@ -109,7 +121,7 @@
*/
public void abortPulsing() {
cancelPulsing();
- if (mDozing) {
+ if (mDozing && !mWakeAndUnlocking) {
mScrimController.setDozeBehindAlpha(1f);
mScrimController.setDozeInFrontAlpha(
mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f);
@@ -244,6 +256,9 @@
}
private void setDozeAlpha(boolean inFront, float alpha) {
+ if (mWakeAndUnlocking) {
+ return;
+ }
if (inFront) {
mScrimController.setDozeInFrontAlpha(alpha);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index f216d6c..6cb722f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -98,7 +98,6 @@
private StatusBar mStatusBar;
private final UnlockMethodCache mUnlockMethodCache;
private final Context mContext;
- private boolean mGoingToSleep;
private int mPendingAuthenticatedUserId = -1;
public FingerprintUnlockController(Context context,
@@ -213,17 +212,19 @@
Trace.endSection();
break;
case MODE_WAKE_AND_UNLOCK_PULSING:
- Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING");
- mStatusBar.updateMediaMetaData(false /* metaDataChanged */,
- true /* allowEnterAnimation */);
- // Fall through.
- Trace.endSection();
case MODE_WAKE_AND_UNLOCK:
- Trace.beginSection("MODE_WAKE_AND_UNLOCK");
+ if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) {
+ Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING");
+ mStatusBar.updateMediaMetaData(false /* metaDataChanged */,
+ true /* allowEnterAnimation */);
+ } else {
+ Trace.beginSection("MODE_WAKE_AND_UNLOCK");
+ mDozeScrimController.abortDoze();
+ }
mStatusBarWindowManager.setStatusBarFocusable(false);
- mDozeScrimController.abortDoze();
mKeyguardViewMediator.onWakeAndUnlocking();
mScrimController.setWakeAndUnlocking();
+ mDozeScrimController.setWakeAndUnlocking();
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
}
@@ -302,10 +303,7 @@
}
private void cleanup() {
- mMode = MODE_NONE;
releaseFingerprintWakeLock();
- mStatusBarWindowManager.setForceDozeBrightness(false);
- mStatusBar.notifyFpAuthModeChanged();
}
public void startKeyguardFadingAway() {
@@ -321,6 +319,7 @@
public void finishKeyguardFadingAway() {
mMode = MODE_NONE;
+ mStatusBarWindowManager.setForceDozeBrightness(false);
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 41a60e2..6fe8827 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -330,7 +330,7 @@
private void updateRightAffordanceIcon() {
IconState state = mRightButton.getIcon();
- mRightAffordanceView.setVisibility(state.isVisible ? View.VISIBLE : View.GONE);
+ mRightAffordanceView.setVisibility(!mDozing && state.isVisible ? View.VISIBLE : View.GONE);
mRightAffordanceView.setImageDrawable(state.drawable, state.tint);
mRightAffordanceView.setContentDescription(state.contentDescription);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 0fa8afa..6aab8e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -2401,17 +2401,26 @@
@Override
public void setAlpha(float alpha) {
super.setAlpha(alpha);
- updateFullyVisibleState();
+ updateFullyVisibleState(false /* forceNotFullyVisible */);
+ }
+
+ /**
+ * Must be called before starting a ViewPropertyAnimator alpha animation because those
+ * do NOT call setAlpha and therefore don't properly update the fullyVisibleState.
+ */
+ public void notifyStartFading() {
+ updateFullyVisibleState(true /* forceNotFullyVisible */);
}
@Override
public void setVisibility(int visibility) {
super.setVisibility(visibility);
- updateFullyVisibleState();
+ updateFullyVisibleState(false /* forceNotFullyVisible */);
}
- private void updateFullyVisibleState() {
- mNotificationStackScroller.setParentNotFullyVisible(getAlpha() != 1.0f
+ private void updateFullyVisibleState(boolean forceNotFullyVisible) {
+ mNotificationStackScroller.setParentNotFullyVisible(forceNotFullyVisible
+ || getAlpha() != 1.0f
|| getVisibility() != VISIBLE);
}
@@ -2526,6 +2535,9 @@
public void setNoVisibleNotifications(boolean noNotifications) {
mNoVisibleNotifications = noNotifications;
+ if (mQs != null) {
+ mQs.setHasNotifications(!noNotifications);
+ }
}
public void setPulsing(boolean pulsing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 9d1d038..4b1d7d7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -224,6 +224,7 @@
if (mTracking) {
onTrackingStopped(true /* expanded */);
}
+ notifyExpandingFinished();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
index a9eb20b..8cd8791 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
@@ -30,6 +30,7 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
+import android.util.LayoutDirection;
import android.util.Log;
import com.android.settingslib.R;
@@ -192,6 +193,13 @@
@Override
public void draw(@NonNull Canvas canvas) {
+ boolean isRtl = getLayoutDirection() == LayoutDirection.RTL;
+ if (isRtl) {
+ canvas.save();
+ // Mirror the drawable
+ canvas.translate(canvas.getWidth(), 0);
+ canvas.scale(-1.0f, 1.0f);
+ }
mFullPath.reset();
mFullPath.setFillType(FillType.WINDING);
float width = getBounds().width();
@@ -250,6 +258,9 @@
}
canvas.drawPath(mXPath, mForegroundPaint);
}
+ if (isRtl) {
+ canvas.restore();
+ }
}
private void drawDot(Path fullPath, Path foregroundPath, float x, float y, float dotSize,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index d798fbf..07ab6876 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -759,6 +759,7 @@
mBatteryController = Dependency.get(BatteryController.class);
mAssistManager = Dependency.get(AssistManager.class);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
+ mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
@@ -1612,9 +1613,16 @@
@Override
public void onAsyncInflationFinished(Entry entry) {
mPendingNotifications.remove(entry.key);
- if (mNotificationData.get(entry.key) == null) {
+ // If there was an async task started after the removal, we don't want to add it back to
+ // the list, otherwise we might get leaks.
+ boolean isNew = mNotificationData.get(entry.key) == null;
+ if (isNew && !entry.row.isRemoved()) {
addEntry(entry);
+ } else if (!isNew && entry.row.hasLowPriorityStateUpdated()) {
+ mVisualStabilityManager.onLowPriorityUpdated(entry);
+ updateNotificationShade();
}
+ entry.row.setLowPriorityStateUpdated(false);
}
private boolean shouldSuppressFullScreenIntent(String key) {
@@ -1762,10 +1770,10 @@
continue;
}
toRemove.add(row);
- toRemove.get(i).setKeepInParent(true);
+ row.setKeepInParent(true);
// we need to set this state earlier as otherwise we might generate some weird
// animations
- toRemove.get(i).setRemoved();
+ row.setRemoved();
}
}
}
@@ -2876,6 +2884,15 @@
mHandler.post(mAnimateCollapsePanels);
}
+ public void postAnimateForceCollapsePanels() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
+ }
+ });
+ }
+
public void postAnimateOpenPanels() {
mHandler.sendEmptyMessage(MSG_OPEN_SETTINGS_PANEL);
}
@@ -4138,6 +4155,7 @@
* fading.
*/
public void fadeKeyguardWhilePulsing() {
+ mNotificationPanel.notifyStartFading();
mNotificationPanel.animate()
.alpha(0f)
.setStartDelay(0)
@@ -4356,12 +4374,7 @@
mKeyguardIndicationController.setDozing(mDozing);
mNotificationPanel.setDark(mDozing, animate);
updateQsExpansionEnabled();
-
- // Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock
- // for pulsing so the Keyguard fade-out animation scrim can take over.
- mDozeScrimController.setDozing(mDozing &&
- mFingerprintUnlockController.getMode()
- != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING, animate);
+ mDozeScrimController.setDozing(mDozing, animate);
updateRowStates();
Trace.endSection();
}
@@ -5180,6 +5193,7 @@
protected KeyguardManager mKeyguardManager;
private LockPatternUtils mLockPatternUtils;
private DeviceProvisionedController mDeviceProvisionedController;
+ protected SystemServicesProxy mSystemServicesProxy;
// UI-specific methods
@@ -6237,7 +6251,10 @@
StatusBarNotification sbn, ExpandableNotificationRow row) {
row.setNeedsRedaction(needsRedaction(entry));
boolean isLowPriority = mNotificationData.isAmbient(sbn.getKey());
+ boolean isUpdate = mNotificationData.get(entry.key) != null;
+ boolean wasLowPriority = row.isLowPriority();
row.setIsLowPriority(isLowPriority);
+ row.setLowPriorityStateUpdated(isUpdate && (wasLowPriority != isLowPriority));
// bind the click event to the content area
mNotificationClicker.register(row, sbn);
@@ -6801,6 +6818,7 @@
protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) {
if (!mUseHeadsUp || isDeviceInVrMode()) {
+ if (DEBUG) Log.d(TAG, "No peeking: no huns or vr mode");
return false;
}
@@ -6809,8 +6827,7 @@
return false;
}
- boolean inUse = mPowerManager.isScreenOn()
- && !SystemServicesProxy.getInstance(mContext).isDreaming();
+ boolean inUse = mPowerManager.isScreenOn() && !mSystemServicesProxy.isDreaming();
if (!inUse && !isDozing()) {
if (DEBUG) {
@@ -6853,6 +6870,12 @@
}
}
+ // Don't peek notifications that are suppressed due to group alert behavior
+ if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) {
+ if (DEBUG) Log.d(TAG, "No peeking: suppressed due to group alert behavior");
+ return false;
+ }
+
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 2a69c1e..bb302bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -29,6 +29,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.keyguard.LatencyTracker;
@@ -97,12 +98,26 @@
private boolean mDeviceWillWakeUp;
private boolean mDeferScrimFadeOut;
+ private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onEmergencyCallAction() {
+
+ // Since we won't get a setOccluded call we have to reset the view manually such that
+ // the bouncer goes away.
+ if (mOccluded) {
+ reset(false /* hideBouncerWhenShowing */);
+ }
+ }
+ };
+
public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils) {
mContext = context;
mViewMediatorCallback = callback;
mLockPatternUtils = lockPatternUtils;
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
+ KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback);
}
public void registerStatusBar(StatusBar statusBar,
@@ -381,6 +396,7 @@
} else {
mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
mStatusBar.finishKeyguardFadingAway();
+ mFingerprintUnlockController.finishKeyguardFadingAway();
}
}
mStatusBarWindowManager.setKeyguardShowing(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 26e007c..f050be4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -407,8 +407,9 @@
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
+ mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
final FloatingActionMode mode =
- new FloatingActionMode(mContext, callback, originatingView);
+ new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -423,8 +424,6 @@
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
- mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
- ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
index eaf8925..78e0028 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
@@ -14,9 +14,6 @@
package com.android.systemui.statusbar.policy;
-import com.android.systemui.Dependency;
-import com.android.systemui.plugins.Plugin;
-
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -32,6 +29,11 @@
interface Extension<T> {
T get();
void destroy();
+ /**
+ * Triggers the extension to cycle through each of the sources again because something
+ * (like configuration) may have changed.
+ */
+ T reload();
}
interface ExtensionBuilder<T> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
index fefbaa3..cfc1d56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -126,6 +126,12 @@
}
}
+ @Override
+ public T reload() {
+ notifyChanged();
+ return get();
+ }
+
private void notifyChanged() {
for (int i = 0; i < mProducers.size(); i++) {
final T item = mProducers.get(i).get();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
index 8e51ddb..cc7943b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
@@ -194,6 +194,11 @@
return true;
}
+ @Override
+ public boolean hasFocusStateSpecified() {
+ return true;
+ }
+
public void setPressed(boolean pressed) {
if (mDark != mLastDark && pressed) {
mRipplePaint = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 67b5596..03a50a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -253,11 +253,6 @@
}
@Override
- public int getQsCurrentIconId() {
- return getCurrentIconId();
- }
-
- @Override
public void notifyListeners(SignalCallback callback) {
MobileIconGroup icons = getIcons();
@@ -276,9 +271,9 @@
String description = null;
// Only send data sim callbacks to QS.
if (mCurrentState.dataSim) {
- qsTypeIcon = showDataIcon ? icons.mQsDataType : 0;
+ qsTypeIcon = showDataIcon ? icons.mDataType : 0;
qsIcon = new IconState(mCurrentState.enabled
- && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription);
+ && !mCurrentState.isEmergency, getCurrentIconId(), contentDescription);
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
boolean activityIn = mCurrentState.dataConnected
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index aaa0568..d91ae39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -22,16 +22,6 @@
class TelephonyIcons {
//***** Data connection icons
- static final int QS_DATA_G = R.drawable.ic_qs_signal_g;
- static final int QS_DATA_3G = R.drawable.ic_qs_signal_3g;
- static final int QS_DATA_E = R.drawable.ic_qs_signal_e;
- static final int QS_DATA_H = R.drawable.ic_qs_signal_h;
- static final int QS_DATA_1X = R.drawable.ic_qs_signal_1x;
- static final int QS_DATA_4G = R.drawable.ic_qs_signal_4g;
- static final int QS_DATA_4G_PLUS = R.drawable.ic_qs_signal_4g_plus;
- static final int QS_DATA_LTE = R.drawable.ic_qs_signal_lte;
- static final int QS_DATA_LTE_PLUS = R.drawable.ic_qs_signal_lte_plus;
-
static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_airplane_mode;
static final int ICON_LTE = R.drawable.stat_sys_data_fully_connected_lte;
@@ -46,8 +36,6 @@
static final int ICON_DATA_DISABLED = R.drawable.stat_sys_data_disabled;
- static final int QS_ICON_DATA_DISABLED = R.drawable.ic_qs_data_disabled;
-
static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
"CARRIER_NETWORK_CHANGE",
null,
@@ -75,7 +63,7 @@
R.string.accessibility_data_connection_3g,
TelephonyIcons.ICON_3G,
true,
- TelephonyIcons.QS_DATA_3G
+ TelephonyIcons.ICON_3G
);
static final MobileIconGroup WFC = new MobileIconGroup(
@@ -114,7 +102,7 @@
R.string.accessibility_data_connection_edge,
TelephonyIcons.ICON_E,
false,
- TelephonyIcons.QS_DATA_E
+ TelephonyIcons.ICON_E
);
static final MobileIconGroup ONE_X = new MobileIconGroup(
@@ -129,7 +117,7 @@
R.string.accessibility_data_connection_cdma,
TelephonyIcons.ICON_1X,
true,
- TelephonyIcons.QS_DATA_1X
+ TelephonyIcons.ICON_1X
);
static final MobileIconGroup G = new MobileIconGroup(
@@ -144,7 +132,7 @@
R.string.accessibility_data_connection_gprs,
TelephonyIcons.ICON_G,
false,
- TelephonyIcons.QS_DATA_G
+ TelephonyIcons.ICON_G
);
static final MobileIconGroup H = new MobileIconGroup(
@@ -159,7 +147,7 @@
R.string.accessibility_data_connection_3_5g,
TelephonyIcons.ICON_H,
false,
- TelephonyIcons.QS_DATA_H
+ TelephonyIcons.ICON_H
);
static final MobileIconGroup FOUR_G = new MobileIconGroup(
@@ -174,7 +162,7 @@
R.string.accessibility_data_connection_4g,
TelephonyIcons.ICON_4G,
true,
- TelephonyIcons.QS_DATA_4G
+ TelephonyIcons.ICON_4G
);
static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup(
@@ -189,7 +177,7 @@
R.string.accessibility_data_connection_4g_plus,
TelephonyIcons.ICON_4G_PLUS,
true,
- TelephonyIcons.QS_DATA_4G_PLUS
+ TelephonyIcons.ICON_4G_PLUS
);
static final MobileIconGroup LTE = new MobileIconGroup(
@@ -204,7 +192,7 @@
R.string.accessibility_data_connection_lte,
TelephonyIcons.ICON_LTE,
true,
- TelephonyIcons.QS_DATA_LTE
+ TelephonyIcons.ICON_LTE
);
static final MobileIconGroup LTE_PLUS = new MobileIconGroup(
@@ -219,7 +207,7 @@
R.string.accessibility_data_connection_lte_plus,
TelephonyIcons.ICON_LTE_PLUS,
true,
- TelephonyIcons.QS_DATA_LTE_PLUS
+ TelephonyIcons.ICON_LTE_PLUS
);
static final MobileIconGroup DATA_DISABLED = new MobileIconGroup(
@@ -234,7 +222,7 @@
R.string.accessibility_cell_data_off,
TelephonyIcons.ICON_DATA_DISABLED,
false,
- TelephonyIcons.QS_ICON_DATA_DISABLED
+ TelephonyIcons.ICON_DATA_DISABLED
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index e1acc9b..e0f4429 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -18,6 +18,7 @@
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import android.R.attr;
import android.app.ActivityManager;
import android.app.Dialog;
import android.app.Notification;
@@ -31,6 +32,7 @@
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
@@ -52,6 +54,7 @@
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.util.UserIcons;
import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.GuestResumeSessionReceiver;
import com.android.systemui.R;
@@ -739,7 +742,12 @@
if (item.isAddUser) {
return context.getDrawable(R.drawable.ic_add_circle_qs);
}
- return UserIcons.getDefaultUserIcon(item.resolveId(), /* light= */ true);
+ Drawable icon = UserIcons.getDefaultUserIcon(item.resolveId(), /* light= */ false);
+ if (item.isGuest) {
+ icon.setColorFilter(Utils.getColorAttr(context, android.R.attr.colorForeground),
+ Mode.SRC_IN);
+ }
+ return icon;
}
public void refresh() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index e80d3b3..0fd2445 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -36,11 +36,13 @@
import android.service.notification.IConditionListener;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ZenRule;
+import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.util.Slog;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.settings.CurrentUserTracker;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -169,45 +171,32 @@
}
private void fireNextAlarmChanged() {
- for (Callback cb : mCallbacks) {
- cb.onNextAlarmChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onNextAlarmChanged());
}
private void fireEffectsSuppressorChanged() {
- for (Callback cb : mCallbacks) {
- cb.onEffectsSupressorChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onEffectsSupressorChanged());
}
private void fireZenChanged(int zen) {
- for (Callback cb : mCallbacks) {
- cb.onZenChanged(zen);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenChanged(zen));
}
private void fireZenAvailableChanged(boolean available) {
- for (Callback cb : mCallbacks) {
- cb.onZenAvailableChanged(available);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenAvailableChanged(available));
}
private void fireConditionsChanged(Condition[] conditions) {
- for (Callback cb : mCallbacks) {
- cb.onConditionsChanged(conditions);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onConditionsChanged(conditions));
}
private void fireManualRuleChanged(ZenRule rule) {
- for (Callback cb : mCallbacks) {
- cb.onManualRuleChanged(rule);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onManualRuleChanged(rule));
}
- private void fireConfigChanged(ZenModeConfig config) {
- for (Callback cb : mCallbacks) {
- cb.onConfigChanged(config);
- }
+ @VisibleForTesting
+ protected void fireConfigChanged(ZenModeConfig config) {
+ Utils.safeForeach(mCallbacks, c -> c.onConfigChanged(config));
}
private void updateConditions(Condition[] conditions) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index cb1f44e..0dbd1d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -29,6 +29,7 @@
import android.widget.RemoteViews;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.ExpandableNotificationRow;
@@ -535,8 +536,8 @@
firstOverflowIndex = getMaxAllowedVisibleChildren(true /* likeCollapsed */);
}
- boolean childrenExpanded = !mContainingNotification.isGroupExpansionChanging()
- && mChildrenExpanded;
+ boolean childrenExpandedAndNotAnimating = mChildrenExpanded
+ && !mContainingNotification.isGroupExpansionChanging();
for (int i = 0; i < childCount; i++) {
ExpandableNotificationRow child = mChildren.get(i);
if (!firstChild) {
@@ -544,7 +545,7 @@
yPosition += NotificationUtils.interpolate(mChildPadding, mDividerHeight,
expandFactor);
} else {
- yPosition += childrenExpanded ? mDividerHeight : mChildPadding;
+ yPosition += mChildrenExpanded ? mDividerHeight : mChildPadding;
}
} else {
if (expandingToExpandedGroup) {
@@ -553,7 +554,7 @@
mNotificatonTopPadding + mDividerHeight,
expandFactor);
} else {
- yPosition += childrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0;
+ yPosition += mChildrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0;
}
firstChild = false;
}
@@ -565,7 +566,7 @@
childState.hidden = false;
// When the group is expanded, the children cast the shadows rather than the parent
// so use the parent's elevation here.
- childState.zTranslation = childrenExpanded
+ childState.zTranslation = childrenExpandedAndNotAnimating
? mContainingNotification.getTranslationZ()
: 0;
childState.dimmed = parentState.dimmed;
@@ -619,7 +620,7 @@
mHeaderViewState = new ViewState();
}
mHeaderViewState.initFrom(mNotificationHeader);
- mHeaderViewState.zTranslation = childrenExpanded
+ mHeaderViewState.zTranslation = childrenExpandedAndNotAnimating
? mContainingNotification.getTranslationZ()
: 0;
}
@@ -1223,4 +1224,9 @@
}
return getGroupExpandFraction();
}
+
+ @VisibleForTesting
+ public boolean isUserLocked() {
+ return mUserLocked;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 61fed2d..431f646 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -120,7 +120,7 @@
private boolean mSwipingInProgress;
private int mCurrentStackHeight = Integer.MAX_VALUE;
private final Paint mBackgroundPaint = new Paint();
- private boolean mShouldDrawNotificationBackground;
+ private final boolean mShouldDrawNotificationBackground;
private float mExpandedHeight;
private int mOwnScrollY;
@@ -451,7 +451,8 @@
}
protected void onDraw(Canvas canvas) {
- if (mShouldDrawNotificationBackground && mCurrentBounds.top < mCurrentBounds.bottom) {
+ if (mShouldDrawNotificationBackground && !mAmbientState.isDark()
+ && mCurrentBounds.top < mCurrentBounds.bottom) {
canvas.drawRect(0, mCurrentBounds.top, getWidth(), mCurrentBounds.bottom,
mBackgroundPaint);
}
@@ -3688,11 +3689,8 @@
* {@link #mAmbientState}'s dark mode is toggled.
*/
private void updateWillNotDraw() {
- if (mAmbientState.isDark()) {
- setWillNotDraw(!DEBUG);
- } else {
- setWillNotDraw(!mShouldDrawNotificationBackground && !DEBUG);
- }
+ boolean willDraw = !mAmbientState.isDark() && mShouldDrawNotificationBackground || DEBUG;
+ setWillNotDraw(!willDraw);
}
private void setBackgroundFadeAmount(float fadeAmount) {
@@ -4355,6 +4353,10 @@
mStatusBar.setNotificationSnoozed(sbn, snoozeOption);
}
+ public boolean isFalseGesture(MotionEvent ev) {
+ return super.isFalseGesture(ev);
+ }
+
private void handleMenuCoveredOrDismissed() {
if (mMenuExposedView != null && mMenuExposedView == mTranslatingParentView) {
mMenuExposedView = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index b5db78d..12a8783 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -410,7 +410,7 @@
if (mIsExpanded) {
// Ensure that the heads up is always visible even when scrolled off
clampHunToTop(ambientState, row, childState);
- if (i == 0) {
+ if (i == 0 && row.isAboveShelf()) {
// the first hun can't get off screen.
clampHunToMaxTranslation(ambientState, row, childState);
}
@@ -447,10 +447,14 @@
private void clampHunToMaxTranslation(AmbientState ambientState, ExpandableNotificationRow row,
ExpandableViewState childState) {
float newTranslation;
- float bottomPosition = ambientState.getMaxHeadsUpTranslation() - row.getCollapsedHeight();
+ float maxHeadsUpTranslation = ambientState.getMaxHeadsUpTranslation();
+ float maxShelfPosition = ambientState.getInnerHeight() + ambientState.getTopPadding()
+ + ambientState.getStackTranslation();
+ maxHeadsUpTranslation = Math.min(maxHeadsUpTranslation, maxShelfPosition);
+ float bottomPosition = maxHeadsUpTranslation - row.getCollapsedHeight();
newTranslation = Math.min(childState.yTranslation, bottomPosition);
- childState.height = (int) Math.max(childState.height
- - (childState.yTranslation - newTranslation), row.getCollapsedHeight());
+ childState.height = (int) Math.min(childState.height, maxHeadsUpTranslation
+ - newTranslation);
childState.yTranslation = newTranslation;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
index d664b12..27b730cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
@@ -657,6 +657,22 @@
}
}
+ /**
+ * Get the end value of the zTranslation animation running on a view or the zTranslation
+ * if no animation is running.
+ */
+ public static float getFinalTranslationZ(View view) {
+ if (view == null) {
+ return 0;
+ }
+ ValueAnimator zAnimator = getChildTag(view, TAG_ANIMATOR_TRANSLATION_Z);
+ if (zAnimator == null) {
+ return view.getTranslationZ();
+ } else {
+ return getChildTag(view, TAG_END_TRANSLATION_Z);
+ }
+ }
+
public static boolean isAnimatingY(View child) {
return getChildTag(child, TAG_ANIMATOR_TRANSLATION_Y) != null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
new file mode 100644
index 0000000..f4aebae
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 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.systemui.util;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+public class Utils {
+
+ /**
+ * Allows lambda iteration over a list. It is done in reverse order so it is safe
+ * to add or remove items during the iteration.
+ */
+ public static <T> void safeForeach(List<T> list, Consumer<T> c) {
+ for (int i = list.size() - 1; i >= 0; i--) {
+ c.accept(list.get(i));
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index 2f9bcff..e86a34a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -18,26 +18,25 @@
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.VolumePolicy;
import android.os.Bundle;
import android.os.Handler;
-import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
+import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.Dependency;
import com.android.systemui.SystemUI;
import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.PluginDependency;
import com.android.systemui.plugins.PluginDependencyProvider;
-import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.statusbar.policy.ExtensionController;
-import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
import com.android.systemui.tuner.TunerService;
import java.io.FileDescriptor;
@@ -60,6 +59,9 @@
private final SystemUI mSysui;
private final Context mContext;
private final VolumeDialogControllerImpl mController;
+ private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
+ ActivityInfo.CONFIG_FONT_SCALE);
+ private final Extension mExtension;
private VolumeDialog mDialog;
private VolumePolicy mVolumePolicy = new VolumePolicy(
DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT, // volumeDownToEnterSilent
@@ -76,7 +78,7 @@
// Allow plugins to reference the VolumeDialogController.
Dependency.get(PluginDependencyProvider.class)
.allowPluginDependency(VolumeDialogController.class);
- Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
+ mExtension = Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
.withPlugin(VolumeDialog.class)
.withDefault(this::createDefault)
.withCallback(dialog -> {
@@ -148,7 +150,9 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
- // noop
+ if (mConfigChanges.applyNewConfig(mContext.getResources())) {
+ mExtension.reload();
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 51fcdbb..ecdea4f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -57,7 +57,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.R.string;
import com.android.systemui.statusbar.policy.ZenModeController;
import java.io.FileDescriptor;
@@ -294,11 +293,6 @@
private void onAttach() {
setExpanded(true);
mAttached = true;
- for (int i = 0; i < mZenRadioGroupContent.getChildCount(); i++) {
- ConditionTag tag = getConditionTagAt(i);
- if (tag != null) tag.rb.setChecked(false);
- mZenRadioGroupContent.getChildAt(i).setTag(null);
- }
mAttachedZen = mController.getZen();
ZenRule manualRule = mController.getManualRule();
mExitCondition = manualRule != null ? manualRule.condition : null;
@@ -311,6 +305,7 @@
setSessionExitCondition(copy(mExitCondition));
updateWidgets();
setRequestingConditions(!mHidden);
+ ensureSelection();
}
private void onDetach() {
@@ -366,9 +361,6 @@
if (expanded == mExpanded) return;
if (DEBUG) Log.d(mTag, "setExpanded " + expanded);
mExpanded = expanded;
- if (mExpanded) {
- ensureSelection();
- }
updateWidgets();
fireExpanded();
}
@@ -464,7 +456,8 @@
ActivityManager.getCurrentUser(), false);
return c;
}
- return null;
+ // If there is a manual rule, but it has no condition listed then it is forever.
+ return forever();
}
private void handleUpdateZen(int zen) {
@@ -491,6 +484,7 @@
final ConditionTag tag = getConditionTagAt(i);
if (tag != null && sameConditionId(tag.condition, mExitCondition)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
+ tag.rb.setChecked(true);
return;
}
}
@@ -498,6 +492,7 @@
exitCondition.id)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
COUNTDOWN_CONDITION_INDEX);
+ getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
new file mode 100644
index 0000000..b597868
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2017 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;
+
+import static org.junit.Assert.assertFalse;
+
+import android.support.test.filters.LargeTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.internal.runner.ClassPathScanner;
+import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
+import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
+import android.support.test.internal.runner.TestLoader;
+import android.testing.AndroidTestingRunner;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.systemui.SysuiBaseFragmentTest;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * This is named AAAPlusPlusVerifySysuiRequiredTestPropertiesTest for two reasons.
+ * a) Its so awesome it deserves an AAA++
+ * b) It should run first to draw attention to itself.
+ *
+ * For trues though: this test verifies that all the sysui tests extend the right classes.
+ * This matters because including tests with different context implementations in the same
+ * test suite causes errors, such as the incorrect settings provider being cached.
+ * For an example, see {@link com.android.systemui.DependencyTest}.
+ */
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestCase {
+
+ private static final String TAG = "AAA++VerifyTest";
+
+ private static final Class[] BASE_CLS_WHITELIST = {
+ SysuiTestCase.class,
+ SysuiBaseFragmentTest.class,
+ };
+
+ private static final Class[] SUPPORTED_SIZES = {
+ SmallTest.class,
+ MediumTest.class,
+ LargeTest.class,
+ android.test.suitebuilder.annotation.SmallTest.class,
+ android.test.suitebuilder.annotation.MediumTest.class,
+ android.test.suitebuilder.annotation.LargeTest.class,
+ };
+
+ @Test
+ public void testAllClassInheritance() {
+ boolean anyClassWrong = false;
+ TestLoader loader = new TestLoader();
+ for (String className : getClassNamesFromClassPath()) {
+ Class<?> cls = loader.loadIfTest(className);
+ if (cls == null) continue;
+
+ boolean hasParent = false;
+ for (Class<?> parent : BASE_CLS_WHITELIST) {
+ if (parent.isAssignableFrom(cls)) {
+ hasParent = true;
+ break;
+ }
+ }
+ boolean hasSize = hasSize(cls);
+ if (!hasSize) {
+ anyClassWrong = true;
+ Log.e(TAG, cls.getName() + " does not have size annotation, such as @SmallTest");
+ }
+ if (!hasParent) {
+ anyClassWrong = true;
+ Log.e(TAG, cls.getName() + " does not extend any of " + getClsStr());
+ }
+ }
+
+ assertFalse("All sysui test classes must have size and extend one of " + getClsStr(),
+ anyClassWrong);
+ }
+
+ private boolean hasSize(Class<?> cls) {
+ for (int i = 0; i < SUPPORTED_SIZES.length; i++) {
+ if (cls.getDeclaredAnnotation(SUPPORTED_SIZES[i]) != null) return true;
+ }
+ return false;
+ }
+
+ private Collection<String> getClassNamesFromClassPath() {
+ ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
+
+ ChainedClassNameFilter filter = new ChainedClassNameFilter();
+
+ filter.add(new ExternalClassNameFilter());
+ filter.add(s -> s.startsWith("com.android.systemui")
+ || s.startsWith("com.android.keyguard"));
+ try {
+ return scanner.getClassPathEntries(filter);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to scan classes", e);
+ }
+ return Collections.emptyList();
+ }
+
+ private String getClsStr() {
+ return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
+ .stream().map(cls -> cls.getSimpleName()).toArray());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
index 1c9f813..855adb4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -19,26 +19,26 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import java.util.List;
-public class KeyguardClockAccessibilityDelegateTest {
+@SmallTest
+public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase {
- private Context mContext;
private TextView mView;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getContext();
mView = new TextView(mContext);
mView.setText(R.string.keyguard_widget_12_hours_format);
mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
index c297ae8..3426e11 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.verify;
import android.os.Looper;
+import android.support.test.filters.SmallTest;
import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.statusbar.policy.FlashlightController;
@@ -30,6 +31,7 @@
import java.io.PrintWriter;
+@SmallTest
public class DependencyTest extends SysuiTestCase {
public static final DependencyKey<Dumpable> DUMPABLE = new DependencyKey<>("dumpable");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 0aac1c0..9b67529 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -20,6 +20,7 @@
import android.os.Looper;
import android.os.MessageQueue;
import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.testing.LeakCheck;
import android.util.Log;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index d203602..7519b2d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -43,6 +43,7 @@
import android.view.Display;
import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.wakelock.WakeLockFake;
import android.testing.UiThreadTest;
@@ -54,7 +55,7 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
@UiThreadTest
-public class DozeMachineTest {
+public class DozeMachineTest extends SysuiTestCase {
DozeMachine mMachine;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
index ada8ac0..720e9f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -25,13 +25,14 @@
import android.support.test.filters.SmallTest;
import android.view.Display;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import org.junit.Before;
import org.junit.Test;
@SmallTest
-public class DozeScreenStatePreventingAdapterTest {
+public class DozeScreenStatePreventingAdapterTest extends SysuiTestCase {
private DozeMachine.Service mInner;
private DozeScreenStatePreventingAdapter mWrapper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 8934460..97d9080 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -32,6 +32,7 @@
import android.support.test.runner.AndroidJUnit4;
import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -44,8 +45,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class DozeTriggersTest {
- private Context mContext;
+public class DozeTriggersTest extends SysuiTestCase {
private DozeTriggers mTriggers;
private DozeMachine mMachine;
private DozeHostFake mHost;
@@ -65,7 +65,6 @@
@Before
public void setUp() throws Exception {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
- mContext = InstrumentationRegistry.getContext();
mMachine = mock(DozeMachine.class);
mHost = new DozeHostFake();
mConfig = DozeConfigurationUtil.createMockConfig();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
index 0f2878b..5fb0a3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -40,6 +40,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WorkLockActivity;
import com.android.systemui.keyguard.WorkLockActivityController;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -58,7 +59,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WorkLockActivityControllerTest {
+public class WorkLockActivityControllerTest extends SysuiTestCase {
private static final int USER_ID = 333;
private static final int TASK_ID = 444;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
index 9b868db..9f3573f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
@@ -33,6 +33,7 @@
import android.graphics.Color;
import android.os.Looper;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WorkLockActivity;
import org.junit.Before;
@@ -46,7 +47,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WorkLockActivityTest {
+public class WorkLockActivityTest extends SysuiTestCase {
private static final @UserIdInt int USER_ID = 270;
private static final String TASK_LABEL = "task label";
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
index 9849800..0b4d9b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
@@ -17,6 +17,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import android.support.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
import com.android.systemui.plugins.annotations.Requires;
@@ -28,6 +30,7 @@
import org.junit.Test;
import org.junit.rules.ExpectedException;
+@SmallTest
public class VersionInfoTest extends SysuiTestCase {
@Rule
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
index 8609eeb..7cbe985 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -37,12 +38,14 @@
import com.android.systemui.plugins.qs.DetailAdapter;
import org.junit.After;
+import org.junit.Ignore;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSDetailTest extends SysuiTestCase {
private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
index 778ab8e..402b12d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
@@ -20,6 +20,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -33,11 +34,13 @@
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSFooterTest extends LeakCheckedTest {
private QSFooter mFooter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index d81224e..0b7da1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -21,6 +21,7 @@
import android.app.FragmentController;
import android.app.FragmentManagerNonConfig;
import android.os.Looper;
+import android.support.test.filters.FlakyTest;
import com.android.internal.logging.MetricsLogger;
import com.android.keyguard.CarrierText;
@@ -28,6 +29,7 @@
import com.android.systemui.R;
import android.os.Parcelable;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import com.android.systemui.SysuiBaseFragmentTest;
@@ -39,6 +41,7 @@
import android.testing.TestableLooper.RunWithLooper;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -48,6 +51,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class QSFragmentTest extends SysuiBaseFragmentTest {
private MetricsLogger mMockMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 4979684..e5ff866 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -16,9 +16,10 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -29,6 +30,7 @@
import com.android.systemui.qs.customize.QSCustomizer;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -36,6 +38,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSPanelTest extends SysuiTestCase {
private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
index 6e7d99e..0239ab0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
@@ -18,6 +18,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -33,6 +34,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class TileAdapterTest extends SysuiTestCase {
private TileAdapter mTileAdapter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
index 59483f2..f9f4f497 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
@@ -24,6 +24,7 @@
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.service.quicksettings.Tile;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.UiThreadTest;
import android.widget.ImageView;
@@ -39,6 +40,7 @@
@RunWith(AndroidTestingRunner.class)
@UiThreadTest
+@SmallTest
public class QSIconViewImplTest extends SysuiTestCase {
private QSIconViewImpl mIconView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 9ed9d28..0500a54 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -30,6 +30,7 @@
import android.content.Intent;
import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -48,6 +49,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSTileImplTest extends SysuiTestCase {
public static final int POSITION = 14;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
index 9e15a05..17d7a41 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
@@ -17,6 +17,7 @@
package com.android.systemui.settings;
import android.content.Intent;
+import android.support.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
@@ -26,6 +27,7 @@
/**
* Testing functionality of the current user tracker
*/
+@SmallTest
public class CurrentUserTrackerTest extends SysuiTestCase {
private CurrentUserTracker mTracker;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index c13d13b..8cacb4b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -22,6 +22,7 @@
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
+import android.support.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.SysuiTestCase;
@@ -31,6 +32,7 @@
import org.junit.Before;
import org.junit.Test;
+@SmallTest
public class CommandQueueTest extends SysuiTestCase {
private CommandQueue mCommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 5cd092b..1161987 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -16,31 +16,36 @@
package com.android.systemui.statusbar;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class ExpandableNotificationRowTest {
+public class ExpandableNotificationRowTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mGroup;
private NotificationTestHelper mNotificationTestHelper;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
}
@@ -62,4 +67,25 @@
== View.VISIBLE);
}
+ @Test
+ public void testUserLockedResetEvenWhenNoChildren() {
+ mGroup.setUserLocked(true);
+ mGroup.removeAllChildren();
+ mGroup.setUserLocked(false);
+ Assert.assertFalse("The childrencontainer should not be userlocked but is, the state "
+ + "seems out of sync.", mGroup.getChildrenContainer().isUserLocked());
+ }
+
+ @Test
+ public void testReinflatedOnDensityChange() {
+ mGroup.setUserLocked(true);
+ mGroup.removeAllChildren();
+ mGroup.setUserLocked(false);
+ NotificationChildrenContainer mockContainer = mock(NotificationChildrenContainer.class);
+ mGroup.setChildrenContainer(mockContainer);
+ mGroup.onDensityOrFontScaleChanged();
+ verify(mockContainer).reInflateViews(any(), any());
+ }
+
+
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
index 77f96b8..8dcc408 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
@@ -19,12 +19,14 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,17 +35,17 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import com.android.systemui.SysuiTestCase;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationContentViewTest {
+public class NotificationContentViewTest extends SysuiTestCase {
NotificationContentView mView;
- Context mContext;
@Before
@UiThreadTest
public void setup() {
- mContext = InstrumentationRegistry.getTargetContext();
mView = new NotificationContentView(mContext, null);
ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null);
ExpandableNotificationRow mockRow = spy(row);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
index f016aa1..fc9b608 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
@@ -19,31 +19,32 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.widget.RemoteViews;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.NotificationCustomViewWrapper;
import com.android.systemui.statusbar.notification.NotificationViewWrapper;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationCustomViewWrapperTest {
+public class NotificationCustomViewWrapperTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mRow;
@Before
@UiThreadTest
public void setUp() {
- mContext = InstrumentationRegistry.getTargetContext();
mRow = new ExpandableNotificationRow(mContext, null);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index c7d5e68..6380847 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar;
+import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
@@ -74,6 +76,7 @@
@UiThreadTest
public class NotificationInfoTest extends SysuiTestCase {
private static final String TEST_PACKAGE_NAME = "test_package";
+ private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME;
private static final int TEST_UID = 1;
private static final String TEST_CHANNEL = "test_channel";
private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME";
@@ -95,11 +98,18 @@
// PackageManager must return a packageInfo and applicationInfo.
final PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = TEST_PACKAGE_NAME;
- when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
+ when(mMockPackageManager.getPackageInfo(eq(TEST_PACKAGE_NAME), anyInt()))
+ .thenReturn(packageInfo);
final ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = TEST_UID; // non-zero
when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
applicationInfo);
+ final PackageInfo systemPackageInfo = new PackageInfo();
+ systemPackageInfo.packageName = TEST_SYSTEM_PACKAGE_NAME;
+ when(mMockPackageManager.getPackageInfo(eq(TEST_SYSTEM_PACKAGE_NAME), anyInt()))
+ .thenReturn(systemPackageInfo);
+ when(mMockPackageManager.getPackageInfo(eq("android"), anyInt()))
+ .thenReturn(packageInfo);
// Package has one channel by default.
when(mMockINotificationManager.getNumNotificationChannelsForPackage(
@@ -605,6 +615,45 @@
}
@Test
+ public void testEnabledSwitchInvisibleIfNonBlockableSystemChannel() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(false);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, null);
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
+ public void testEnabledSwitchVisibleIfBlockableSystemChannel() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(true);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, null);
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.VISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
+ public void testEnabledSwitchInvisibleIfMultiChannelSummary() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(true);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, Arrays.asList(mNotificationChannel, mDefaultNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, Collections.singleton(TEST_PACKAGE_NAME));
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
public void testNonBlockableAppDoesNotBecomeBlocked() throws Exception {
mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
index 9249df6..e0d8042 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
@@ -16,6 +16,7 @@
import static junit.framework.Assert.assertTrue;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -30,6 +31,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class NotificationMenuRowTest extends LeakCheckedTest {
@Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
index 0c5bdea..ee8db88 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
@@ -27,17 +27,21 @@
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.widget.RemoteViews;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.InflationTask;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -45,16 +49,14 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationInflaterTest {
+public class NotificationInflaterTest extends SysuiTestCase {
- private Context mContext;
private NotificationInflater mNotificationInflater;
private Notification.Builder mBuilder;
private ExpandableNotificationRow mRow;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mBuilder = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setContentTitle("Title")
@@ -129,7 +131,29 @@
mRow.getEntry().abortTask();
runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
mNotificationInflater);
- Assert.assertNull(mRow.getEntry().getRunningTask() );
+ verify(mRow).onNotificationUpdated();
+ }
+
+ @Test
+ public void testRemovedNotInflated() throws Exception {
+ mRow.setRemoved();
+ mNotificationInflater.inflateNotificationViews();
+ Assert.assertNull(mRow.getEntry().getRunningTask());
+ }
+
+
+ @Test
+ public void testSupersedesExistingTask() throws Exception {
+ mNotificationInflater.inflateNotificationViews();
+ mNotificationInflater.setIsLowPriority(true);
+ mNotificationInflater.setIsChildInGroup(true);
+ InflationTask runningTask = mRow.getEntry().getRunningTask();
+ NotificationInflater.AsyncInflationTask asyncInflationTask =
+ (NotificationInflater.AsyncInflationTask) runningTask;
+ Assert.assertSame("Successive inflations don't inherit the previous flags!",
+ asyncInflationTask.getReInflateFlags(),
+ NotificationInflater.FLAG_REINFLATE_ALL);
+ runningTask.abort();
}
public static void runThenWaitForInflation(Runnable block,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
index 7a72afd..ebeb24c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
@@ -18,9 +18,11 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import org.junit.Before;
@@ -28,14 +30,8 @@
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
-public class NotificationViewWrapperTest {
-
- private Context mContext;
-
- @Before
- public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
- }
+@SmallTest
+public class NotificationViewWrapperTest extends SysuiTestCase {
@Test
public void constructor_doesntUseViewContext() throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index e4c43735..95ce0d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -20,6 +20,7 @@
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
@@ -37,7 +38,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class VisualStabilityManagerTest {
+public class VisualStabilityManagerTest extends SysuiTestCase {
private VisualStabilityManager mVisualStabilityManager = new VisualStabilityManager();
private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index e41a827..0937ce2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -22,6 +22,8 @@
import com.android.internal.app.NightDisplayController;
import com.android.systemui.Prefs;
import com.android.systemui.Prefs.Key;
+
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.QSTileHost;
@@ -33,6 +35,7 @@
import org.mockito.Mockito;
@RunWith(AndroidTestingRunner.class)
+@SmallTest
public class AutoTileManagerTest extends SysuiTestCase {
private QSTileHost mQsTileHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 6ddbffc..66524cc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.when;
import android.app.StatusBarManager;
+import android.support.test.filters.SmallTest;
import android.view.View;
import android.view.ViewPropertyAnimator;
@@ -39,6 +40,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
private NotificationIconAreaController mMockNotificiationAreaController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index ee10440..e89ff97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -18,6 +18,8 @@
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -28,7 +30,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class DozeParametersTest {
+public class DozeParametersTest extends SysuiTestCase {
@Test
public void test_inOutMatcher_defaultIn() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 53d842a..a120cec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.os.Looper;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.LeakCheck.Tracker;
import android.view.Display;
@@ -46,6 +47,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
public NavigationBarFragmentTest() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index ecae39a..5db7792 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -18,6 +18,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
@@ -36,6 +37,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class StatusBarIconControllerTest extends LeakCheckedTest {
@Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index bf6b394..55ec307 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -16,13 +16,27 @@
package com.android.systemui.statusbar.phone;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.app.Notification;
import android.metrics.LogMaker;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IPowerManager;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
import android.support.test.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts;
import android.support.test.runner.AndroidJUnit4;
@@ -33,9 +47,11 @@
import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before;
@@ -52,19 +68,34 @@
NotificationStackScrollLayout mStackScroller;
StatusBar mStatusBar;
FakeMetricsLogger mMetricsLogger;
+ HeadsUpManager mHeadsUpManager;
+ NotificationData mNotificationData;
+ PowerManager mPowerManager;
+ SystemServicesProxy mSystemServicesProxy;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@Before
- public void setup() {
+ public void setup() throws Exception {
mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
mUnlockMethodCache = mock(UnlockMethodCache.class);
mKeyguardIndicationController = mock(KeyguardIndicationController.class);
mStackScroller = mock(NotificationStackScrollLayout.class);
mMetricsLogger = new FakeMetricsLogger();
+ mHeadsUpManager = mock(HeadsUpManager.class);
+ mNotificationData = mock(NotificationData.class);
+ mSystemServicesProxy = mock(SystemServicesProxy.class);
+ IPowerManager powerManagerService = mock(IPowerManager.class);
+ HandlerThread handlerThread = new HandlerThread("TestThread");
+ handlerThread.start();
+ mPowerManager = new PowerManager(mContext, powerManagerService,
+ new Handler(handlerThread.getLooper()));
+ when(powerManagerService.isInteractive()).thenReturn(true);
+
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
- mKeyguardIndicationController, mStackScroller);
+ mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
+ mNotificationData, mPowerManager, mSystemServicesProxy);
doAnswer(invocation -> {
OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
@@ -210,14 +241,62 @@
.setType(MetricsEvent.TYPE_ACTION));
}
+ @Test
+ public void testShouldPeek_nonSuppressedGroupSummary() {
+ when(mPowerManager.isScreenOn()).thenReturn(true);
+ when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
+ when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
+ when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
+ when(mSystemServicesProxy.isDreaming()).thenReturn(false);
+ when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(getContext(), "a")
+ .setGroup("a")
+ .setGroupSummary(true)
+ .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
+ UserHandle.of(0), null, 0);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn);
+
+ assertTrue(mStatusBar.shouldPeek(entry, sbn));
+ }
+
+ @Test
+ public void testShouldPeek_suppressedGroupSummary() {
+ when(mPowerManager.isScreenOn()).thenReturn(true);
+ when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
+ when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
+ when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
+ when(mSystemServicesProxy.isDreaming()).thenReturn(false);
+ when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(getContext(), "a")
+ .setGroup("a")
+ .setGroupSummary(true)
+ .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
+ UserHandle.of(0), null, 0);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn);
+
+ assertFalse(mStatusBar.shouldPeek(entry, sbn));
+ }
+
static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man,
UnlockMethodCache unlock, KeyguardIndicationController key,
- NotificationStackScrollLayout stack) {
+ NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
+ PowerManager pm, SystemServicesProxy ssp) {
mStatusBarKeyguardViewManager = man;
mUnlockMethodCache = unlock;
mKeyguardIndicationController = key;
mStackScroller = stack;
+ mHeadsUpManager = hum;
+ mNotificationData = nd;
+ mUseHeadsUp = true;
+ mPowerManager = pm;
+ mSystemServicesProxy = ssp;
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index f516d74..2eb9560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -20,6 +20,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class BluetoothControllerImplTest extends SysuiTestCase {
private LocalBluetoothManager mMockBluetoothManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index 3ed1681..6157d44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -20,6 +20,7 @@
import android.telephony.SubscriptionInfo;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
@@ -40,7 +41,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class CallbackHandlerTest {
+public class CallbackHandlerTest extends SysuiTestCase {
private CallbackHandler mHandler;
private HandlerThread mHandlerThread;
@@ -110,7 +111,7 @@
String typeDescription = "Test 1";
String description = "Test 2";
int type = R.drawable.stat_sys_data_fully_connected_1x;
- int qsType = R.drawable.ic_qs_signal_1x;
+ int qsType = type;
boolean wide = true;
int subId = 5;
boolean roaming = true;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
index 3e79a04..3d79d5b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
@@ -20,6 +20,8 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.OverlayPlugin;
@@ -34,6 +36,7 @@
import java.util.Map;
import java.util.function.Consumer;
+@SmallTest
public class ExtensionControllerTest extends SysuiTestCase {
private PluginManager mPluginManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
index 21fddf2..f859235 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.argThat;
import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class KeyButtonViewTest extends SysuiTestCase {
private KeyButtonView mKeyButtonView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 505e1d8..c233fea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -70,7 +70,7 @@
protected static final int DEFAULT_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G;
- protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_DATA_3G;
+ protected static final int DEFAULT_QS_ICON = DEFAULT_ICON;
protected NetworkControllerImpl mNetworkController;
protected MobileSignalController mMobileSignalController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index dfe00f9..ac64263 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -25,7 +25,7 @@
setupDefaultSignal();
verifyDataIndicators(TelephonyIcons.ICON_3G,
- TelephonyIcons.QS_DATA_3G);
+ TelephonyIcons.ICON_3G);
}
@Test
@@ -35,7 +35,7 @@
TelephonyManager.NETWORK_TYPE_GSM);
verifyDataIndicators(TelephonyIcons.ICON_G,
- TelephonyIcons.QS_DATA_G);
+ TelephonyIcons.ICON_G);
}
@Test
@@ -45,7 +45,7 @@
TelephonyManager.NETWORK_TYPE_CDMA);
verifyDataIndicators(TelephonyIcons.ICON_1X,
- TelephonyIcons.QS_DATA_1X);
+ TelephonyIcons.ICON_1X);
}
@Test
@@ -55,7 +55,7 @@
TelephonyManager.NETWORK_TYPE_EDGE);
verifyDataIndicators(TelephonyIcons.ICON_E,
- TelephonyIcons.QS_DATA_E);
+ TelephonyIcons.ICON_E);
}
@Test
@@ -65,7 +65,7 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_LTE,
- TelephonyIcons.QS_DATA_LTE);
+ TelephonyIcons.ICON_LTE);
}
@Test
@@ -75,7 +75,7 @@
TelephonyManager.NETWORK_TYPE_HSPA);
verifyDataIndicators(TelephonyIcons.ICON_H,
- TelephonyIcons.QS_DATA_H);
+ TelephonyIcons.ICON_H);
}
@Test
@@ -104,7 +104,7 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_4G,
- TelephonyIcons.QS_DATA_4G);
+ TelephonyIcons.ICON_4G);
}
@Ignore("Flaky")
@@ -117,7 +117,7 @@
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
verifyDataIndicators(TelephonyIcons.ICON_DATA_DISABLED,
- TelephonyIcons.QS_ICON_DATA_DISABLED);
+ TelephonyIcons.ICON_DATA_DISABLED);
}
@Test
@@ -148,7 +148,7 @@
mNetworkController.handleConfigurationChanged();
verifyDataIndicators(TelephonyIcons.ICON_4G,
- TelephonyIcons.QS_DATA_4G);
+ TelephonyIcons.ICON_4G);
}
@Test
@@ -158,13 +158,13 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_LTE,
- TelephonyIcons.QS_DATA_LTE);
+ TelephonyIcons.ICON_LTE);
when(mServiceState.getDataNetworkType())
.thenReturn(TelephonyManager.NETWORK_TYPE_HSPA);
updateServiceState();
verifyDataIndicators(TelephonyIcons.ICON_H,
- TelephonyIcons.QS_DATA_H);
+ TelephonyIcons.ICON_H);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 1627925..aa62075 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -214,7 +214,7 @@
verifyLastQsMobileDataIndicators(true,
testStrength,
- TelephonyIcons.QS_DATA_1X, false, false);
+ TelephonyIcons.ICON_1X, false, false);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
new file mode 100644
index 0000000..8124bf3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar.policy;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.os.Handler;
+import android.service.notification.ZenModeConfig;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.ZenModeController.Callback;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class ZenModeControllerImplTest extends SysuiTestCase {
+
+ private Callback mCallback;
+
+ @Test
+ public void testRemoveDuringCallback() {
+ ZenModeControllerImpl controller = new ZenModeControllerImpl(mContext, new Handler());
+ mCallback = new Callback() {
+ @Override
+ public void onConfigChanged(ZenModeConfig config) {
+ controller.removeCallback(mCallback);
+ }
+ };
+ controller.addCallback(mCallback);
+ Callback mockCallback = mock(Callback.class);
+ controller.addCallback(mockCallback);
+ controller.fireConfigChanged(null);
+ verify(mockCallback).onConfigChanged(eq(null));
+ }
+
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index f051f30..e6c8815 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -19,31 +19,32 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.NotificationHeaderView;
import android.view.View;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationTestHelper;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationChildrenContainerTest {
+public class NotificationChildrenContainerTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mGroup;
private int mId;
private NotificationTestHelper mNotificationTestHelper;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
index 9a825c1..a3b258f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
@@ -27,13 +27,15 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class GarbageMonitorTest {
+public class GarbageMonitorTest extends SysuiTestCase {
private LeakReporter mLeakReporter;
private TrackedGarbage mTrackedGarbage;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
index 11722fe..f1965a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
@@ -20,6 +20,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
import org.junit.Before;
@@ -35,7 +36,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class LeakDetectorTest {
+public class LeakDetectorTest extends SysuiTestCase {
private LeakDetector mLeakDetector;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
index 1194849..6711ce8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.verify;
import android.app.NotificationManager;
+import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
@@ -38,6 +39,7 @@
import java.io.PrintWriter;
@RunWith(AndroidJUnit4.class)
+@MediumTest
public class LeakReporterTest extends SysuiTestCase {
private LeakDetector mLeakDetector;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
index 9da67b7..b8a3e39 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
@@ -21,12 +21,14 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class ReferenceTestUtilsTest {
+public class ReferenceTestUtilsTest extends SysuiTestCase {
@Test
public void testCollectionWaiter_doesntBlockIndefinitely() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
index fb1c1aa..9787df9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
@@ -23,6 +23,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
import org.junit.Before;
@@ -31,7 +32,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WeakIdentityHashMapTest {
+public class WeakIdentityHashMapTest extends SysuiTestCase {
WeakIdentityHashMap<Object, Object> mMap;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
index f6692eb..39316ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
@@ -24,13 +24,15 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class SettableWakeLockTest {
+public class SettableWakeLockTest extends SysuiTestCase {
private WakeLockFake mFake;
private SettableWakeLock mSettable;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
index 5394499..9b7c597 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -25,6 +25,8 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -32,7 +34,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WakeLockTest {
+public class WakeLockTest extends SysuiTestCase {
WakeLock mWakeLock;
PowerManager.WakeLock mInner;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
index b9d188a..00846dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
@@ -97,5 +97,10 @@
public void destroy() {
mTracker.getLeakInfo(mAllocation).clearAllocations();
}
+
+ @Override
+ public T reload() {
+ return null;
+ }
}
}
diff --git a/preloaded-classes b/preloaded-classes
index 493e980..9612231 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -33,9 +33,13 @@
[Landroid.animation.Animator;
[Landroid.animation.Keyframe$FloatKeyframe;
[Landroid.animation.Keyframe$IntKeyframe;
-[Landroid.animation.Keyframe$ObjectKeyframe;
[Landroid.animation.PropertyValuesHolder;
[Landroid.app.LoaderManagerImpl;
+[Landroid.app.Notification$Action;
+[Landroid.app.NotificationChannel;
+[Landroid.app.RemoteInput;
+[Landroid.app.job.JobInfo$TriggerContentUri;
+[Landroid.bluetooth.BluetoothDevice;
[Landroid.content.ContentProviderResult;
[Landroid.content.ContentValues;
[Landroid.content.Intent;
@@ -60,6 +64,9 @@
[Landroid.graphics.Bitmap$Config;
[Landroid.graphics.Bitmap;
[Landroid.graphics.Canvas$EdgeType;
+[Landroid.graphics.ColorSpace$Model;
+[Landroid.graphics.ColorSpace$Named;
+[Landroid.graphics.ColorSpace;
[Landroid.graphics.FontFamily;
[Landroid.graphics.Interpolator$Result;
[Landroid.graphics.Matrix$ScaleToFit;
@@ -69,7 +76,9 @@
[Landroid.graphics.Paint$Style;
[Landroid.graphics.Path$Direction;
[Landroid.graphics.Path$FillType;
+[Landroid.graphics.Point;
[Landroid.graphics.PorterDuff$Mode;
+[Landroid.graphics.Rect;
[Landroid.graphics.Region$Op;
[Landroid.graphics.Shader$TileMode;
[Landroid.graphics.Typeface;
@@ -77,6 +86,13 @@
[Landroid.graphics.drawable.GradientDrawable$Orientation;
[Landroid.graphics.drawable.LayerDrawable$ChildDrawable;
[Landroid.graphics.drawable.RippleForeground;
+[Landroid.graphics.fonts.FontVariationAxis;
+[Landroid.hardware.camera2.marshal.MarshalQueryable;
+[Landroid.hardware.camera2.params.Face;
+[Landroid.hardware.camera2.params.HighSpeedVideoConfiguration;
+[Landroid.hardware.camera2.params.MeteringRectangle;
+[Landroid.hardware.camera2.params.StreamConfiguration;
+[Landroid.hardware.camera2.params.StreamConfigurationDuration;
[Landroid.hardware.soundtrigger.SoundTrigger$ConfidenceLevel;
[Landroid.hardware.soundtrigger.SoundTrigger$Keyphrase;
[Landroid.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra;
@@ -89,8 +105,6 @@
[Landroid.icu.impl.Trie2$ValueWidth;
[Landroid.icu.impl.UCharacterProperty$BinaryProperty;
[Landroid.icu.impl.UCharacterProperty$IntProperty;
-[Landroid.icu.text.DateFormatSymbols$CalendarDataSink$AliasType;
-[Landroid.icu.text.DateFormatSymbols$CapitalizationContextUsage;
[Landroid.icu.text.DisplayContext$Type;
[Landroid.icu.text.DisplayContext;
[Landroid.icu.text.PluralRules$Operand;
@@ -98,29 +112,37 @@
[Landroid.icu.text.PluralRules$SampleType;
[Landroid.icu.text.TimeZoneNames$NameType;
[Landroid.icu.text.UnicodeSet;
-[Landroid.icu.util.BytesTrie$Result;
[Landroid.icu.util.Currency$CurrencyUsage;
[Landroid.icu.util.ULocale$Category;
[Landroid.icu.util.ULocale;
[Landroid.icu.util.UResourceBundle$RootType;
[Landroid.media.AudioGain;
-[Landroid.media.MediaCodecInfo$CodecProfileLevel;
-[Landroid.net.Network;
+[Landroid.net.IpConfiguration$IpAssignment;
+[Landroid.net.IpConfiguration$ProxySettings;
+[Landroid.net.LocalSocketAddress$Namespace;
[Landroid.net.NetworkInfo$DetailedState;
[Landroid.net.NetworkInfo$State;
+[Landroid.net.NetworkKey;
[Landroid.net.NetworkRequest$Type;
+[Landroid.net.ScoredNetwork;
[Landroid.net.Uri;
+[Landroid.net.wifi.ScanResult$InformationElement;
[Landroid.net.wifi.SupplicantState;
[Landroid.os.AsyncTask$Status;
-[Landroid.os.IBinder;
[Landroid.os.MessageQueue$IdleHandler;
[Landroid.os.Parcel;
[Landroid.os.Parcelable;
[Landroid.os.PatternMatcher;
+[Landroid.os.PersistableBundle;
[Landroid.os.storage.StorageVolume;
+[Landroid.service.notification.StatusBarNotification;
[Landroid.system.StructPollfd;
[Landroid.telephony.TelephonyManager$MultiSimVariants;
[Landroid.text.DynamicLayout$ChangeWatcher;
+[Landroid.text.FontConfig$Alias;
+[Landroid.text.FontConfig$Family;
+[Landroid.text.FontConfig$Font;
+[Landroid.text.Hyphenator$HyphenationData;
[Landroid.text.InputFilter;
[Landroid.text.Layout$Alignment;
[Landroid.text.Layout$Directions;
@@ -142,30 +164,33 @@
[Landroid.text.style.SpellCheckSpan;
[Landroid.text.style.SuggestionSpan;
[Landroid.text.style.TabStopSpan;
-[Landroid.text.style.URLSpan;
[Landroid.text.style.WrapTogetherSpan;
[Landroid.util.LongSparseArray;
+[Landroid.util.Pair;
[Landroid.util.Range;
[Landroid.util.Rational;
+[Landroid.util.Size;
[Landroid.view.Choreographer$CallbackQueue;
[Landroid.view.Display$Mode;
+[Landroid.view.Display;
[Landroid.view.HandlerActionQueue$HandlerAction;
[Landroid.view.MenuItem;
[Landroid.view.View;
-[Landroid.widget.Editor$TextRenderNode;
[Landroid.widget.Editor$TextViewPositionListener;
[Landroid.widget.ImageView$ScaleType;
[Landroid.widget.TextView$BufferType;
[Landroid.widget.TextView$ChangeWatcher;
-[Lcom.android.dex.TableOfContents$Section;
[Lcom.android.internal.policy.PhoneWindow$PanelFeatureState;
+[Lcom.android.internal.telephony.IccCardConstants$State;
[Lcom.android.internal.telephony.PhoneConstants$State;
+[Lcom.android.internal.util.StateMachine$SmHandler$StateInfo;
[Lcom.android.okhttp.CipherSuite;
[Lcom.android.okhttp.ConnectionSpec;
[Lcom.android.okhttp.HttpUrl$Builder$ParseResult;
[Lcom.android.okhttp.Protocol;
[Lcom.android.okhttp.TlsVersion;
[Lcom.android.org.bouncycastle.asn1.ASN1ObjectIdentifier;
+[Lcom.android.org.conscrypt.OpenSSLSignature$EngineType;
[Lcom.android.org.conscrypt.OpenSSLX509CertPath$Encoding;
[Lcom.android.org.conscrypt.OpenSSLX509Certificate;
[Lcom.android.org.conscrypt.ct.CTLogInfo;
@@ -177,7 +202,6 @@
[Ljava.io.IOException;
[Ljava.io.ObjectInputStream$HandleTable$HandleList;
[Ljava.io.ObjectStreamField;
-[Ljava.lang.Boolean;
[Ljava.lang.Byte;
[Ljava.lang.CharSequence;
[Ljava.lang.Character$UnicodeBlock;
@@ -213,6 +237,7 @@
[Ljava.math.RoundingMode;
[Ljava.net.InetAddress;
[Ljava.net.Proxy$Type;
+[Ljava.nio.ByteBuffer;
[Ljava.nio.file.attribute.FileAttribute;
[Ljava.security.CryptoPrimitive;
[Ljava.security.Provider;
@@ -239,6 +264,12 @@
[Ljava.util.concurrent.TimeUnit;
[Ljava.util.logging.Handler;
[Ljava.util.regex.Pattern;
+[Ljava.util.stream.StreamOpFlag$Type;
+[Ljava.util.stream.StreamOpFlag;
+[Ljava.util.stream.StreamShape;
+[Ljavax.crypto.Cipher$InitType;
+[Ljavax.crypto.Cipher$NeedToSet;
+[Ljavax.microedition.khronos.egl.EGLConfig;
[Ljavax.net.ssl.KeyManager;
[Ljavax.net.ssl.TrustManager;
[Ljavax.security.cert.X509Certificate;
@@ -249,6 +280,7 @@
[Lorg.apache.http.Header;
[Lorg.json.JSONStringer$Scope;
[Lorg.kxml2.io.KXmlParser$ValueContext;
+[Lsun.invoke.util.Wrapper;
[Lsun.misc.FDBigInteger;
[Lsun.misc.FormattedFloatingDecimal$Form;
[Lsun.security.jca.ProviderConfig;
@@ -256,7 +288,7 @@
[Lsun.security.pkcs.SignerInfo;
[Lsun.security.util.DerOutputStream;
[Lsun.security.util.DerValue;
-[Lsun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator;
+[Lsun.security.util.DisabledAlgorithmConstraints$Constraint$Operator;
[Lsun.security.util.ObjectIdentifier;
[Lsun.security.x509.AVA;
[Lsun.security.x509.RDN;
@@ -270,18 +302,25 @@
[[Ljava.lang.Object;
[[Ljava.lang.String;
[[Ljava.lang.annotation.Annotation;
-[[[I
android.R$styleable
android.accounts.Account
android.accounts.Account$1
android.accounts.AccountManager
android.accounts.AccountManager$1
+android.accounts.AccountManager$19
+android.accounts.AccountManager$BaseFutureTask
+android.accounts.AccountManager$BaseFutureTask$1
+android.accounts.AccountManager$BaseFutureTask$Response
+android.accounts.AccountManager$Future2Task
+android.accounts.AccountManagerCallback
android.accounts.AccountManagerFuture
android.accounts.AccountsException
android.accounts.AuthenticatorException
android.accounts.IAccountManager
android.accounts.IAccountManager$Stub
android.accounts.IAccountManager$Stub$Proxy
+android.accounts.IAccountManagerResponse
+android.accounts.IAccountManagerResponse$Stub
android.accounts.OnAccountsUpdateListener
android.accounts.OperationCanceledException
android.animation.AnimationHandler
@@ -303,7 +342,6 @@
android.animation.AnimatorSet$Builder
android.animation.AnimatorSet$Node
android.animation.AnimatorSet$SeekState
-android.animation.ArgbEvaluator
android.animation.FloatEvaluator
android.animation.FloatKeyframeSet
android.animation.IntEvaluator
@@ -311,7 +349,6 @@
android.animation.Keyframe
android.animation.Keyframe$FloatKeyframe
android.animation.Keyframe$IntKeyframe
-android.animation.Keyframe$ObjectKeyframe
android.animation.KeyframeSet
android.animation.Keyframes
android.animation.Keyframes$FloatKeyframes
@@ -335,17 +372,23 @@
android.animation.TypeEvaluator
android.animation.ValueAnimator
android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.ActionBar
-android.app.ActionBar$LayoutParams
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
android.app.Activity
android.app.Activity$HostCallbacks
android.app.ActivityManager
android.app.ActivityManager$1
+android.app.ActivityManager$RecentTaskInfo
+android.app.ActivityManager$RecentTaskInfo$1
android.app.ActivityManager$RunningAppProcessInfo
android.app.ActivityManager$RunningAppProcessInfo$1
+android.app.ActivityManager$RunningServiceInfo
+android.app.ActivityManager$RunningServiceInfo$1
+android.app.ActivityManager$RunningTaskInfo
+android.app.ActivityManager$RunningTaskInfo$1
android.app.ActivityManager$StackId
android.app.ActivityManager$TaskDescription
android.app.ActivityManager$TaskDescription$1
@@ -353,8 +396,8 @@
android.app.ActivityThread
android.app.ActivityThread$1
android.app.ActivityThread$2
-android.app.ActivityThread$3
android.app.ActivityThread$ActivityClientRecord
+android.app.ActivityThread$ActivityConfigChangeData
android.app.ActivityThread$AppBindData
android.app.ActivityThread$ApplicationThread
android.app.ActivityThread$BindServiceData
@@ -374,38 +417,31 @@
android.app.ActivityThread$StopInfo
android.app.ActivityTransitionState
android.app.AlertDialog
-android.app.AlertDialog$Builder
android.app.AppGlobals
android.app.AppOpsManager
+android.app.AppOpsManager$OnOpChangedListener
android.app.Application
android.app.Application$ActivityLifecycleCallbacks
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
+android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate
android.app.ApplicationPackageManager$ResourceName
-android.app.BackStackRecord
-android.app.BackStackRecord$Op
android.app.ContentProviderHolder
android.app.ContentProviderHolder$1
android.app.ContextImpl
android.app.ContextImpl$ApplicationContentResolver
+android.app.DexLoadReporter
android.app.Dialog
android.app.Dialog$ListenersHandler
-android.app.DialogFragment
android.app.DownloadManager
android.app.Fragment
-android.app.Fragment$1
android.app.FragmentContainer
android.app.FragmentController
android.app.FragmentHostCallback
android.app.FragmentManager
-android.app.FragmentManager$BackStackEntry
android.app.FragmentManagerImpl
android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentTransaction
-android.app.FragmentTransition
-android.app.FragmentTransition$FragmentContainerTransition
android.app.IActivityManager
android.app.IActivityManager$Stub
android.app.IActivityManager$Stub$Proxy
@@ -426,14 +462,19 @@
android.app.IUiModeManager
android.app.IUiModeManager$Stub
android.app.IUiModeManager$Stub$Proxy
+android.app.IUserSwitchObserver
+android.app.IUserSwitchObserver$Stub
+android.app.IWallpaperManager
+android.app.IWallpaperManager$Stub
+android.app.IWallpaperManagerCallback
+android.app.IWallpaperManagerCallback$Stub
android.app.Instrumentation
android.app.IntentReceiverLeaked
android.app.IntentService
android.app.IntentService$ServiceHandler
+android.app.JobSchedulerImpl
android.app.KeyguardManager
-android.app.ListActivity
android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
android.app.LoadedApk$ReceiverDispatcher
android.app.LoadedApk$ReceiverDispatcher$Args
android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -447,10 +488,24 @@
android.app.LoaderManagerImpl
android.app.NativeActivity
android.app.Notification
+android.app.Notification$1
android.app.Notification$Action
+android.app.Notification$Action$1
+android.app.Notification$BigPictureStyle
android.app.Notification$BigTextStyle
android.app.Notification$Builder
+android.app.Notification$BuilderRemoteViews
+android.app.Notification$DecoratedCustomViewStyle
+android.app.Notification$DecoratedMediaCustomViewStyle
+android.app.Notification$InboxStyle
+android.app.Notification$MediaStyle
+android.app.Notification$MessagingStyle
+android.app.Notification$StandardTemplateParams
android.app.Notification$Style
+android.app.NotificationChannel
+android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
android.app.NotificationManager
android.app.PendingIntent
android.app.PendingIntent$1
@@ -459,6 +514,7 @@
android.app.QueuedWork
android.app.QueuedWork$QueuedWorkHandler
android.app.ReceiverRestrictedContext
+android.app.RemoteInput
android.app.ResourcesManager
android.app.ResourcesManager$1
android.app.ResourcesManager$ActivityResources
@@ -466,6 +522,8 @@
android.app.ResultInfo$1
android.app.Service
android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
android.app.SharedElementCallback
android.app.SharedElementCallback$1
android.app.SharedPreferencesImpl
@@ -555,12 +613,17 @@
android.app.SystemServiceRegistry$78
android.app.SystemServiceRegistry$79
android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
android.app.SystemServiceRegistry$9
android.app.SystemServiceRegistry$CachedServiceFetcher
android.app.SystemServiceRegistry$ServiceFetcher
android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
android.app.SystemServiceRegistry$StaticServiceFetcher
android.app.UiModeManager
+android.app.UserSwitchObserver
+android.app.VrManager
android.app.WallpaperManager
android.app.admin.DevicePolicyManager
android.app.admin.IDevicePolicyManager
@@ -569,6 +632,7 @@
android.app.admin.SecurityLog
android.app.admin.SecurityLog$SecurityEvent
android.app.admin.SecurityLog$SecurityEvent$1
+android.app.backup.BackupAgent
android.app.backup.BackupDataInput
android.app.backup.BackupDataInput$EntityHeader
android.app.backup.BackupDataOutput
@@ -578,33 +642,82 @@
android.app.backup.FileBackupHelperBase
android.app.backup.FullBackup
android.app.backup.FullBackupDataOutput
+android.app.backup.IBackupManager
+android.app.backup.IBackupManager$Stub
+android.app.backup.IBackupManager$Stub$Proxy
+android.app.job.IJobCallback
+android.app.job.IJobCallback$Stub
+android.app.job.IJobCallback$Stub$Proxy
+android.app.job.IJobScheduler
+android.app.job.IJobScheduler$Stub
+android.app.job.IJobScheduler$Stub$Proxy
+android.app.job.IJobService
+android.app.job.IJobService$Stub
android.app.job.JobInfo
+android.app.job.JobInfo$1
+android.app.job.JobInfo$Builder
+android.app.job.JobInfo$TriggerContentUri
+android.app.job.JobInfo$TriggerContentUri$1
+android.app.job.JobParameters
+android.app.job.JobParameters$1
android.app.job.JobScheduler
android.app.job.JobService
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
android.app.trust.ITrustManager
android.app.trust.ITrustManager$Stub
android.app.trust.ITrustManager$Stub$Proxy
android.app.trust.TrustManager
+android.app.usage.IUsageStatsManager
+android.app.usage.IUsageStatsManager$Stub
android.app.usage.NetworkStatsManager
android.app.usage.StorageStatsManager
+android.app.usage.UsageEvents
+android.app.usage.UsageEvents$1
android.app.usage.UsageStatsManager
android.appwidget.AppWidgetManager
+android.appwidget.AppWidgetProvider
+android.bluetooth.BluetoothActivityEnergyInfo
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothAdapter$1
+android.bluetooth.BluetoothDevice
+android.bluetooth.BluetoothDevice$1
+android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothHeadset
+android.bluetooth.BluetoothHeadset$1
+android.bluetooth.BluetoothHeadset$2
+android.bluetooth.BluetoothHeadset$3
android.bluetooth.BluetoothManager
+android.bluetooth.BluetoothProfile
+android.bluetooth.BluetoothProfile$ServiceListener
android.bluetooth.IBluetooth
android.bluetooth.IBluetooth$Stub
android.bluetooth.IBluetooth$Stub$Proxy
+android.bluetooth.IBluetoothA2dp
+android.bluetooth.IBluetoothA2dp$Stub
+android.bluetooth.IBluetoothGatt
+android.bluetooth.IBluetoothGatt$Stub
+android.bluetooth.IBluetoothHeadset
+android.bluetooth.IBluetoothHeadset$Stub
+android.bluetooth.IBluetoothHeadset$Stub$Proxy
android.bluetooth.IBluetoothManager
android.bluetooth.IBluetoothManager$Stub
android.bluetooth.IBluetoothManager$Stub$Proxy
android.bluetooth.IBluetoothManagerCallback
android.bluetooth.IBluetoothManagerCallback$Stub
+android.bluetooth.IBluetoothProfileServiceConnection
+android.bluetooth.IBluetoothProfileServiceConnection$Stub
+android.bluetooth.IBluetoothStateChangeCallback
+android.bluetooth.IBluetoothStateChangeCallback$Stub
+android.companion.CompanionDeviceManager
+android.content.AbstractThreadedSyncAdapter
+android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
android.content.ActivityNotFoundException
android.content.BroadcastReceiver
android.content.BroadcastReceiver$PendingResult
android.content.BroadcastReceiver$PendingResult$1
-android.content.ClipData
android.content.ClipboardManager
android.content.ComponentCallbacks
android.content.ComponentCallbacks2
@@ -614,12 +727,10 @@
android.content.ContentProvider$Transport
android.content.ContentProviderClient
android.content.ContentProviderNative
-android.content.ContentProviderOperation
android.content.ContentProviderProxy
android.content.ContentProviderResult
android.content.ContentResolver
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
android.content.ContentUris
android.content.ContentValues
android.content.ContentValues$1
@@ -638,8 +749,13 @@
android.content.IIntentSender
android.content.IIntentSender$Stub
android.content.IIntentSender$Stub$Proxy
+android.content.ISyncAdapter
+android.content.ISyncAdapter$Stub
+android.content.ISyncContext
+android.content.ISyncContext$Stub
android.content.Intent
android.content.Intent$1
+android.content.Intent$FilterComparison
android.content.IntentFilter
android.content.IntentFilter$1
android.content.IntentFilter$MalformedMimeTypeException
@@ -651,6 +767,10 @@
android.content.SharedPreferences
android.content.SharedPreferences$Editor
android.content.SharedPreferences$OnSharedPreferenceChangeListener
+android.content.SyncResult
+android.content.SyncResult$1
+android.content.SyncStats
+android.content.SyncStats$1
android.content.UndoManager
android.content.UndoOwner
android.content.UriMatcher
@@ -658,6 +778,7 @@
android.content.pm.ActivityInfo$1
android.content.pm.ApplicationInfo
android.content.pm.ApplicationInfo$1
+android.content.pm.BaseParceledListSlice
android.content.pm.ComponentInfo
android.content.pm.ConfigurationInfo
android.content.pm.ConfigurationInfo$1
@@ -665,19 +786,24 @@
android.content.pm.FeatureGroupInfo$1
android.content.pm.FeatureInfo
android.content.pm.FeatureInfo$1
+android.content.pm.IOnPermissionsChangeListener
+android.content.pm.IOnPermissionsChangeListener$Stub
+android.content.pm.IPackageInstaller
+android.content.pm.IPackageInstaller$Stub
android.content.pm.IPackageManager
android.content.pm.IPackageManager$Stub
android.content.pm.IPackageManager$Stub$Proxy
+android.content.pm.IShortcutService
+android.content.pm.IShortcutService$Stub
android.content.pm.InstrumentationInfo
android.content.pm.InstrumentationInfo$1
android.content.pm.LauncherApps
android.content.pm.PackageInfo
android.content.pm.PackageInfo$1
-android.content.pm.PackageInstaller
-android.content.pm.PackageInstaller$SessionInfo
android.content.pm.PackageItemInfo
android.content.pm.PackageManager
android.content.pm.PackageManager$NameNotFoundException
+android.content.pm.PackageManager$OnPermissionsChangedListener
android.content.pm.PackageParser$PackageParserException
android.content.pm.ParceledListSlice
android.content.pm.ParceledListSlice$1
@@ -691,6 +817,8 @@
android.content.pm.ResolveInfo$1
android.content.pm.ServiceInfo
android.content.pm.ServiceInfo$1
+android.content.pm.ShortcutInfo
+android.content.pm.ShortcutInfo$1
android.content.pm.ShortcutManager
android.content.pm.Signature
android.content.pm.Signature$1
@@ -703,6 +831,7 @@
android.content.res.ColorStateList
android.content.res.ColorStateList$1
android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
android.content.res.CompatibilityInfo
android.content.res.CompatibilityInfo$1
android.content.res.CompatibilityInfo$2
@@ -764,6 +893,7 @@
android.database.Observable
android.database.SQLException
android.database.sqlite.DatabaseObjectNotClosedException
+android.database.sqlite.SQLiteCantOpenDatabaseException
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteConnection
android.database.sqlite.SQLiteConnection$Operation
@@ -778,13 +908,13 @@
android.database.sqlite.SQLiteCustomFunction
android.database.sqlite.SQLiteDatabase
android.database.sqlite.SQLiteDatabase$1
-android.database.sqlite.SQLiteDatabase$CursorFactory
android.database.sqlite.SQLiteDatabaseConfiguration
android.database.sqlite.SQLiteDatabaseCorruptException
android.database.sqlite.SQLiteDatabaseLockedException
android.database.sqlite.SQLiteDebug
android.database.sqlite.SQLiteDebug$PagerStats
android.database.sqlite.SQLiteDirectCursorDriver
+android.database.sqlite.SQLiteDoneException
android.database.sqlite.SQLiteException
android.database.sqlite.SQLiteGlobal
android.database.sqlite.SQLiteOpenHelper
@@ -795,6 +925,7 @@
android.database.sqlite.SQLiteSession$Transaction
android.database.sqlite.SQLiteStatement
android.database.sqlite.SQLiteStatementInfo
+android.database.sqlite.SQLiteTransactionListener
android.ddm.DdmHandleAppName
android.ddm.DdmHandleExit
android.ddm.DdmHandleHeap
@@ -804,6 +935,13 @@
android.ddm.DdmHandleThread
android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
android.graphics.BaseCanvas
android.graphics.Bitmap
android.graphics.Bitmap$1
@@ -822,6 +960,13 @@
android.graphics.Color
android.graphics.ColorFilter
android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
android.graphics.ComposePathEffect
android.graphics.ComposeShader
android.graphics.CornerPathEffect
@@ -863,7 +1008,6 @@
android.graphics.PathEffect
android.graphics.PathMeasure
android.graphics.Picture
-android.graphics.PixelFormat
android.graphics.Point
android.graphics.Point$1
android.graphics.PointF
@@ -891,6 +1035,7 @@
android.graphics.Typeface
android.graphics.Xfermode
android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
android.graphics.drawable.Animatable
android.graphics.drawable.Animatable2
android.graphics.drawable.AnimatedStateListDrawable
@@ -923,6 +1068,7 @@
android.graphics.drawable.Icon$1
android.graphics.drawable.InsetDrawable
android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
android.graphics.drawable.LayerDrawable
android.graphics.drawable.LayerDrawable$ChildDrawable
android.graphics.drawable.LayerDrawable$LayerState
@@ -948,6 +1094,7 @@
android.graphics.drawable.StateListDrawable
android.graphics.drawable.StateListDrawable$StateListState
android.graphics.drawable.TransitionDrawable
+android.graphics.drawable.TransitionDrawable$TransitionState
android.graphics.drawable.VectorDrawable
android.graphics.drawable.VectorDrawable$VFullPath
android.graphics.drawable.VectorDrawable$VFullPath$1
@@ -978,6 +1125,7 @@
android.graphics.drawable.shapes.OvalShape
android.graphics.drawable.shapes.RectShape
android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
android.graphics.pdf.PdfDocument
android.graphics.pdf.PdfEditor
android.graphics.pdf.PdfRenderer
@@ -987,6 +1135,9 @@
android.hardware.ConsumerIrManager
android.hardware.HardwareBuffer
android.hardware.HardwareBuffer$1
+android.hardware.ICameraService
+android.hardware.ICameraService$Stub
+android.hardware.ICameraService$Stub$Proxy
android.hardware.Sensor
android.hardware.SensorEvent
android.hardware.SensorEventListener
@@ -995,14 +1146,88 @@
android.hardware.SerialPort
android.hardware.SystemSensorManager
android.hardware.SystemSensorManager$BaseEventQueue
+android.hardware.SystemSensorManager$SensorEventQueue
+android.hardware.camera2.CameraAccessException
+android.hardware.camera2.CameraCharacteristics
+android.hardware.camera2.CameraCharacteristics$1
+android.hardware.camera2.CameraCharacteristics$2
+android.hardware.camera2.CameraCharacteristics$3
+android.hardware.camera2.CameraCharacteristics$4
+android.hardware.camera2.CameraCharacteristics$5
android.hardware.camera2.CameraCharacteristics$Key
android.hardware.camera2.CameraManager
+android.hardware.camera2.CameraMetadata
+android.hardware.camera2.CaptureRequest
+android.hardware.camera2.CaptureRequest$1
+android.hardware.camera2.CaptureRequest$2
android.hardware.camera2.CaptureRequest$Key
+android.hardware.camera2.CaptureResult
+android.hardware.camera2.CaptureResult$1
+android.hardware.camera2.CaptureResult$2
+android.hardware.camera2.CaptureResult$3
android.hardware.camera2.CaptureResult$Key
android.hardware.camera2.DngCreator
android.hardware.camera2.impl.CameraMetadataNative
+android.hardware.camera2.impl.CameraMetadataNative$1
+android.hardware.camera2.impl.CameraMetadataNative$10
+android.hardware.camera2.impl.CameraMetadataNative$11
+android.hardware.camera2.impl.CameraMetadataNative$12
+android.hardware.camera2.impl.CameraMetadataNative$13
+android.hardware.camera2.impl.CameraMetadataNative$14
+android.hardware.camera2.impl.CameraMetadataNative$15
+android.hardware.camera2.impl.CameraMetadataNative$16
+android.hardware.camera2.impl.CameraMetadataNative$17
+android.hardware.camera2.impl.CameraMetadataNative$18
+android.hardware.camera2.impl.CameraMetadataNative$19
+android.hardware.camera2.impl.CameraMetadataNative$2
+android.hardware.camera2.impl.CameraMetadataNative$3
+android.hardware.camera2.impl.CameraMetadataNative$4
+android.hardware.camera2.impl.CameraMetadataNative$5
+android.hardware.camera2.impl.CameraMetadataNative$6
+android.hardware.camera2.impl.CameraMetadataNative$7
+android.hardware.camera2.impl.CameraMetadataNative$8
+android.hardware.camera2.impl.CameraMetadataNative$9
+android.hardware.camera2.impl.CameraMetadataNative$Key
+android.hardware.camera2.impl.GetCommand
+android.hardware.camera2.impl.SetCommand
android.hardware.camera2.legacy.LegacyCameraDevice
android.hardware.camera2.legacy.PerfMeasurement
+android.hardware.camera2.marshal.MarshalQueryable
+android.hardware.camera2.marshal.MarshalRegistry
+android.hardware.camera2.marshal.impl.MarshalQueryableArray
+android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern
+android.hardware.camera2.marshal.impl.MarshalQueryableBoolean
+android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform
+android.hardware.camera2.marshal.impl.MarshalQueryableEnum
+android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableMeteringRectangle
+android.hardware.camera2.marshal.impl.MarshalQueryableNativeByteToInteger
+android.hardware.camera2.marshal.impl.MarshalQueryablePair
+android.hardware.camera2.marshal.impl.MarshalQueryableParcelable
+android.hardware.camera2.marshal.impl.MarshalQueryablePrimitive
+android.hardware.camera2.marshal.impl.MarshalQueryableRange
+android.hardware.camera2.marshal.impl.MarshalQueryableRect
+android.hardware.camera2.marshal.impl.MarshalQueryableReprocessFormatsMap
+android.hardware.camera2.marshal.impl.MarshalQueryableRggbChannelVector
+android.hardware.camera2.marshal.impl.MarshalQueryableSize
+android.hardware.camera2.marshal.impl.MarshalQueryableSizeF
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration
+android.hardware.camera2.marshal.impl.MarshalQueryableString
+android.hardware.camera2.params.BlackLevelPattern
+android.hardware.camera2.params.ColorSpaceTransform
+android.hardware.camera2.params.Face
+android.hardware.camera2.params.HighSpeedVideoConfiguration
+android.hardware.camera2.params.LensShadingMap
+android.hardware.camera2.params.MeteringRectangle
+android.hardware.camera2.params.ReprocessFormatsMap
+android.hardware.camera2.params.RggbChannelVector
+android.hardware.camera2.params.StreamConfiguration
+android.hardware.camera2.params.StreamConfigurationDuration
+android.hardware.camera2.params.StreamConfigurationMap
+android.hardware.camera2.params.TonemapCurve
+android.hardware.camera2.utils.TypeReference
+android.hardware.camera2.utils.TypeReference$SpecializedTypeReference
android.hardware.display.DisplayManager
android.hardware.display.DisplayManager$DisplayListener
android.hardware.display.DisplayManagerGlobal
@@ -1083,8 +1308,8 @@
android.icu.impl.CacheValue$NullValue
android.icu.impl.CacheValue$SoftValue
android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarUtil
-android.icu.impl.CalendarUtil$CalendarPreferences
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$StringContextIterator
android.icu.impl.CharTrie
android.icu.impl.ClassLoaderUtil
android.icu.impl.CurrencyData
@@ -1130,7 +1355,6 @@
android.icu.impl.ICUResourceBundleImpl$ResourceArray
android.icu.impl.ICUResourceBundleImpl$ResourceContainer
android.icu.impl.ICUResourceBundleImpl$ResourceInt
-android.icu.impl.ICUResourceBundleImpl$ResourceIntVector
android.icu.impl.ICUResourceBundleImpl$ResourceString
android.icu.impl.ICUResourceBundleImpl$ResourceTable
android.icu.impl.ICUResourceBundleReader
@@ -1172,7 +1396,6 @@
android.icu.impl.ReplaceableUCharacterIterator
android.icu.impl.RuleCharacterIterator
android.icu.impl.SimpleCache
-android.icu.impl.SimpleFormatterImpl
android.icu.impl.SoftCache
android.icu.impl.StandardPlural
android.icu.impl.StringPrepDataReader
@@ -1189,6 +1412,9 @@
android.icu.impl.Trie2_16
android.icu.impl.UBiDiProps
android.icu.impl.UBiDiProps$IsAcceptable
+android.icu.impl.UCaseProps
+android.icu.impl.UCaseProps$ContextIterator
+android.icu.impl.UCaseProps$IsAcceptable
android.icu.impl.UCharacterProperty
android.icu.impl.UCharacterProperty$1
android.icu.impl.UCharacterProperty$10
@@ -1246,15 +1472,12 @@
android.icu.text.BreakIteratorFactory
android.icu.text.BreakIteratorFactory$BFService
android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
android.icu.text.CurrencyDisplayNames
android.icu.text.CurrencyMetaInfo
android.icu.text.CurrencyMetaInfo$CurrencyDigits
android.icu.text.CurrencyMetaInfo$CurrencyFilter
-android.icu.text.DateFormatSymbols
-android.icu.text.DateFormatSymbols$1
-android.icu.text.DateFormatSymbols$CalendarDataSink
-android.icu.text.DateFormatSymbols$CalendarDataSink$AliasType
-android.icu.text.DateFormatSymbols$CapitalizationContextUsage
android.icu.text.DecimalFormat
android.icu.text.DecimalFormat$Unit
android.icu.text.DecimalFormatSymbols
@@ -1322,7 +1545,6 @@
android.icu.text.UnicodeFilter
android.icu.text.UnicodeMatcher
android.icu.text.UnicodeSet
-android.icu.util.BytesTrie$Result
android.icu.util.Currency
android.icu.util.Currency$1
android.icu.util.Currency$CurrencyUsage
@@ -1344,14 +1566,30 @@
android.icu.util.ULocale$Type
android.icu.util.UResourceBundle
android.icu.util.UResourceBundle$RootType
-android.icu.util.UResourceBundleIterator
android.icu.util.UResourceTypeMismatchException
android.icu.util.VersionInfo
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
android.location.CountryDetector
+android.location.GnssMeasurementCallbackTransport
+android.location.GnssMeasurementCallbackTransport$ListenerTransport
+android.location.GnssNavigationMessageCallbackTransport
+android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
+android.location.IGnssMeasurementsListener
+android.location.IGnssMeasurementsListener$Stub
+android.location.IGnssNavigationMessageListener
+android.location.IGnssNavigationMessageListener$Stub
+android.location.ILocationManager
+android.location.ILocationManager$Stub
+android.location.ILocationManager$Stub$Proxy
+android.location.LocalListenerHelper
android.location.Location
-android.location.Location$1
-android.location.Location$2
+android.location.LocationListener
android.location.LocationManager
+android.location.LocationRequest
+android.location.LocationRequest$1
android.media.AudioAttributes
android.media.AudioAttributes$1
android.media.AudioAttributes$Builder
@@ -1396,6 +1634,8 @@
android.media.IPlayer$Stub
android.media.IRecordingConfigDispatcher
android.media.IRecordingConfigDispatcher$Stub
+android.media.IRingtonePlayer
+android.media.IRingtonePlayer$Stub
android.media.Image
android.media.ImageReader
android.media.ImageReader$SurfaceImage
@@ -1403,11 +1643,9 @@
android.media.ImageWriter$WriterSurfaceImage
android.media.JetPlayer
android.media.MediaCodec
-android.media.MediaCodecInfo
-android.media.MediaCodecInfo$CodecCapabilities
-android.media.MediaCodecInfo$CodecProfileLevel
android.media.MediaCodecList
android.media.MediaCrypto
+android.media.MediaDescrambler
android.media.MediaDrm
android.media.MediaExtractor
android.media.MediaFormat
@@ -1415,7 +1653,6 @@
android.media.MediaMetadataRetriever
android.media.MediaMuxer
android.media.MediaPlayer
-android.media.MediaPlayer$OnCompletionListener
android.media.MediaRecorder
android.media.MediaRouter
android.media.MediaScanner
@@ -1423,23 +1660,49 @@
android.media.PlaybackParams
android.media.PlaybackParams$1
android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
android.media.PlayerBase$PlayerIdCard
android.media.PlayerBase$PlayerIdCard$1
android.media.RemoteDisplay
android.media.ResampleInputStream
+android.media.SoundPool
android.media.SubtitleController$Listener
android.media.ToneGenerator
+android.media.VolumeAutomation
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
android.media.midi.MidiManager
android.media.projection.MediaProjectionManager
+android.media.session.IActiveSessionsListener
+android.media.session.IActiveSessionsListener$Stub
+android.media.session.ISessionController
+android.media.session.ISessionController$Stub
+android.media.session.ISessionControllerCallback
+android.media.session.ISessionControllerCallback$Stub
+android.media.session.ISessionManager
+android.media.session.ISessionManager$Stub
+android.media.session.MediaController
+android.media.session.MediaController$CallbackStub
+android.media.session.MediaController$TransportControls
+android.media.session.MediaSession$Token
+android.media.session.MediaSession$Token$1
android.media.session.MediaSessionManager
+android.media.session.PlaybackState
+android.media.session.PlaybackState$1
+android.media.session.PlaybackState$CustomAction
+android.media.session.PlaybackState$CustomAction$1
android.media.soundtrigger.SoundTriggerManager
android.media.tv.TvInputManager
-android.metrics.LogMaker
android.mtp.MtpDatabase
android.mtp.MtpDevice
android.mtp.MtpDeviceInfo
@@ -1454,21 +1717,36 @@
android.net.ConnectivityManager$CallbackHandler
android.net.ConnectivityManager$NetworkCallback
android.net.ConnectivityThread
-# Must not be initialized, creates a thread.
-# android.net.ConnectivityThread$Singleton
android.net.Credentials
+android.net.DhcpInfo
+android.net.DhcpInfo$1
android.net.EthernetManager
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
+android.net.INetworkPolicyManager
+android.net.INetworkPolicyManager$Stub
+android.net.INetworkScoreService
+android.net.INetworkScoreService$Stub
+android.net.INetworkScoreService$Stub$Proxy
+android.net.INetworkStatsService
+android.net.INetworkStatsService$Stub
+android.net.INetworkStatsService$Stub$Proxy
+android.net.IpConfiguration
+android.net.IpConfiguration$1
+android.net.IpConfiguration$IpAssignment
+android.net.IpConfiguration$ProxySettings
android.net.IpPrefix
android.net.IpPrefix$1
+android.net.IpSecManager
android.net.LinkAddress
android.net.LinkAddress$1
android.net.LinkProperties
android.net.LinkProperties$1
android.net.LocalServerSocket
android.net.LocalSocket
+android.net.LocalSocketAddress
+android.net.LocalSocketAddress$Namespace
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
@@ -1476,16 +1754,20 @@
android.net.Network$1
android.net.NetworkCapabilities
android.net.NetworkCapabilities$1
+android.net.NetworkFactory
android.net.NetworkInfo
android.net.NetworkInfo$1
android.net.NetworkInfo$DetailedState
android.net.NetworkInfo$State
+android.net.NetworkKey
+android.net.NetworkKey$1
android.net.NetworkPolicyManager
android.net.NetworkRequest
android.net.NetworkRequest$1
android.net.NetworkRequest$Builder
android.net.NetworkRequest$Type
android.net.NetworkScoreManager
+android.net.NetworkSpecifier
android.net.NetworkStats
android.net.NetworkStats$1
android.net.NetworkUtils
@@ -1493,6 +1775,14 @@
android.net.ProxyInfo
android.net.RouteInfo
android.net.RouteInfo$1
+android.net.RssiCurve
+android.net.RssiCurve$1
+android.net.SSLCertificateSocketFactory
+android.net.SSLCertificateSocketFactory$1
+android.net.SSLSessionCache
+android.net.ScoredNetwork
+android.net.ScoredNetwork$1
+android.net.StaticIpConfiguration
android.net.TrafficStats
android.net.Uri
android.net.Uri$1
@@ -1507,23 +1797,33 @@
android.net.Uri$PathSegments
android.net.Uri$PathSegmentsBuilder
android.net.Uri$StringUri
+android.net.WifiKey
+android.net.WifiKey$1
android.net.nsd.NsdManager
android.net.wifi.IWifiManager
android.net.wifi.IWifiManager$Stub
android.net.wifi.IWifiManager$Stub$Proxy
+android.net.wifi.ParcelUtil
android.net.wifi.RttManager
+android.net.wifi.ScanResult
+android.net.wifi.ScanResult$1
+android.net.wifi.ScanResult$InformationElement
android.net.wifi.SupplicantState
android.net.wifi.SupplicantState$1
+android.net.wifi.WifiConfiguration
+android.net.wifi.WifiConfiguration$1
+android.net.wifi.WifiConfiguration$NetworkSelectionStatus
+android.net.wifi.WifiEnterpriseConfig
+android.net.wifi.WifiEnterpriseConfig$1
android.net.wifi.WifiInfo
android.net.wifi.WifiInfo$1
android.net.wifi.WifiManager
+android.net.wifi.WifiManager$WifiLock
android.net.wifi.WifiScanner
android.net.wifi.WifiSsid
android.net.wifi.WifiSsid$1
android.net.wifi.aware.WifiAwareManager
android.net.wifi.p2p.WifiP2pManager
-android.nfc.INfcAdapter
-android.nfc.INfcAdapter$Stub
android.nfc.NfcManager
android.opengl.EGL14
android.opengl.EGLConfig
@@ -1545,7 +1845,8 @@
android.opengl.GLUtils
android.opengl.Matrix
android.opengl.Visibility
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.AsyncResult
android.os.AsyncTask$1
android.os.AsyncTask$2
android.os.AsyncTask$3
@@ -1590,10 +1891,15 @@
android.os.HwBlob
android.os.HwParcel
android.os.HwRemoteBinder
+android.os.IBatteryPropertiesRegistrar
+android.os.IBatteryPropertiesRegistrar$Stub
+android.os.IBatteryPropertiesRegistrar$Stub$Proxy
android.os.IBinder
android.os.IBinder$DeathRecipient
android.os.ICancellationSignal
android.os.ICancellationSignal$Stub
+android.os.IDeviceIdleController
+android.os.IDeviceIdleController$Stub
android.os.IHwBinder
android.os.IInterface
android.os.IMessenger
@@ -1605,6 +1911,7 @@
android.os.IPowerManager
android.os.IPowerManager$Stub
android.os.IPowerManager$Stub$Proxy
+android.os.IRemoteCallback
android.os.IServiceManager
android.os.IUserManager
android.os.IUserManager$Stub
@@ -1627,12 +1934,12 @@
android.os.Parcel$1
android.os.ParcelFileDescriptor
android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$AutoCloseInputStream
+android.os.ParcelUuid
+android.os.ParcelUuid$1
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
-android.os.ParcelableParcel
-android.os.ParcelableParcel$1
+android.os.ParcelableException
android.os.PatternMatcher
android.os.PatternMatcher$1
android.os.PersistableBundle
@@ -1642,9 +1949,12 @@
android.os.PowerManager$WakeLock$1
android.os.Process
android.os.RecoverySystem
+android.os.Registrant
+android.os.RemoteCallbackList
android.os.RemoteException
android.os.ResultReceiver
android.os.SELinux
+android.os.Seccomp
android.os.ServiceManager
android.os.ServiceManager$ServiceNotFoundException
android.os.ServiceManagerNative
@@ -1685,43 +1995,52 @@
android.os.Trace
android.os.Trace$1
android.os.UEventObserver
+android.os.UpdateLock
android.os.UserHandle
android.os.UserHandle$1
android.os.UserManager
android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
+android.os.WorkSource
+android.os.WorkSource$1
android.os.ZygoteProcess
android.os.ZygoteStartFailedEx
android.os.health.SystemHealthManager
+android.os.storage.IObbActionListener
+android.os.storage.IObbActionListener$Stub
android.os.storage.IStorageManager
android.os.storage.IStorageManager$Stub
android.os.storage.IStorageManager$Stub$Proxy
android.os.storage.StorageManager
+android.os.storage.StorageManager$ObbActionListener
android.os.storage.StorageVolume
android.os.storage.StorageVolume$1
-android.preference.PreferenceActivity
-android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
android.preference.PreferenceManager
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.print.PrintManager
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
android.provider.BaseColumns
+android.provider.CalendarContract$CalendarColumns
+android.provider.CalendarContract$CalendarSyncColumns
+android.provider.CalendarContract$EventsColumns
+android.provider.CalendarContract$SyncColumns
android.provider.ContactsContract
android.provider.ContactsContract$CommonDataKinds$BaseTypes
android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Phone
android.provider.ContactsContract$ContactCounts
android.provider.ContactsContract$ContactNameColumns
android.provider.ContactsContract$ContactOptionsColumns
android.provider.ContactsContract$ContactStatusColumns
-android.provider.ContactsContract$Contacts
android.provider.ContactsContract$ContactsColumns
-android.provider.ContactsContract$Data
android.provider.ContactsContract$DataColumns
android.provider.ContactsContract$DataColumnsWithJoins
android.provider.ContactsContract$DataUsageStatColumns
android.provider.ContactsContract$RawContactsColumns
android.provider.ContactsContract$StatusColumns
-android.provider.MediaStore$MediaColumns
+android.provider.Downloads$Impl
+android.provider.FontsContract
+android.provider.FontsContract$1
android.provider.Settings
android.provider.Settings$ContentProviderHolder
android.provider.Settings$GenerationTracker
@@ -1768,6 +2087,12 @@
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
android.security.net.config.TrustedCertificateStoreAdapter
+android.security.net.config.UserCertificateSource
+android.service.notification.StatusBarNotification
+android.service.oemlock.OemLockManager
+android.service.persistentdata.IPersistentDataBlockService
+android.service.persistentdata.IPersistentDataBlockService$Stub
+android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
android.service.persistentdata.PersistentDataBlockManager
android.system.ErrnoException
android.system.GaiException
@@ -1791,11 +2116,30 @@
android.system.UnixSocketAddress
android.telecom.TelecomManager
android.telephony.CarrierConfigManager
-android.telephony.PhoneNumberUtils
+android.telephony.CellIdentityWcdma
+android.telephony.CellIdentityWcdma$1
+android.telephony.CellInfo
+android.telephony.CellInfo$1
+android.telephony.CellInfoWcdma
+android.telephony.CellInfoWcdma$1
+android.telephony.CellLocation
+android.telephony.CellSignalStrength
+android.telephony.CellSignalStrengthWcdma
+android.telephony.CellSignalStrengthWcdma$1
android.telephony.PhoneStateListener
+android.telephony.PhoneStateListener$1
+android.telephony.PhoneStateListener$IPhoneStateListenerStub
android.telephony.Rlog
android.telephony.ServiceState
+android.telephony.ServiceState$1
+android.telephony.SignalStrength
+android.telephony.SignalStrength$1
+android.telephony.SubscriptionInfo
+android.telephony.SubscriptionInfo$1
android.telephony.SubscriptionManager
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$1
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$2
android.telephony.TelephonyManager
android.telephony.TelephonyManager$MultiSimVariants
android.text.AndroidBidi
@@ -1808,20 +2152,13 @@
android.text.Editable
android.text.Editable$Factory
android.text.FontConfig
-android.text.FontConfig$1
android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
android.text.FontConfig$Family
-android.text.FontConfig$Family$1
android.text.FontConfig$Font
-android.text.FontConfig$Font$1
android.text.GetChars
android.text.GraphicsOperations
-android.text.Html
-android.text.Html$HtmlParser
android.text.Hyphenator
+android.text.Hyphenator$HyphenationData
android.text.InputFilter
android.text.InputType
android.text.Layout
@@ -1862,11 +2199,13 @@
android.text.TextUtils
android.text.TextUtils$1
android.text.TextUtils$EllipsizeCallback
+android.text.TextUtils$SimpleStringSplitter
+android.text.TextUtils$StringSplitter
android.text.TextUtils$TruncateAt
android.text.TextWatcher
-android.text.format.DateFormat
-android.text.format.DateUtils
android.text.format.Time
+android.text.format.Time$TimeCalculator
+android.text.format.TimeFormatter
android.text.method.AllCapsTransformationMethod
android.text.method.ArrowKeyMovementMethod
android.text.method.BaseKeyListener
@@ -1887,9 +2226,7 @@
android.text.method.TransformationMethod2
android.text.style.AlignmentSpan
android.text.style.CharacterStyle
-android.text.style.ClickableSpan
android.text.style.EasyEditSpan
-android.text.style.ForegroundColorSpan
android.text.style.LeadingMarginSpan
android.text.style.LineBackgroundSpan
android.text.style.LineHeightSpan
@@ -1900,7 +2237,6 @@
android.text.style.StyleSpan
android.text.style.SuggestionSpan
android.text.style.TabStopSpan
-android.text.style.URLSpan
android.text.style.UpdateAppearance
android.text.style.UpdateLayout
android.text.style.WrapTogetherSpan
@@ -1923,7 +2259,6 @@
android.transition.PathMotion
android.transition.Transition
android.transition.Transition$1
-android.transition.Transition$EpicenterCallback
android.transition.TransitionInflater
android.transition.TransitionManager
android.transition.TransitionSet
@@ -1935,6 +2270,7 @@
android.util.ArrayMap$1
android.util.ArraySet
android.util.ArraySet$1
+android.util.AtomicFile
android.util.AttributeSet
android.util.Base64
android.util.Base64$Coder
@@ -1951,6 +2287,7 @@
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
+android.util.Log$TerribleFailure
android.util.Log$TerribleFailureHandler
android.util.LogPrinter
android.util.LongArray
@@ -1959,16 +2296,20 @@
android.util.LruCache
android.util.MapCollections
android.util.MapCollections$ArrayIterator
+android.util.MapCollections$EntrySet
android.util.MapCollections$KeySet
+android.util.MapCollections$MapIterator
+android.util.MapCollections$ValuesCollection
android.util.MathUtils
android.util.MemoryIntArray
android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
android.util.MutableInt
android.util.MutableLong
android.util.Pair
android.util.PathParser
android.util.PathParser$PathData
-android.util.Patterns
android.util.Pools$Pool
android.util.Pools$SimplePool
android.util.Pools$SynchronizedPool
@@ -1983,13 +2324,19 @@
android.util.SparseArray
android.util.SparseBooleanArray
android.util.SparseIntArray
+android.util.SparseLongArray
android.util.StateSet
android.util.SuperNotCalledException
+android.util.TimeUtils
android.util.TypedValue
android.util.Xml
android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
android.view.AbsSavedState
android.view.AbsSavedState$1
android.view.AbsSavedState$2
@@ -2017,11 +2364,12 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
-android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
android.view.FrameInfo
android.view.FrameMetrics
android.view.FrameMetricsObserver
@@ -2039,6 +2387,8 @@
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
android.view.IRotationWatcher
android.view.IRotationWatcher$Stub
android.view.IWindow
@@ -2067,7 +2417,6 @@
android.view.KeyCharacterMap
android.view.KeyCharacterMap$1
android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
android.view.KeyEvent
android.view.KeyEvent$1
android.view.KeyEvent$Callback
@@ -2095,7 +2444,6 @@
android.view.RenderNodeAnimator$1
android.view.RenderNodeAnimatorSetHelper
android.view.SearchEvent
-android.view.SoundEffectConstants
android.view.SubMenu
android.view.Surface
android.view.Surface$1
@@ -2103,7 +2451,6 @@
android.view.Surface$OutOfResourcesException
android.view.SurfaceControl
android.view.SurfaceControl$PhysicalDisplayInfo
-android.view.SurfaceHolder
android.view.SurfaceHolder$Callback
android.view.SurfaceHolder$Callback2
android.view.SurfaceSession
@@ -2112,6 +2459,7 @@
android.view.ThreadedRenderer
android.view.ThreadedRenderer$DrawCallbacks
android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
android.view.VelocityTracker
android.view.VelocityTracker$Estimator
android.view.View
@@ -2151,7 +2499,6 @@
android.view.View$TransformationInfo
android.view.View$UnsetPressedState
android.view.ViewConfiguration
-android.view.ViewDebug$HierarchyHandler
android.view.ViewGroup
android.view.ViewGroup$1
android.view.ViewGroup$2
@@ -2159,13 +2506,11 @@
android.view.ViewGroup$MarginLayoutParams
android.view.ViewGroup$OnHierarchyChangeListener
android.view.ViewGroup$TouchTarget
-android.view.ViewGroupOverlay
android.view.ViewManager
android.view.ViewOutlineProvider
android.view.ViewOutlineProvider$1
android.view.ViewOutlineProvider$2
android.view.ViewOutlineProvider$3
-android.view.ViewOverlay
android.view.ViewParent
android.view.ViewPropertyAnimator
android.view.ViewPropertyAnimator$1
@@ -2176,7 +2521,9 @@
android.view.ViewRootImpl$1
android.view.ViewRootImpl$4
android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
android.view.ViewRootImpl$ConsumeBatchedInputRunnable
android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -2200,12 +2547,12 @@
android.view.ViewRootImpl$ViewRootHandler
android.view.ViewRootImpl$W
android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
android.view.ViewStub
android.view.ViewTreeObserver
android.view.ViewTreeObserver$CopyOnWriteArray
android.view.ViewTreeObserver$CopyOnWriteArray$Access
android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
android.view.ViewTreeObserver$OnGlobalLayoutListener
android.view.ViewTreeObserver$OnPreDrawListener
android.view.ViewTreeObserver$OnScrollChangedListener
@@ -2223,6 +2570,7 @@
android.view.WindowInsets
android.view.WindowLeaked
android.view.WindowManager
+android.view.WindowManager$BadTokenException
android.view.WindowManager$LayoutParams
android.view.WindowManager$LayoutParams$1
android.view.WindowManagerGlobal
@@ -2235,7 +2583,8 @@
android.view.accessibility.AccessibilityManager$1
android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
+android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
android.view.accessibility.AccessibilityNodeInfo
android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
@@ -2249,12 +2598,8 @@
android.view.animation.AccelerateInterpolator
android.view.animation.AlphaAnimation
android.view.animation.Animation
-android.view.animation.Animation$1
-android.view.animation.Animation$2
-android.view.animation.Animation$3
android.view.animation.Animation$AnimationListener
android.view.animation.Animation$NoImagePreloadHolder
-android.view.animation.AnimationSet
android.view.animation.AnimationUtils
android.view.animation.AnimationUtils$1
android.view.animation.AnimationUtils$AnimationState
@@ -2263,10 +2608,17 @@
android.view.animation.Interpolator
android.view.animation.LinearInterpolator
android.view.animation.PathInterpolator
-android.view.animation.ScaleAnimation
android.view.animation.Transformation
-android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillManager
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutofillWindowPresenter
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.ComposingText
android.view.inputmethod.CursorAnchorInfo$Builder
@@ -2278,38 +2630,22 @@
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
android.view.inputmethod.InputMethodManager$FinishedInputEventCallback
android.view.inputmethod.InputMethodManager$H
-android.view.inputmethod.InputMethodManager$ImeInputEventSender
-android.view.inputmethod.InputMethodManager$PendingEvent
android.view.textclassifier.TextClassificationManager
-android.view.textservice.SpellCheckerSubtype
-android.view.textservice.SpellCheckerSubtype$1
android.view.textservice.TextServicesManager
-android.webkit.IWebViewUpdateService
-android.webkit.IWebViewUpdateService$Stub
-android.webkit.IWebViewUpdateService$Stub$Proxy
-android.webkit.MimeTypeMap
-android.webkit.WebView
android.webkit.WebViewFactory
android.webkit.WebViewFactory$MissingWebViewPackageException
-android.webkit.WebViewProviderResponse
-android.webkit.WebViewProviderResponse$1
android.widget.AbsListView
android.widget.AbsListView$AdapterDataSetObserver
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
android.widget.AbsSeekBar
android.widget.AbsSpinner
-android.widget.AbsoluteLayout
-android.widget.ActionMenuView$OnMenuItemClickListener
android.widget.Adapter
android.widget.AdapterView
android.widget.AdapterView$AdapterDataSetObserver
android.widget.AdapterView$OnItemClickListener
android.widget.AdapterView$OnItemSelectedListener
-android.widget.ArrayAdapter
android.widget.AutoCompleteTextView
android.widget.BaseAdapter
android.widget.Button
@@ -2317,7 +2653,6 @@
android.widget.Checkable
android.widget.CheckedTextView
android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
android.widget.EdgeEffect
android.widget.EditText
android.widget.Editor
@@ -2330,15 +2665,12 @@
android.widget.Editor$SpanController
android.widget.Editor$SuggestionHelper
android.widget.Editor$SuggestionHelper$SuggestionSpanComparator
-android.widget.Editor$TextRenderNode
android.widget.Editor$TextViewPositionListener
android.widget.Editor$UndoInputFilter
android.widget.Filter$FilterListener
android.widget.Filterable
-android.widget.ForwardingListener
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
-android.widget.HeaderViewListAdapter
android.widget.HorizontalScrollView
android.widget.ImageButton
android.widget.ImageView
@@ -2346,25 +2678,14 @@
android.widget.LinearLayout
android.widget.LinearLayout$LayoutParams
android.widget.ListAdapter
-android.widget.ListPopupWindow
-android.widget.ListPopupWindow$ListSelectorHider
-android.widget.ListPopupWindow$PopupDataSetObserver
-android.widget.ListPopupWindow$PopupScrollListener
-android.widget.ListPopupWindow$PopupTouchInterceptor
-android.widget.ListPopupWindow$ResizePopupRunnable
android.widget.ListView
android.widget.ListView$ArrowScrollFocusResult
android.widget.MultiAutoCompleteTextView
android.widget.OverScroller
android.widget.OverScroller$SplineOverScroller
android.widget.PopupWindow
-android.widget.PopupWindow$1
-android.widget.PopupWindow$2
-android.widget.PopupWindow$OnDismissListener
android.widget.ProgressBar
android.widget.ProgressBar$1
-android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
android.widget.RadioButton
android.widget.RatingBar
android.widget.RelativeLayout
@@ -2372,9 +2693,20 @@
android.widget.RelativeLayout$DependencyGraph$Node
android.widget.RelativeLayout$LayoutParams
android.widget.RemoteViews
+android.widget.RemoteViews$1
+android.widget.RemoteViews$2
+android.widget.RemoteViews$3
+android.widget.RemoteViews$Action
+android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$BitmapCache
+android.widget.RemoteViews$MemoryUsageCounter
+android.widget.RemoteViews$MutablePair
+android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RuntimeAction
+android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RtlSpacingHelper
android.widget.ScrollBarDrawable
android.widget.ScrollView
android.widget.Scroller
@@ -2389,43 +2721,6 @@
android.widget.TextView$CharWrapper
android.widget.TextView$Drawables
android.widget.TextView$OnEditorActionListener
-android.widget.TextView$SavedState
-android.widget.TextView$SavedState$1
-android.widget.ThemedSpinnerAdapter
-android.widget.Toast
-android.widget.Toolbar
-android.widget.Toolbar$1
-android.widget.Toolbar$2
-android.widget.Toolbar$LayoutParams
-android.widget.WrapperListAdapter
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
-com.android.i18n.phonenumbers.NumberParseException
-com.android.i18n.phonenumbers.PhoneNumberUtil
com.android.internal.R$styleable
com.android.internal.app.IAppOpsCallback
com.android.internal.app.IAppOpsCallback$Stub
@@ -2435,8 +2730,13 @@
com.android.internal.app.IBatteryStats
com.android.internal.app.IBatteryStats$Stub
com.android.internal.app.IBatteryStats$Stub$Proxy
+com.android.internal.app.IVoiceInteractionManagerService
+com.android.internal.app.IVoiceInteractionManagerService$Stub
com.android.internal.app.IVoiceInteractor
com.android.internal.app.IVoiceInteractor$Stub
+com.android.internal.appwidget.IAppWidgetService
+com.android.internal.appwidget.IAppWidgetService$Stub
+com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
com.android.internal.content.NativeLibraryHelper
com.android.internal.content.ReferrerIntent
com.android.internal.content.ReferrerIntent$1
@@ -2448,7 +2748,6 @@
com.android.internal.logging.AndroidConfig
com.android.internal.logging.AndroidHandler
com.android.internal.logging.AndroidHandler$1
-com.android.internal.logging.EventLogTags
com.android.internal.logging.MetricsLogger
com.android.internal.net.NetworkStatsFactory
com.android.internal.os.AndroidPrintStream
@@ -2456,7 +2755,10 @@
com.android.internal.os.BinderInternal$GcWatcher
com.android.internal.os.FuseAppLoop
com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
+com.android.internal.os.HandlerCaller
+com.android.internal.os.HandlerCaller$Callback
+com.android.internal.os.HandlerCaller$MyHandler
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
com.android.internal.os.PathClassLoaderFactory
@@ -2477,6 +2779,7 @@
com.android.internal.os.ZygoteServer
com.android.internal.policy.DecorContext
com.android.internal.policy.DecorView
+com.android.internal.policy.DecorView$ColorViewAttributes
com.android.internal.policy.DecorView$ColorViewState
com.android.internal.policy.PhoneFallbackEventHandler
com.android.internal.policy.PhoneLayoutInflater
@@ -2486,6 +2789,20 @@
com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
com.android.internal.policy.PhoneWindow$RotationWatcher
com.android.internal.policy.PhoneWindow$RotationWatcher$1
+com.android.internal.telecom.ITelecomService
+com.android.internal.telecom.ITelecomService$Stub
+com.android.internal.telephony.ICarrierConfigLoader
+com.android.internal.telephony.ICarrierConfigLoader$Stub
+com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
+com.android.internal.telephony.IOnSubscriptionsChangedListener
+com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
+com.android.internal.telephony.IPhoneStateListener
+com.android.internal.telephony.IPhoneStateListener$Stub
+com.android.internal.telephony.IPhoneSubInfo
+com.android.internal.telephony.IPhoneSubInfo$Stub
+com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
+com.android.internal.telephony.ISms
+com.android.internal.telephony.ISms$Stub
com.android.internal.telephony.ISub
com.android.internal.telephony.ISub$Stub
com.android.internal.telephony.ISub$Stub$Proxy
@@ -2495,19 +2812,31 @@
com.android.internal.telephony.ITelephonyRegistry
com.android.internal.telephony.ITelephonyRegistry$Stub
com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
+com.android.internal.telephony.IccCardConstants$State
com.android.internal.telephony.PhoneConstants$State
com.android.internal.textservice.ITextServicesManager
com.android.internal.textservice.ITextServicesManager$Stub
-com.android.internal.textservice.ITextServicesManager$Stub$Proxy
-com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.TransitionConstants
com.android.internal.util.ArrayUtils
+com.android.internal.util.AsyncChannel
+com.android.internal.util.AsyncChannel$DeathMonitor
+com.android.internal.util.BitUtils
+com.android.internal.util.ExponentiallyBucketedHistogram
com.android.internal.util.FastPrintWriter
com.android.internal.util.FastPrintWriter$DummyWriter
com.android.internal.util.FastXmlSerializer
com.android.internal.util.GrowingArrayUtils
+com.android.internal.util.IState
+com.android.internal.util.IntPair
com.android.internal.util.LineBreakBufferedWriter
com.android.internal.util.Preconditions
+com.android.internal.util.State
+com.android.internal.util.StateMachine
+com.android.internal.util.StateMachine$LogRec
+com.android.internal.util.StateMachine$LogRecords
+com.android.internal.util.StateMachine$SmHandler
+com.android.internal.util.StateMachine$SmHandler$HaltingState
+com.android.internal.util.StateMachine$SmHandler$QuittingState
+com.android.internal.util.StateMachine$SmHandler$StateInfo
com.android.internal.util.VirtualRefBasePtr
com.android.internal.util.XmlUtils
com.android.internal.util.XmlUtils$WriteMapCallback
@@ -2530,13 +2859,11 @@
com.android.internal.view.animation.HasNativeInterpolator
com.android.internal.view.animation.NativeInterpolatorFactory
com.android.internal.view.animation.NativeInterpolatorFactoryHelper
-com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
-com.android.internal.view.menu.MenuItemImpl
com.android.internal.view.menu.MenuPresenter$Callback
-com.android.internal.view.menu.ShowableListMenu
com.android.internal.widget.BackgroundFallback
com.android.internal.widget.DecorContentParent
+com.android.internal.widget.LockPatternUtils
com.android.okhttp.Address
com.android.okhttp.Authenticator
com.android.okhttp.CacheControl
@@ -2618,6 +2945,8 @@
com.android.okhttp.okio.BufferedSink
com.android.okhttp.okio.BufferedSource
com.android.okhttp.okio.ForwardingTimeout
+com.android.okhttp.okio.GzipSource
+com.android.okhttp.okio.InflaterSource
com.android.okhttp.okio.Okio
com.android.okhttp.okio.Okio$1
com.android.okhttp.okio.Okio$2
@@ -2718,6 +3047,7 @@
com.android.org.conscrypt.AbstractSessionContext
com.android.org.conscrypt.AbstractSessionContext$1
com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
com.android.org.conscrypt.ByteArray
com.android.org.conscrypt.CertBlacklist
com.android.org.conscrypt.CertificatePriorityComparator
@@ -2728,6 +3058,8 @@
com.android.org.conscrypt.EvpMdRef$MD5
com.android.org.conscrypt.EvpMdRef$SHA1
com.android.org.conscrypt.EvpMdRef$SHA256
+com.android.org.conscrypt.FileClientSessionCache
+com.android.org.conscrypt.FileClientSessionCache$Impl
com.android.org.conscrypt.Hex
com.android.org.conscrypt.JSSEProvider
com.android.org.conscrypt.KeyManagerFactoryImpl
@@ -2741,6 +3073,8 @@
com.android.org.conscrypt.NativeRef$EVP_MD_CTX
com.android.org.conscrypt.NativeRef$EVP_PKEY
com.android.org.conscrypt.OpenSSLBIOInputStream
+com.android.org.conscrypt.OpenSSLContextImpl
+com.android.org.conscrypt.OpenSSLContextImpl$TLSv12
com.android.org.conscrypt.OpenSSLECGroupContext
com.android.org.conscrypt.OpenSSLECPointContext
com.android.org.conscrypt.OpenSSLECPublicKey
@@ -2756,6 +3090,10 @@
com.android.org.conscrypt.OpenSSLRSAPublicKey
com.android.org.conscrypt.OpenSSLRandom
com.android.org.conscrypt.OpenSSLSessionImpl
+com.android.org.conscrypt.OpenSSLSignature
+com.android.org.conscrypt.OpenSSLSignature$EngineType
+com.android.org.conscrypt.OpenSSLSignature$RSAPKCS1Padding
+com.android.org.conscrypt.OpenSSLSignature$SHA1RSA
com.android.org.conscrypt.OpenSSLSocketFactoryImpl
com.android.org.conscrypt.OpenSSLSocketImpl
com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream
@@ -2770,9 +3108,11 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.Platform
+com.android.org.conscrypt.SSLClientSessionCache
com.android.org.conscrypt.SSLParametersImpl
com.android.org.conscrypt.SSLParametersImpl$AliasChooser
com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
com.android.org.conscrypt.ServerSessionContext
com.android.org.conscrypt.TrustManagerFactoryImpl
com.android.org.conscrypt.TrustManagerImpl
@@ -2781,8 +3121,7 @@
com.android.org.conscrypt.TrustedCertificateIndex
com.android.org.conscrypt.TrustedCertificateKeyStoreSpi
com.android.org.conscrypt.TrustedCertificateStore
-com.android.org.conscrypt.TrustedCertificateStore$1
-com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
com.android.org.conscrypt.ct.CTLogInfo
com.android.org.conscrypt.ct.CTLogStore
com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -2792,16 +3131,20 @@
com.android.org.conscrypt.ct.CTVerifier
com.android.org.conscrypt.ct.KnownLogs
com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
com.android.server.NetworkManagementSocketTagger
com.android.server.NetworkManagementSocketTagger$1
com.android.server.NetworkManagementSocketTagger$SocketTags
com.google.android.collect.Lists
com.google.android.collect.Maps
+com.google.android.gles_jni.EGLConfigImpl
+com.google.android.gles_jni.EGLContextImpl
+com.google.android.gles_jni.EGLDisplayImpl
com.google.android.gles_jni.EGLImpl
+com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
dalvik.annotation.optimization.CriticalNative
dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
dalvik.system.BaseDexClassLoader
dalvik.system.BaseDexClassLoader$Reporter
dalvik.system.BlockGuard
@@ -2816,6 +3159,7 @@
dalvik.system.CloseGuard$Reporter
dalvik.system.CloseGuard$Tracker
dalvik.system.DalvikLogHandler
+dalvik.system.DalvikLogging
dalvik.system.DexClassLoader
dalvik.system.DexFile
dalvik.system.DexFile$DFEnum
@@ -2824,7 +3168,6 @@
dalvik.system.DexPathList$NativeLibraryElement
dalvik.system.EmulatedStackFrame
dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
dalvik.system.PathClassLoader
dalvik.system.SocketTagger
dalvik.system.SocketTagger$1
@@ -2836,7 +3179,6 @@
java.io.BufferedInputStream
java.io.BufferedOutputStream
java.io.BufferedReader
-java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
java.io.CharArrayWriter
@@ -2854,6 +3196,7 @@
java.io.Externalizable
java.io.File
java.io.File$PathStatus
+java.io.File$TempDirectory
java.io.FileDescriptor
java.io.FileDescriptor$1
java.io.FileFilter
@@ -2863,7 +3206,6 @@
java.io.FileOutputStream
java.io.FileReader
java.io.FileSystem
-java.io.FileWriter
java.io.FilenameFilter
java.io.FilterInputStream
java.io.FilterOutputStream
@@ -2872,7 +3214,6 @@
java.io.InputStream
java.io.InputStreamReader
java.io.InterruptedIOException
-java.io.InvalidClassException
java.io.InvalidObjectException
java.io.ObjectInput
java.io.ObjectInputStream
@@ -2883,17 +3224,8 @@
java.io.ObjectInputStream$ValidationList
java.io.ObjectOutput
java.io.ObjectOutputStream
-java.io.ObjectOutputStream$BlockDataOutputStream
-java.io.ObjectOutputStream$HandleTable
java.io.ObjectOutputStream$PutField
-java.io.ObjectOutputStream$ReplaceTable
java.io.ObjectStreamClass
-java.io.ObjectStreamClass$2
-java.io.ObjectStreamClass$Caches
-java.io.ObjectStreamClass$EntryFuture
-java.io.ObjectStreamClass$FieldReflector
-java.io.ObjectStreamClass$FieldReflectorKey
-java.io.ObjectStreamClass$WeakClassKey
java.io.ObjectStreamConstants
java.io.ObjectStreamException
java.io.ObjectStreamField
@@ -2904,17 +3236,15 @@
java.io.PushbackInputStream
java.io.RandomAccessFile
java.io.Reader
-java.io.SequenceInputStream
java.io.Serializable
java.io.SerializablePermission
java.io.StringReader
java.io.StringWriter
-java.io.UTFDataFormatException
java.io.UnixFileSystem
java.io.UnsupportedEncodingException
java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
java.lang.AndroidHardcodedSystemProperties
@@ -2980,6 +3310,7 @@
java.lang.Long$LongCache
java.lang.Math
java.lang.Math$RandomNumberGeneratorHolder
+java.lang.NegativeArraySizeException
java.lang.NoClassDefFoundError
java.lang.NoSuchFieldError
java.lang.NoSuchFieldException
@@ -3036,6 +3367,7 @@
java.lang.UnsatisfiedLinkError
java.lang.UnsupportedOperationException
java.lang.VMClassLoader
+java.lang.VerifyError
java.lang.VirtualMachineError
java.lang.Void
java.lang.annotation.Annotation
@@ -3044,18 +3376,22 @@
java.lang.annotation.Inherited
java.lang.annotation.Retention
java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
java.lang.invoke.MethodHandle
java.lang.invoke.MethodHandleImpl
java.lang.invoke.MethodHandleImpl$HandleInfo
java.lang.invoke.MethodHandleInfo
java.lang.invoke.MethodHandleStatics
java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
java.lang.invoke.MethodType
java.lang.invoke.MethodType$ConcurrentWeakInternSet
java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
java.lang.invoke.MethodTypeForm
java.lang.invoke.Transformers$BindTo
java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
java.lang.invoke.Transformers$Spreader
java.lang.invoke.Transformers$Transformer
java.lang.invoke.Transformers$VarargsCollector
@@ -3074,6 +3410,7 @@
java.lang.reflect.Executable
java.lang.reflect.Executable$GenericInfo
java.lang.reflect.Field
+java.lang.reflect.GenericArrayType
java.lang.reflect.GenericDeclaration
java.lang.reflect.InvocationHandler
java.lang.reflect.InvocationTargetException
@@ -3093,12 +3430,14 @@
java.lang.reflect.Proxy$ProxyClassFactory
java.lang.reflect.Type
java.lang.reflect.TypeVariable
+java.lang.reflect.UndeclaredThrowableException
java.lang.reflect.WeakCache
java.lang.reflect.WeakCache$CacheKey
java.lang.reflect.WeakCache$CacheValue
java.lang.reflect.WeakCache$Factory
java.lang.reflect.WeakCache$LookupValue
java.lang.reflect.WeakCache$Value
+java.lang.reflect.WildcardType
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
@@ -3127,7 +3466,6 @@
java.net.NetworkInterface
java.net.Parts
java.net.PlainSocketImpl
-java.net.ProtocolException
java.net.Proxy
java.net.Proxy$Type
java.net.ProxySelector
@@ -3150,7 +3488,6 @@
java.net.URISyntaxException
java.net.URL
java.net.URLConnection
-java.net.URLDecoder
java.net.URLEncoder
java.net.URLStreamHandler
java.net.URLStreamHandlerFactory
@@ -3195,6 +3532,7 @@
java.nio.channels.InterruptibleChannel
java.nio.channels.MulticastChannel
java.nio.channels.NetworkChannel
+java.nio.channels.OverlappingFileLockException
java.nio.channels.ReadableByteChannel
java.nio.channels.ScatteringByteChannel
java.nio.channels.SeekableByteChannel
@@ -3238,7 +3576,6 @@
java.security.KeyFactory
java.security.KeyFactorySpi
java.security.KeyManagementException
-java.security.KeyPair
java.security.KeyStore
java.security.KeyStore$1
java.security.KeyStoreException
@@ -3318,11 +3655,11 @@
java.security.spec.EllipticCurve
java.security.spec.EncodedKeySpec
java.security.spec.InvalidKeySpecException
+java.security.spec.InvalidParameterSpecException
java.security.spec.KeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
java.text.AttributedCharacterIterator$Attribute
-java.text.CalendarBuilder
java.text.CharacterIterator
java.text.DateFormat
java.text.DateFormat$Field
@@ -3343,16 +3680,16 @@
java.text.SimpleDateFormat
java.text.StringCharacterIterator
java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractList$Itr
@@ -3466,6 +3803,7 @@
java.util.Formatter$FormatSpecifier
java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatString
+java.util.FormatterClosedException
java.util.GregorianCalendar
java.util.HashMap
java.util.HashMap$EntryIterator
@@ -3482,7 +3820,6 @@
java.util.Hashtable$Enumerator
java.util.Hashtable$HashtableEntry
java.util.IdentityHashMap
-java.util.IdentityHashMap$IdentityHashMapIterator
java.util.IdentityHashMap$KeySet
java.util.IllegalFormatException
java.util.IllformedLocaleException
@@ -3509,6 +3846,7 @@
java.util.Locale$FilteringMode
java.util.Locale$LanguageRange
java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
java.util.Map
java.util.Map$Entry
java.util.MissingResourceException
@@ -3519,6 +3857,7 @@
java.util.PrimitiveIterator
java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
+java.util.PriorityQueue$Itr
java.util.Properties
java.util.Properties$LineReader
java.util.Queue
@@ -3528,7 +3867,6 @@
java.util.RegularEnumSet
java.util.ResourceBundle
java.util.ResourceBundle$1
-java.util.Scanner
java.util.Set
java.util.SimpleTimeZone
java.util.SortedMap
@@ -3551,10 +3889,15 @@
java.util.TimSort
java.util.TimeZone
java.util.TreeMap
+java.util.TreeMap$AscendingSubMap
+java.util.TreeMap$AscendingSubMap$AscendingEntrySetView
java.util.TreeMap$EntryIterator
java.util.TreeMap$EntrySet
java.util.TreeMap$KeyIterator
java.util.TreeMap$KeySet
+java.util.TreeMap$NavigableSubMap
+java.util.TreeMap$NavigableSubMap$EntrySetView
+java.util.TreeMap$NavigableSubMap$SubMapIterator
java.util.TreeMap$PrivateEntryIterator
java.util.TreeMap$TreeMapEntry
java.util.TreeMap$ValueIterator
@@ -3563,6 +3906,7 @@
java.util.UUID
java.util.UUID$Holder
java.util.Vector
+java.util.Vector$1
java.util.Vector$Itr
java.util.WeakHashMap
java.util.WeakHashMap$Entry
@@ -3571,8 +3915,9 @@
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
java.util.concurrent.AbstractExecutorService
+java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
java.util.concurrent.CancellationException
@@ -3625,6 +3970,8 @@
java.util.concurrent.ConcurrentHashMap$TreeNode
java.util.concurrent.ConcurrentHashMap$ValueIterator
java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentLinkedQueue$Node
java.util.concurrent.ConcurrentMap
@@ -3673,6 +4020,7 @@
java.util.concurrent.ThreadLocalRandom
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$AbortPolicy
+java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
java.util.concurrent.ThreadPoolExecutor$Worker
java.util.concurrent.TimeUnit
java.util.concurrent.TimeUnit$1
@@ -3687,6 +4035,7 @@
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong
java.util.concurrent.atomic.AtomicReference
+java.util.concurrent.atomic.AtomicReferenceArray
java.util.concurrent.atomic.AtomicReferenceFieldUpdater
java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
java.util.concurrent.locks.AbstractOwnableSynchronizer
@@ -3706,12 +4055,15 @@
java.util.concurrent.locks.ReentrantReadWriteLock$Sync
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.BinaryOperator
java.util.function.Consumer
java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
java.util.function.Function
java.util.function.IntBinaryOperator
java.util.function.IntConsumer
@@ -3751,6 +4103,7 @@
java.util.logging.LogManager$LoggerWeakRef
java.util.logging.LogManager$RootLogger
java.util.logging.LogManager$SystemLoggerContext
+java.util.logging.LogRecord
java.util.logging.Logger
java.util.logging.Logger$LoggerBundle
java.util.logging.LoggingPermission
@@ -3762,12 +4115,24 @@
java.util.regex.Matcher
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
+java.util.stream.AbstractPipeline
java.util.stream.BaseStream
java.util.stream.DoubleStream
java.util.stream.IntStream
java.util.stream.LongStream
+java.util.stream.PipelineHelper
+java.util.stream.ReferencePipeline
+java.util.stream.ReferencePipeline$Head
+java.util.stream.Sink
+java.util.stream.Sink$ChainedReference
java.util.stream.Stream
+java.util.stream.StreamOpFlag
+java.util.stream.StreamOpFlag$MaskBuilder
+java.util.stream.StreamOpFlag$Type
+java.util.stream.StreamShape
java.util.stream.StreamSupport
+java.util.stream.TerminalOp
+java.util.stream.TerminalSink
java.util.zip.Adler32
java.util.zip.CRC32
java.util.zip.CheckedInputStream
@@ -3790,13 +4155,26 @@
java.util.zip.ZipUtils
javax.crypto.BadPaddingException
javax.crypto.Cipher
+javax.crypto.Cipher$CipherSpiAndProvider
+javax.crypto.Cipher$InitParams
+javax.crypto.Cipher$InitType
+javax.crypto.Cipher$NeedToSet
+javax.crypto.Cipher$SpiAndProviderUpdater
+javax.crypto.Cipher$Transform
+javax.crypto.CipherSpi
javax.crypto.IllegalBlockSizeException
+javax.crypto.JceSecurity
javax.crypto.NoSuchPaddingException
javax.crypto.SecretKey
+javax.crypto.ShortBufferException
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.SecretKeySpec
javax.microedition.khronos.egl.EGL
javax.microedition.khronos.egl.EGL10
+javax.microedition.khronos.egl.EGLConfig
+javax.microedition.khronos.egl.EGLContext
+javax.microedition.khronos.egl.EGLDisplay
+javax.microedition.khronos.egl.EGLSurface
javax.microedition.khronos.opengles.GL
javax.microedition.khronos.opengles.GL10
javax.microedition.khronos.opengles.GL10Ext
@@ -3828,6 +4206,7 @@
javax.net.ssl.SSLSessionContext
javax.net.ssl.SSLSocket
javax.net.ssl.SSLSocketFactory
+javax.net.ssl.SSLSocketFactory$1
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.TrustManagerFactory$1
@@ -3865,11 +4244,11 @@
libcore.io.IoTracker$Mode
libcore.io.IoUtils
libcore.io.Libcore
+libcore.io.Linux
libcore.io.Memory
libcore.io.MemoryMappedFile
libcore.io.NioBufferIterator
libcore.io.Os
-libcore.io.Posix
libcore.net.NetworkSecurityPolicy
libcore.net.NetworkSecurityPolicy$DefaultNetworkSecurityPolicy
libcore.net.UriCodec
@@ -3879,9 +4258,11 @@
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
+libcore.reflect.GenericArrayTypeImpl
libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
libcore.reflect.ListOfTypes
+libcore.reflect.ListOfVariables
+libcore.reflect.ParameterizedTypeImpl
libcore.reflect.Types
libcore.util.BasicLruCache
libcore.util.CharsetUtils
@@ -3890,10 +4271,18 @@
libcore.util.NativeAllocationRegistry
libcore.util.NativeAllocationRegistry$CleanerRunner
libcore.util.NativeAllocationRegistry$CleanerThunk
+libcore.util.TimeZoneDataFiles
libcore.util.ZoneInfo
+libcore.util.ZoneInfo$CheckedArithmeticException
+libcore.util.ZoneInfo$OffsetInterval
+libcore.util.ZoneInfo$WallTime
libcore.util.ZoneInfoDB
libcore.util.ZoneInfoDB$TzData
libcore.util.ZoneInfoDB$TzData$1
+org.apache.commons.logging.Log
+org.apache.commons.logging.LogFactory
+org.apache.commons.logging.impl.Jdk14Logger
+org.apache.commons.logging.impl.WeakHashtable
org.apache.harmony.dalvik.NativeTestTarget
org.apache.harmony.dalvik.ddmc.Chunk
org.apache.harmony.dalvik.ddmc.ChunkHandler
@@ -3904,21 +4293,62 @@
org.apache.harmony.xml.ExpatParser
org.apache.http.Header
org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
+org.apache.http.HttpException
+org.apache.http.HttpHost
org.apache.http.HttpMessage
org.apache.http.HttpRequest
+org.apache.http.HttpRequestInterceptor
org.apache.http.HttpResponse
+org.apache.http.ProtocolException
org.apache.http.ProtocolVersion
org.apache.http.StatusLine
org.apache.http.client.HttpClient
+org.apache.http.client.ResponseHandler
org.apache.http.client.methods.HttpUriRequest
+org.apache.http.client.params.HttpClientParams
+org.apache.http.conn.ClientConnectionManager
+org.apache.http.conn.ClientConnectionOperator
+org.apache.http.conn.ClientConnectionRequest
org.apache.http.conn.ConnectTimeoutException
+org.apache.http.conn.ConnectionReleaseTrigger
+org.apache.http.conn.params.ConnManagerPNames
+org.apache.http.conn.params.ConnManagerParams
+org.apache.http.conn.params.ConnManagerParams$1
+org.apache.http.conn.params.ConnPerRoute
+org.apache.http.conn.scheme.LayeredSocketFactory
+org.apache.http.conn.scheme.PlainSocketFactory
+org.apache.http.conn.scheme.Scheme
+org.apache.http.conn.scheme.SchemeRegistry
+org.apache.http.conn.scheme.SocketFactory
+org.apache.http.conn.ssl.AbstractVerifier
+org.apache.http.conn.ssl.AllowAllHostnameVerifier
+org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
+org.apache.http.conn.ssl.SSLSocketFactory
+org.apache.http.conn.ssl.StrictHostnameVerifier
+org.apache.http.conn.ssl.X509HostnameVerifier
org.apache.http.entity.AbstractHttpEntity
+org.apache.http.impl.client.AbstractHttpClient
+org.apache.http.impl.client.DefaultHttpClient
+org.apache.http.impl.conn.DefaultClientConnectionOperator
+org.apache.http.impl.conn.IdleConnectionHandler
+org.apache.http.impl.conn.tsccm.AbstractConnPool
+org.apache.http.impl.conn.tsccm.ConnPoolByRoute
+org.apache.http.impl.conn.tsccm.RefQueueHandler
+org.apache.http.impl.conn.tsccm.RefQueueWorker
+org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
org.apache.http.message.AbstractHttpMessage
org.apache.http.message.BasicHeader
org.apache.http.message.BasicHttpResponse
org.apache.http.message.BasicStatusLine
org.apache.http.message.HeaderGroup
+org.apache.http.params.AbstractHttpParams
+org.apache.http.params.BasicHttpParams
+org.apache.http.params.CoreConnectionPNames
+org.apache.http.params.CoreProtocolPNames
+org.apache.http.params.HttpConnectionParams
+org.apache.http.params.HttpParams
+org.apache.http.params.HttpProtocolParams
+org.apache.http.protocol.HttpContext
org.ccil.cowan.tagsoup.AttributesImpl
org.ccil.cowan.tagsoup.AutoDetector
org.ccil.cowan.tagsoup.Element
@@ -3942,12 +4372,24 @@
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.xml.sax.Attributes
+org.xml.sax.ContentHandler
+org.xml.sax.DTDHandler
+org.xml.sax.EntityResolver
+org.xml.sax.ErrorHandler
+org.xml.sax.InputSource
+org.xml.sax.Locator
org.xml.sax.SAXException
+org.xml.sax.SAXNotRecognizedException
+org.xml.sax.SAXNotSupportedException
+org.xml.sax.XMLReader
+org.xml.sax.helpers.DefaultHandler
org.xmlpull.v1.XmlPullParser
org.xmlpull.v1.XmlPullParserException
org.xmlpull.v1.XmlSerializer
sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
sun.misc.Cleaner
sun.misc.CompoundEnumeration
sun.misc.FDBigInteger
@@ -3984,7 +4426,6 @@
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
sun.nio.ch.FileDispatcher
@@ -4004,6 +4445,10 @@
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
sun.nio.ch.SocketChannelImpl
+sun.nio.ch.Util
+sun.nio.ch.Util$1
+sun.nio.ch.Util$BufferCache
+sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
sun.nio.cs.StreamDecoder
sun.nio.cs.StreamEncoder
@@ -4037,14 +4482,15 @@
sun.security.provider.certpath.PKIXMasterCertPathValidator
sun.security.provider.certpath.PolicyChecker
sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
sun.security.util.AlgorithmDecomposer
sun.security.util.BitArray
sun.security.util.ByteArrayLexOrder
sun.security.util.ByteArrayTagOrder
sun.security.util.Cache
sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
sun.security.util.Debug
sun.security.util.DerEncoder
sun.security.util.DerIndefLenConverter
@@ -4053,9 +4499,10 @@
sun.security.util.DerOutputStream
sun.security.util.DerValue
sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
sun.security.util.KeyUtil
sun.security.util.Length
sun.security.util.MemoryCache
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index debb157..564d135 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -241,6 +241,20 @@
// List of events
repeated StaEvent sta_event_list = 52;
+
+ // Total number of times WiFi HAL crashed.
+ optional int32 num_hal_crashes = 53;
+
+ // Total number of times WiFicond crashed.
+ optional int32 num_wificond_crashes = 54;
+
+ // Indicates the number of times an error was encountered in
+ // Wifi HAL when wifi was turned on.
+ optional int32 num_wifi_on_failure_due_to_hal = 55;
+
+ // Indicates the number of times an error was encountered in
+ // Wificond when wifi was turned on.
+ optional int32 num_wifi_on_failure_due_to_wificond = 56;
}
// Information that gets logged for every WiFi connection.
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 93b5ed5..03f25bf 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -711,10 +711,13 @@
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
}
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (sVerbose) Slog.v(TAG, "onChange(): uri=" + uri + ", userId=" + userId);
synchronized (mLock) {
updateCachedServiceLocked(userId);
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 2cb0bd5..7abaf7f 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -51,7 +51,6 @@
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.LocalLog;
import android.util.Slog;
import android.util.SparseArray;
@@ -99,6 +98,12 @@
*/
private boolean mDisabled;
+ /**
+ * Caches whether the setup completed for the current user.
+ */
+ @GuardedBy("mLock")
+ private boolean mSetupComplete;
+
private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
switch (msg.what) {
case MSG_SERVICE_SAVE:
@@ -171,6 +176,12 @@
}
}
+ private boolean isSetupCompletedLocked() {
+ final String setupComplete = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId);
+ return "1".equals(setupComplete);
+ }
+
private String getComponentNameFromSettings() {
return Settings.Secure.getStringForUser(
mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
@@ -178,6 +189,12 @@
void updateLocked(boolean disabled) {
final boolean wasEnabled = isEnabled();
+ if (sVerbose) {
+ Slog.v(TAG, "updateLocked(u=" + mUserId + "): wasEnabled=" + wasEnabled
+ + ", mSetupComplete= " + mSetupComplete
+ + ", disabled=" + disabled + ", mDisabled=" + mDisabled);
+ }
+ mSetupComplete = isSetupCompletedLocked();
mDisabled = disabled;
ComponentName serviceComponent = null;
ServiceInfo serviceInfo = null;
@@ -199,8 +216,9 @@
} else {
mInfo = null;
}
- if (wasEnabled != isEnabled()) {
- if (!isEnabled()) {
+ final boolean isEnabled = isEnabled();
+ if (wasEnabled != isEnabled) {
+ if (!isEnabled) {
final int sessionCount = mSessions.size();
for (int i = sessionCount - 1; i >= 0; i--) {
final Session session = mSessions.valueAt(i);
@@ -534,6 +552,7 @@
pw.print(prefix); pw.print("Default component: ");
pw.println(mContext.getString(R.string.config_defaultAutofillService));
pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
+ pw.print(prefix); pw.print("Setup complete: "); pw.println(mSetupComplete);
pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune);
final int size = mSessions.size();
@@ -617,7 +636,7 @@
}
boolean isEnabled() {
- return mInfo != null && !mDisabled;
+ return mSetupComplete && mInfo != null && !mDisabled;
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 0281f73..86e32e0 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -16,7 +16,10 @@
package com.android.server.autofill;
+import android.annotation.Nullable;
import android.os.Bundle;
+import android.util.ArraySet;
+import android.view.autofill.AutofillId;
import java.util.Arrays;
import java.util.Objects;
@@ -68,4 +71,15 @@
append(builder, bundle);
return builder.toString();
}
+
+ @Nullable
+ static AutofillId[] toArray(@Nullable ArraySet<AutofillId> set) {
+ if (set == null) return null;
+
+ final AutofillId[] array = new AutofillId[set.size()];
+ for (int i = 0; i < set.size(); i++) {
+ array[i] = set.valueAt(i);
+ }
+ return array;
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 0122301..bad8dcf 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -28,6 +28,7 @@
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sPartitionMaxCount;
import static com.android.server.autofill.Helper.sVerbose;
+import static com.android.server.autofill.Helper.toArray;
import static com.android.server.autofill.ViewState.STATE_AUTOFILLED;
import static com.android.server.autofill.ViewState.STATE_RESTARTED_SESSION;
@@ -57,6 +58,7 @@
import android.service.autofill.SaveInfo;
import android.service.autofill.SaveRequest;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.view.autofill.AutofillId;
@@ -172,13 +174,13 @@
public void send(int resultCode, Bundle resultData) throws RemoteException {
final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
if (structure == null) {
- Slog.wtf(TAG, "no assist structure");
+ Slog.e(TAG, "No assist structure - app might have crashed providing it");
return;
}
final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS);
if (receiverExtras == null) {
- Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver");
+ Slog.e(TAG, "No receiver extras - app might have crashed providing it");
return;
}
@@ -680,7 +682,6 @@
removeSelf();
return;
}
- resetViewStatesLocked(dataset, ViewState.STATE_WAITING_DATASET_AUTH);
}
final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT);
@@ -1139,15 +1140,20 @@
// Only track the views of the last response as only those are reported back to the
// service, see #showSaveLocked
- ArrayList<AutofillId> trackedViews = new ArrayList<>();
+ final FillResponse response = mResponses.valueAt(getLastResponseIndex());
+
+ ArraySet<AutofillId> trackedViews = null;
boolean saveOnAllViewsInvisible = false;
- SaveInfo saveInfo = mResponses.valueAt(getLastResponseIndex()).getSaveInfo();
+ final SaveInfo saveInfo = response.getSaveInfo();
if (saveInfo != null) {
saveOnAllViewsInvisible =
(saveInfo.getFlags() & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
// We only need to track views if we want to save once they become invisible.
if (saveOnAllViewsInvisible) {
+ if (trackedViews == null) {
+ trackedViews = new ArraySet<>();
+ }
if (saveInfo.getRequiredIds() != null) {
Collections.addAll(trackedViews, saveInfo.getRequiredIds());
}
@@ -1158,8 +1164,32 @@
}
}
+ // Must also track that are part of datasets, otherwise the FillUI won't be hidden when
+ // they go away (if they're not savable).
+
+ final ArrayList<Dataset> datasets = response.getDatasets();
+ ArraySet<AutofillId> fillableIds = null;
+ if (datasets != null) {
+ for (int i = 0; i < datasets.size(); i++) {
+ final Dataset dataset = datasets.get(i);
+ final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
+ if (fieldIds == null) continue;
+
+ for (int j = 0; j < fieldIds.size(); j++) {
+ final AutofillId id = fieldIds.get(j);
+ if (trackedViews == null || !trackedViews.contains(id)) {
+ fillableIds = ArrayUtils.add(fillableIds, id);
+ }
+ }
+ }
+ }
+
try {
- mClient.setTrackedViews(id, trackedViews, saveOnAllViewsInvisible);
+ if (sVerbose) {
+ Slog.v(TAG, "updateTrackedIdsLocked(): " + trackedViews + " => " + fillableIds);
+ }
+ mClient.setTrackedViews(id, toArray(trackedViews), saveOnAllViewsInvisible,
+ toArray(fillableIds));
} catch (RemoteException e) {
Slog.w(TAG, "Cannot set tracked ids", e);
}
@@ -1331,7 +1361,6 @@
}
// ...or handle authentication.
- // TODO(b/37424539): proper implementation
mService.setDatasetAuthenticationSelected(dataset.getId());
setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false);
final Intent fillInIntent = createAuthFillInIntent(
@@ -1424,21 +1453,36 @@
}
try {
if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+
// Skip null values as a null values means no change
final int entryCount = dataset.getFieldIds().size();
final List<AutofillId> ids = new ArrayList<>(entryCount);
final List<AutofillValue> values = new ArrayList<>(entryCount);
+ boolean waitingDatasetAuth = false;
for (int i = 0; i < entryCount; i++) {
if (dataset.getFieldValues().get(i) == null) {
continue;
}
- ids.add(dataset.getFieldIds().get(i));
+ final AutofillId viewId = dataset.getFieldIds().get(i);
+ ids.add(viewId);
values.add(dataset.getFieldValues().get(i));
+ final ViewState viewState = mViewStates.get(viewId);
+ if (viewState != null
+ && (viewState.getState() & ViewState.STATE_WAITING_DATASET_AUTH) != 0) {
+ if (sVerbose) {
+ Slog.v(TAG, "autofillApp(): view " + viewId + " waiting auth");
+ }
+ waitingDatasetAuth = true;
+ viewState.resetState(ViewState.STATE_WAITING_DATASET_AUTH);
+ }
}
if (!ids.isEmpty()) {
+ if (waitingDatasetAuth) {
+ hideFillUiIfOwnedByMe();
+ }
mClient.autofill(id, ids, values);
+ setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
}
- setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
} catch (RemoteException e) {
Slog.w(TAG, "Error autofilling activity: " + e);
}
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index f87fa19..8a52c96 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -174,7 +174,7 @@
* fill UI is ready to be displayed (i.e. when response and bounds are set).
*/
void maybeCallOnFillReady() {
- if ((mState & (STATE_AUTOFILLED | STATE_WAITING_DATASET_AUTH)) != 0) {
+ if ((mState & STATE_AUTOFILLED) != 0) {
if (sDebug) Slog.d(TAG, "Ignoring UI for " + id + " on " + getStateAsString());
return;
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7ae4138..4b12bc4 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -175,6 +175,9 @@
implements PendingIntent.OnFinished {
private static final String TAG = ConnectivityService.class.getSimpleName();
+ public static final String DIAG_ARG = "--diag";
+ public static final String SHORT_ARG = "--short";
+
private static final boolean DBG = true;
private static final boolean VDBG = false;
@@ -1852,7 +1855,7 @@
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- if (argsContain(args, "--diag")) {
+ if (argsContain(args, DIAG_ARG)) {
dumpNetworkDiagnostics(pw);
return;
}
@@ -1938,7 +1941,7 @@
pw.decreaseIndent();
}
- if (argsContain(args, "--short") == false) {
+ if (argsContain(args, SHORT_ARG) == false) {
pw.println();
synchronized (mValidationLogs) {
pw.println("mValidationLogs (most recent first):");
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 9e054c3..3460419 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1727,7 +1727,7 @@
record.mReceiver.mIdentity.mUid,
record.mReceiver.mIdentity.mPackageName,
record.mReceiver.mAllowedResolutionLevel)) {
- LocationRequest locationRequest = record.mRequest;
+ LocationRequest locationRequest = record.mRealRequest;
long interval = locationRequest.getInterval();
if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
@@ -1740,6 +1740,7 @@
}
}
+ record.mRequest = locationRequest;
providerRequest.locationRequests.add(locationRequest);
if (interval < providerRequest.interval) {
providerRequest.reportLocation = true;
@@ -1832,7 +1833,8 @@
private class UpdateRecord {
final String mProvider;
- final LocationRequest mRequest;
+ final LocationRequest mRealRequest; // original request from client
+ LocationRequest mRequest; // possibly throttled version of the request
final Receiver mReceiver;
boolean mIsForegroundUid;
Location mLastFixBroadcast;
@@ -1843,6 +1845,7 @@
*/
UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
mProvider = provider;
+ mRealRequest = request;
mRequest = request;
mReceiver = receiver;
mIsForegroundUid = isImportanceForeground(
@@ -1892,7 +1895,7 @@
public String toString() {
return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
+ "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground" : " background")
- + ")" + " " + mRequest + "]";
+ + ")" + " " + mRealRequest + "]";
}
}
@@ -2533,7 +2536,7 @@
}
// Check whether sufficient time has passed
- long minTime = record.mRequest.getFastestInterval();
+ long minTime = record.mRealRequest.getFastestInterval();
long delta = (loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos())
/ NANOS_PER_MILLI;
if (delta < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
@@ -2541,7 +2544,7 @@
}
// Check whether sufficient distance has been traveled
- double minDistance = record.mRequest.getSmallestDisplacement();
+ double minDistance = record.mRealRequest.getSmallestDisplacement();
if (minDistance > 0.0) {
if (loc.distanceTo(lastLoc) <= minDistance) {
return false;
@@ -2549,12 +2552,12 @@
}
// Check whether sufficient number of udpates is left
- if (record.mRequest.getNumUpdates() <= 0) {
+ if (record.mRealRequest.getNumUpdates() <= 0) {
return false;
}
// Check whether the expiry date has passed
- return record.mRequest.getExpireAt() >= now;
+ return record.mRealRequest.getExpireAt() >= now;
}
private void handleLocationChangedLocked(Location location, boolean passive) {
@@ -2672,7 +2675,7 @@
Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
receiverDead = true;
}
- r.mRequest.decrementNumUpdates();
+ r.mRealRequest.decrementNumUpdates();
}
}
@@ -2688,7 +2691,7 @@
}
// track expired records
- if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) {
+ if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
if (deadUpdateRecords == null) {
deadUpdateRecords = new ArrayList<>();
}
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index f7a682a..773a1ee 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -161,7 +161,7 @@
*/
private static final int[] SYSTEM_CREDENTIAL_UIDS = {
Process.WIFI_UID, Process.VPN_UID,
- Process.ROOT_UID };
+ Process.ROOT_UID, Process.SYSTEM_UID };
// This class manages life cycle events for encrypted users on File Based Encryption (FBE)
// devices. The most basic of these is to show/hide notifications about missing features until
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index e3ebf4d..45f9025 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -16,12 +16,15 @@
package com.android.server;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -33,6 +36,7 @@
import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.app.ResolverActivity;
@@ -68,6 +72,19 @@
private PinnerHandler mPinnerHandler = null;
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // If this user's camera app has been updated, update pinned files accordingly.
+ if (intent.getAction() == Intent.ACTION_PACKAGE_REPLACED) {
+ Uri packageUri = intent.getData();
+ String packageName = packageUri.getSchemeSpecificPart();
+ ArraySet<String> updatedPackages = new ArraySet<>();
+ updatedPackages.add(packageName);
+ update(updatedPackages);
+ }
+ }
+ };
public PinnerService(Context context) {
super(context);
@@ -76,6 +93,11 @@
mShouldPinCamera = context.getResources().getBoolean(
com.android.internal.R.bool.config_pinnerCameraApp);
mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ filter.addDataScheme("package");
+ mContext.registerReceiver(mBroadcastReceiver, filter);
}
@Override
@@ -85,6 +107,7 @@
}
mBinderService = new BinderService();
publishBinderService("pinner", mBinderService);
+ publishLocalService(PinnerService.class, this);
mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
@@ -103,6 +126,20 @@
}
/**
+ * Update the currently pinned files.
+ * Specifically, this only updates camera pinning.
+ * The other files pinned in onStart will not need to be updated.
+ */
+ public void update(ArraySet<String> updatedPackages) {
+ ApplicationInfo cameraInfo = getCameraInfo(UserHandle.USER_SYSTEM);
+ if (cameraInfo != null && updatedPackages.contains(cameraInfo.packageName)) {
+ Slog.i(TAG, "Updating pinned files.");
+ mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
+ .sendToTarget();
+ }
+ }
+
+ /**
* Handler for on start pinning message
*/
private void handlePinOnStart() {
@@ -202,13 +239,10 @@
return cameraResolveInfo.activityInfo.applicationInfo;
}
+ /**
+ * If the camera app is already pinned, unpin and repin it.
+ */
private boolean pinCamera(int userHandle){
- //we may have already pinned a camera app. If we've pinned this
- //camera app, we're done. otherwise, unpin and pin the new app
- if (alreadyPinned(userHandle)){
- return true;
- }
-
ApplicationInfo cameraInfo = getCameraInfo(userHandle);
if (cameraInfo == null) {
return false;
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 678ae38..03e9dd2 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -221,12 +221,19 @@
long[] clickEffectTimings = getLongIntArray(context.getResources(),
com.android.internal.R.array.config_virtualKeyVibePattern);
- VibrationEffect clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1);
+ VibrationEffect clickEffect;
+ if (clickEffectTimings.length == 0) {
+ clickEffect = null;
+ } else if (clickEffectTimings.length == 1) {
+ clickEffect = VibrationEffect.createOneShot(
+ clickEffectTimings[0], VibrationEffect.DEFAULT_AMPLITUDE);
+ } else {
+ clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1);
+ }
VibrationEffect doubleClickEffect = VibrationEffect.createWaveform(
new long[] {0, 30, 100, 30} /*timings*/, -1);
mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect };
-
}
public void systemReady() {
@@ -695,7 +702,7 @@
}
}
final int id = prebaked.getId();
- if (id < 0 || id >= mFallbackEffects.length) {
+ if (id < 0 || id >= mFallbackEffects.length || mFallbackEffects[id] == null) {
Slog.w(TAG, "Failed to play prebaked effect, no fallback");
return 0;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index bb6637d..68c92a8 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8447,8 +8447,8 @@
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(callingPid);
}
- if (proc != null && proc.curProcState
- < ActivityManager.PROCESS_STATE_RECEIVER) {
+ if (proc != null &&
+ !ActivityManager.isProcStateBackground(proc.curProcState)) {
// Whoever is instigating this is in the foreground, so we will allow it
// to go through.
return ActivityManager.APP_START_MODE_NORMAL;
@@ -10589,8 +10589,7 @@
mStackSupervisor.getStack(PINNED_STACK_ID);
if (pinnedStack != null) {
pinnedStack.animateResizePinnedStack(null /* sourceHintBounds */,
- destBounds, animationDuration,
- false /* schedulePipModeChangedOnAnimationEnd */);
+ destBounds, animationDuration, false /* fromFullscreen */);
}
} else {
throw new IllegalArgumentException("Stack: " + stackId
@@ -13546,7 +13545,9 @@
return;
}
if (pr.hasTopUi != hasTopUi) {
- Slog.i(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ if (DEBUG_OOM_ADJ) {
+ Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ }
pr.hasTopUi = hasTopUi;
changed = true;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 55ec3b0..5636e19 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -284,7 +284,6 @@
boolean visible; // does this activity's window need to be shown?
boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard
// might hide this activity?
- private boolean mLastSetWindowVisibility; // The last window visibility state that was set.
private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client
// process that it is hidden.
boolean sleeping; // have we told the activity to sleep?
@@ -1589,10 +1588,6 @@
}
void setVisibility(boolean visible) {
- if (mLastSetWindowVisibility == visible) {
- return;
- }
- mLastSetWindowVisibility = visible;
mWindowContainerController.setVisibility(visible, mDeferHidingClient);
mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this, visible);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 7df9b69..9db957c 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -244,7 +244,7 @@
static final int REMOVE_TASK_MODE_MOVING = 1;
// Similar to {@link #REMOVE_TASK_MODE_MOVING} and the task will be added to the top of its new
// stack and the new stack will be on top of all stacks.
- private static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
+ static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
// The height/width divide used when fitting a task within a bounds with method
// {@link #fitWithinBounds}.
@@ -4042,6 +4042,9 @@
mStackSupervisor.moveHomeStackTaskToTop(reason);
}
+ // The following block can be executed multiple times if there is more than one overlay.
+ // {@link ActivityStackSupervisor#removeTaskByIdLocked} handles this by reverse lookup
+ // of the task by id and exiting early if not found.
if (onlyHasTaskOverlays) {
// When destroying a task, tell the supervisor to remove it so that any activity it
// has can be cleaned up correctly. This is currently the only place where we remove
@@ -4053,7 +4056,12 @@
mStackSupervisor.removeTaskByIdLocked(task.taskId, false /* killProcess */,
!REMOVE_FROM_RECENTS, PAUSE_IMMEDIATELY);
}
- removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+
+ // We must keep the task around until all activities are destroyed. The following
+ // statement will only execute once since overlays are also considered activities.
+ if (lastActivity) {
+ removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+ }
}
cleanUpActivityServicesLocked(r);
r.removeUriPermissionsLocked();
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 79ea7ba..e828d38 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2986,18 +2986,21 @@
mWindowManager.continueSurfaceLayout();
}
- // The task might have already been running and its visibility needs to be synchronized
- // with the visibility of the stack / windows.
+ // Calculate the default bounds (don't use existing stack bounds as we may have just created
+ // the stack, and schedule the start of the animation into PiP (the bounds animator that
+ // is triggered by this is posted on another thread)
+ final Rect destBounds = stack.getDefaultPictureInPictureBounds(aspectRatio);
+
+ stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
+ true /* fromFullscreen */);
+
+ // Update the visibility of all activities after the they have been reparented to the new
+ // stack. This MUST run after the animation above is scheduled to ensure that the windows
+ // drawn signal is scheduled after the bounds animation start call on the bounds animator
+ // thread.
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
resumeFocusedStackTopActivityLocked();
- // Calculate the default bounds (don't use existing stack bounds as we may have just created
- // the stack
- final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
- false /* useExistingStackBounds */);
-
- stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
- true /* schedulePipModeChangedOnAnimationEnd */);
mService.mTaskChangeNotificationController.notifyActivityPinned(r.packageName,
r.getTask().taskId);
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 7ed07e0..07caf9e 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1432,7 +1432,13 @@
+ "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent);
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
mNewTaskInfo = mSourceRecord.info;
- mNewTaskIntent = mSourceRecord.getTask().intent;
+
+ // It is not guaranteed that the source record will have a task associated with it. For,
+ // example, if this method is being called for processing a pending activity launch, it
+ // is possible that the activity has been removed from the task after the launch was
+ // enqueued.
+ final TaskRecord sourceTask = mSourceRecord.getTask();
+ mNewTaskIntent = sourceTask != null ? sourceTask.intent : null;
}
mSourceRecord = null;
mSourceStack = null;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 11fc40b..e15b135 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -16,6 +16,8 @@
package com.android.server.am;
+import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU;
+
import android.annotation.Nullable;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
@@ -85,6 +87,7 @@
implements PowerManagerInternal.LowPowerModeListener,
BatteryStatsImpl.PlatformIdleStateCallback {
static final String TAG = "BatteryStatsService";
+ static final boolean DBG = false;
/**
* How long to wait on an individual subsystem to return its stats.
@@ -150,11 +153,11 @@
case MSG_WRITE_TO_DISK:
updateExternalStatsSync("write", UPDATE_ALL);
- Slog.d(TAG, "begin writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "begin writeAsyncLocked");
synchronized (mStats) {
mStats.writeAsyncLocked();
}
- Slog.d(TAG, "end writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "end writeAsyncLocked");
break;
}
}
@@ -194,7 +197,7 @@
@Override
public String getPlatformLowPowerStats() {
- Slog.d(TAG, "begin getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
try {
mUtf8BufferStat.clear();
mUtf16BufferStat.clear();
@@ -210,7 +213,7 @@
mUtf16BufferStat.flip();
return mUtf16BufferStat.toString();
} finally {
- Slog.d(TAG, "end getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
}
}
@@ -559,11 +562,11 @@
public void noteScreenState(int state) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteScreenState");
+ if (DBG) Slog.d(TAG, "begin noteScreenState");
synchronized (mStats) {
mStats.noteScreenStateLocked(state);
}
- Slog.d(TAG, "end noteScreenState");
+ if (DBG) Slog.d(TAG, "end noteScreenState");
}
public void noteScreenBrightness(int brightness) {
@@ -716,11 +719,11 @@
public void noteStartCamera(int uid) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteStartCamera");
+ if (DBG) Slog.d(TAG, "begin noteStartCamera");
synchronized (mStats) {
mStats.noteCameraOnLocked(uid);
}
- Slog.d(TAG, "end noteStartCamera");
+ if (DBG) Slog.d(TAG, "end noteStartCamera");
}
public void noteStopCamera(int uid) {
@@ -1340,23 +1343,23 @@
}
}
}
- Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpCheckinLocked");
+ if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
} else {
- Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpLocked");
+ if (DBG) Slog.d(TAG, "end dumpLocked");
}
}
@@ -1478,11 +1481,11 @@
SynchronousResultReceiver bluetoothReceiver = null;
SynchronousResultReceiver modemReceiver = null;
- Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ if (DBG) Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
synchronized (mExternalStatsLock) {
if (mContext == null) {
// Don't do any work yet.
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
return;
}
@@ -1549,7 +1552,9 @@
BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
reason, 0);
- mStats.updateCpuTimeLocked();
+ if ((updateFlags & UPDATE_CPU) != 0) {
+ mStats.updateCpuTimeLocked(true /* updateCpuFreqData */);
+ }
mStats.updateKernelWakelocksLocked();
mStats.updateKernelMemoryBandwidthLocked();
@@ -1579,7 +1584,7 @@
}
}
}
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
}
/**
@@ -1599,7 +1604,7 @@
return getHealthStatsForUidLocked(requestUid);
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
+ Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
throw ex;
} finally {
Binder.restoreCallingIdentity(ident);
@@ -1629,7 +1634,7 @@
return results;
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ Arrays.toString(requestUids) + ") i=" + i, ex);
throw ex;
} finally {
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 34cdb54..2010c24 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -44,18 +44,18 @@
return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
}
- Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return getWindowContainerController().getPictureInPictureBounds(aspectRatio,
- useExistingStackBounds);
+ null /* currentStackBounds */);
}
void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
- boolean schedulePipModeChangedOnAnimationEnd) {
+ boolean fromFullscreen) {
if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
} else {
getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
- animationDuration, schedulePipModeChangedOnAnimationEnd);
+ animationDuration, fromFullscreen);
}
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b222e3a..53c7f84 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -302,6 +302,10 @@
pw.print(" hasAboveClient="); pw.print(hasAboveClient);
pw.print(" treatLikeActivity="); pw.println(treatLikeActivity);
}
+ if (hasTopUi || hasOverlayUi) {
+ pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
+ pw.print(" hasOverlayUi="); pw.println(hasOverlayUi);
+ }
if (foregroundServices || forcingToImportant != null) {
pw.print(prefix); pw.print("foregroundServices="); pw.print(foregroundServices);
pw.print(" forcingToImportant="); pw.println(forcingToImportant);
@@ -428,12 +432,6 @@
pw.print(prefix); pw.print(" - "); pw.println(receivers.valueAt(i));
}
}
- if (hasTopUi) {
- pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
- }
- if (hasOverlayUi) {
- pw.print(prefix); pw.print("hasOverlayUi="); pw.print(hasOverlayUi);
- }
}
ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index deb3b28..39aed7c 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -233,7 +233,8 @@
updateFile();
}
mLastWriteTime = SystemClock.uptimeMillis();
- Slog.i(TAG, "Prepared write state in " + (SystemClock.uptimeMillis()-now) + "ms");
+ if (DEBUG) Slog.d(TAG, "Prepared write state in "
+ + (SystemClock.uptimeMillis()-now) + "ms");
if (!sync) {
BackgroundThread.getHandler().post(new Runnable() {
@Override public void run() {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 7eec945..e81e6d7 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -115,6 +115,7 @@
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP;
import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
@@ -673,8 +674,11 @@
mWindowContainerController.reparent(toStack.getWindowContainerController(), position,
moveStackMode == REPARENT_MOVE_STACK_TO_FRONT);
+ final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
+ || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
// Move the task
- sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING);
+ sourceStack.removeTask(this, reason, moveStackToFront
+ ? REMOVE_TASK_MODE_MOVING_TO_TOP : REMOVE_TASK_MODE_MOVING);
toStack.addTask(this, position, false /* schedulePictureInPictureModeChange */, reason);
if (schedulePictureInPictureModeChange) {
@@ -693,8 +697,6 @@
// If the task had focus before (or we're requested to move focus), move focus to the
// new stack by moving the stack to the front.
- final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
- || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
if (r != null) {
toStack.moveToFrontAndResumeStateIfNeeded(r, moveStackToFront, wasResumed,
wasPaused, reason);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index e9555f7..e5c3106 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3931,7 +3931,7 @@
public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
{
- if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, device)) {
return 0;
}
return setBluetoothA2dpDeviceConnectionStateInt(
@@ -5070,7 +5070,7 @@
private void onSetA2dpSinkConnectionState(BluetoothDevice btDevice, int state)
{
- if (DEBUG_VOL) {
+ if (DEBUG_DEVICES) {
Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice+"state=" + state);
}
if (btDevice == null) {
@@ -5173,7 +5173,7 @@
int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
synchronized (mConnectedDevices) {
- if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, btDevice)) {
return;
}
final String key = makeDeviceListKey(device, address);
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 81a1458..901092e 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -20,6 +20,7 @@
import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static com.android.server.ConnectivityService.SHORT_ARG;
import android.app.Notification;
import android.app.NotificationManager;
@@ -47,6 +48,7 @@
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.RouteInfo;
+import android.net.util.SharedLog;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Bundle;
@@ -62,7 +64,6 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.LocalLog;
import android.util.Log;
import android.util.SparseArray;
@@ -147,9 +148,7 @@
}
}
- private final static int MAX_LOG_RECORDS = 500;
-
- private final LocalLog mLocalLog = new LocalLog(MAX_LOG_RECORDS);
+ private final SharedLog mLog = new SharedLog(TAG);
// used to synchronize public access to members
private final Object mPublicSync;
@@ -180,7 +179,7 @@
public Tethering(Context context, INetworkManagementService nmService,
INetworkStatsService statsService, INetworkPolicyManager policyManager,
Looper looper, MockableSystemProperties systemProperties) {
- mLocalLog.log("CONSTRUCTED");
+ mLog.mark("constructed");
mContext = context;
mNMService = nmService;
mStatsService = statsService;
@@ -195,9 +194,9 @@
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
mTetherMasterSM.start();
- mOffloadController = new OffloadController(mTetherMasterSM.getHandler());
+ mOffloadController = new OffloadController(mTetherMasterSM.getHandler(), mLog);
mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
- mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
+ mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog);
mForwardedDownstreams = new HashSet<>();
mStateReceiver = new StateReceiver();
@@ -1094,7 +1093,7 @@
addState(mSetDnsForwardersErrorState);
mNotifyList = new ArrayList<>();
- mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList);
+ mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mLog);
setInitialState(mInitialState);
}
@@ -1141,7 +1140,7 @@
try {
mNMService.setIpForwardingEnabled(true);
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mSetIpForwardingEnabledErrorState);
return false;
}
@@ -1154,12 +1153,12 @@
mNMService.stopTethering();
mNMService.startTethering(cfg.dhcpRanges);
} catch (Exception ee) {
- mLocalLog.log("ERROR " + ee);
+ mLog.e(ee);
transitionTo(mStartTetheringErrorState);
return false;
}
}
- mLocalLog.log("SET master tether settings: ON");
+ mLog.log("SET master tether settings: ON");
return true;
}
@@ -1167,19 +1166,19 @@
try {
mNMService.stopTethering();
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mStopTetheringErrorState);
return false;
}
try {
mNMService.setIpForwardingEnabled(false);
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mSetIpForwardingDisabledErrorState);
return false;
}
transitionTo(mInitialState);
- mLocalLog.log("SET master tether settings: OFF");
+ mLog.log("SET master tether settings: OFF");
return true;
}
@@ -1305,13 +1304,13 @@
}
try {
mNMService.setDnsForwarders(network, dnsServers);
- mLocalLog.log(String.format(
- "SET DNS forwarders: network=%s dnsServers=[%s]",
+ mLog.log(String.format(
+ "SET DNS forwarders: network=%s dnsServers=%s",
network, Arrays.toString(dnsServers)));
} catch (Exception e) {
// TODO: Investigate how this can fail and what exactly
// happens if/when such failures occur.
- mLocalLog.log("ERROR setting DNS forwarders failed, " + e);
+ mLog.e("setting DNS forwarders failed, " + e);
transitionTo(mSetDnsForwardersErrorState);
}
}
@@ -1788,12 +1787,23 @@
pw.println("Log:");
pw.increaseIndent();
- mLocalLog.readOnlyLocalLog().dump(fd, pw, args);
+ if (argsContain(args, SHORT_ARG)) {
+ pw.println("<log removed for brevity>");
+ } else {
+ mLog.dump(fd, pw, args);
+ }
pw.decreaseIndent();
pw.decreaseIndent();
}
+ private static boolean argsContain(String[] args, String target) {
+ for (String arg : args) {
+ if (arg.equals(target)) return true;
+ }
+ return false;
+ }
+
@Override
public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who,
int state, int error) {
@@ -1807,8 +1817,7 @@
}
}
- mLocalLog.log(String.format("OBSERVED iface=%s state=%s error=%s",
- iface, state, error));
+ mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error));
try {
// Notify that we're tethering (or not) this interface.
@@ -1846,8 +1855,8 @@
private void trackNewTetherableInterface(String iface, int interfaceType) {
TetherState tetherState;
tetherState = new TetherState(new TetherInterfaceStateMachine(iface, mLooper,
- interfaceType, mNMService, mStatsService, this,
- new IPv6TetheringInterfaceServices(iface, mNMService)));
+ interfaceType, mLog, mNMService, mStatsService, this,
+ new IPv6TetheringInterfaceServices(iface, mNMService, mLog)));
mTetherStates.put(iface, tetherState);
tetherState.stateMachine.start();
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
index 2485654..518f6c1 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
@@ -25,6 +25,7 @@
import android.net.NetworkState;
import android.net.RouteInfo;
import android.net.util.NetworkConstants;
+import android.net.util.SharedLog;
import android.util.Log;
import java.net.Inet6Address;
@@ -64,6 +65,7 @@
}
private final ArrayList<TetherInterfaceStateMachine> mNotifyList;
+ private final SharedLog mLog;
// NOTE: mActiveDownstreams is a list and not a hash data structure because
// we keep active downstreams in arrival order. This is done so /64s can
// be parceled out on a "first come, first served" basis and a /64 used by
@@ -74,8 +76,10 @@
private short mNextSubnetId;
private NetworkState mUpstreamNetworkState;
- public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList) {
+ public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList,
+ SharedLog log) {
mNotifyList = notifyList;
+ mLog = log.forSubComponent(TAG);
mActiveDownstreams = new LinkedList<>();
mUniqueLocalPrefix = generateUniqueLocalPrefix();
mNextSubnetId = 0;
@@ -115,7 +119,7 @@
if (VDBG) {
Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
}
- if (!canTetherIPv6(ns)) {
+ if (!canTetherIPv6(ns, mLog)) {
stopIPv6TetheringOnAllInterfaces();
setUpstreamNetworkState(null);
return;
@@ -150,9 +154,7 @@
null);
}
- if (DBG) {
- Log.d(TAG, "setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
- }
+ mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
}
private void updateIPv6TetheringInterfaces() {
@@ -206,7 +208,7 @@
return null;
}
- private static boolean canTetherIPv6(NetworkState ns) {
+ private static boolean canTetherIPv6(NetworkState ns, SharedLog sharedLog) {
// Broadly speaking:
//
// [1] does the upstream have an IPv6 default route?
@@ -260,13 +262,11 @@
final boolean outcome = canTether && supportedConfiguration;
- if (VDBG) {
- if (ns == null) {
- Log.d(TAG, "No available upstream.");
- } else {
- Log.d(TAG, String.format("IPv6 tethering is %s for upstream: %s",
- (outcome ? "available" : "not available"), toDebugString(ns)));
- }
+ if (ns == null) {
+ sharedLog.log("No available upstream.");
+ } else {
+ sharedLog.log(String.format("IPv6 tethering is %s for upstream: %s",
+ (outcome ? "available" : "not available"), toDebugString(ns)));
}
return outcome;
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
index c6a7925..adf4af8 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
@@ -28,10 +28,10 @@
import android.net.ip.RouterAdvertisementDaemon;
import android.net.ip.RouterAdvertisementDaemon.RaParams;
import android.net.util.NetdService;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.ServiceSpecificException;
import android.os.RemoteException;
-import android.util.Log;
import android.util.Slog;
import java.net.Inet6Address;
@@ -54,6 +54,7 @@
private final String mIfName;
private final INetworkManagementService mNMService;
+ private final SharedLog mLog;
private NetworkInterface mNetworkInterface;
private byte[] mHwAddr;
@@ -61,9 +62,11 @@
private RouterAdvertisementDaemon mRaDaemon;
private RaParams mLastRaParams;
- public IPv6TetheringInterfaceServices(String ifname, INetworkManagementService nms) {
+ public IPv6TetheringInterfaceServices(
+ String ifname, INetworkManagementService nms, SharedLog log) {
mIfName = ifname;
mNMService = nms;
+ mLog = log.forSubComponent(mIfName);
}
public boolean start() {
@@ -72,12 +75,12 @@
try {
mNetworkInterface = NetworkInterface.getByName(mIfName);
} catch (SocketException e) {
- Log.e(TAG, "Error looking up NetworkInterfaces for " + mIfName, e);
+ mLog.e("Error looking up NetworkInterfaces: " + e);
stop();
return false;
}
if (mNetworkInterface == null) {
- Log.e(TAG, "Failed to find NetworkInterface for " + mIfName);
+ mLog.e("Failed to find NetworkInterface");
stop();
return false;
}
@@ -85,7 +88,7 @@
try {
mHwAddr = mNetworkInterface.getHardwareAddress();
} catch (SocketException e) {
- Log.e(TAG, "Failed to find hardware address for " + mIfName, e);
+ mLog.e("Failed to find hardware address: " + e);
stop();
return false;
}
@@ -161,11 +164,11 @@
try {
final int removalFailures = mNMService.removeRoutesFromLocalNetwork(toBeRemoved);
if (removalFailures > 0) {
- Log.e(TAG, String.format("Failed to remove %d IPv6 routes from local table.",
+ mLog.e(String.format("Failed to remove %d IPv6 routes from local table.",
removalFailures));
}
} catch (RemoteException e) {
- Log.e(TAG, "Failed to remove IPv6 routes from local table: ", e);
+ mLog.e("Failed to remove IPv6 routes from local table: " + e);
}
}
@@ -195,7 +198,7 @@
// error (EEXIST is silently ignored).
mNMService.addInterfaceToLocalNetwork(mIfName, toBeAdded);
} catch (RemoteException e) {
- Log.e(TAG, "Failed to add IPv6 routes to local table: ", e);
+ mLog.e("Failed to add IPv6 routes to local table: " + e);
}
}
}
@@ -206,7 +209,7 @@
final INetd netd = NetdService.getInstance();
if (netd == null) {
if (newDnses != null) newDnses.clear();
- Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses");
+ mLog.e("No netd service instance available; not setting local IPv6 addresses");
return;
}
@@ -217,7 +220,7 @@
try {
netd.interfaceDelAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e);
+ mLog.e("Failed to remove local dns IP " + dnsString + ": " + e);
}
}
}
@@ -234,7 +237,7 @@
try {
netd.interfaceAddAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to add local dns IP: " + dnsString, e);
+ mLog.e("Failed to add local dns IP " + dnsString + ": " + e);
newDnses.remove(dns);
}
}
@@ -243,7 +246,7 @@
try {
netd.tetherApplyDnsInterfaces();
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to update local DNS caching server");
+ mLog.e("Failed to update local DNS caching server");
if (newDnses != null) newDnses.clear();
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index 220e751..8f21d99 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -18,7 +18,7 @@
import android.net.LinkProperties;
import android.os.Handler;
-import android.util.Log;
+import android.net.util.SharedLog;
/**
* A wrapper around hardware offload interface.
@@ -29,16 +29,18 @@
private static final String TAG = OffloadController.class.getSimpleName();
private final Handler mHandler;
+ private final SharedLog mLog;
private LinkProperties mUpstreamLinkProperties;
- public OffloadController(Handler h) {
+ public OffloadController(Handler h, SharedLog log) {
mHandler = h;
+ mLog = log.forSubComponent(TAG);
}
public void start() {
// TODO: initOffload() and configure callbacks to be handled on our
// preferred Handler.
- Log.d(TAG, "tethering offload not supported");
+ mLog.i("tethering offload not supported");
}
public void stop() {
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index d3cfd87..4a1d405 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -22,6 +22,7 @@
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Message;
@@ -82,6 +83,7 @@
private final State mTetheredState;
private final State mUnavailableState;
+ private final SharedLog mLog;
private final INetworkManagementService mNMService;
private final INetworkStatsService mStatsService;
private final IControlsTethering mTetherController;
@@ -93,10 +95,12 @@
private int mLastError;
private String mMyUpstreamIfaceName; // may change over time
- public TetherInterfaceStateMachine(String ifaceName, Looper looper, int interfaceType,
- INetworkManagementService nMService, INetworkStatsService statsService,
- IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
+ public TetherInterfaceStateMachine(
+ String ifaceName, Looper looper, int interfaceType, SharedLog log,
+ INetworkManagementService nMService, INetworkStatsService statsService,
+ IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
super(ifaceName, looper);
+ mLog = log.forSubComponent(ifaceName);
mNMService = nMService;
mStatsService = statsService;
mTetherController = tetherController;
@@ -162,7 +166,7 @@
mNMService.setInterfaceConfig(mIfaceName, ifcg);
}
} catch (Exception e) {
- Log.e(TAG, "Error configuring interface " + mIfaceName, e);
+ mLog.e("Error configuring interface " + e);
return false;
}
@@ -203,7 +207,7 @@
transitionTo(mTetheredState);
break;
default:
- Log.e(TAG, "Invalid tethering interface serving state specified.");
+ mLog.e("Invalid tethering interface serving state specified.");
}
break;
case CMD_INTERFACE_DOWN:
@@ -232,13 +236,13 @@
try {
mNMService.tetherInterface(mIfaceName);
} catch (Exception e) {
- Log.e(TAG, "Error Tethering: " + e.toString());
+ mLog.e("Error Tethering: " + e);
mLastError = ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
return;
}
if (!mIPv6TetherSvc.start()) {
- Log.e(TAG, "Failed to start IPv6TetheringInterfaceServices");
+ mLog.e("Failed to start IPv6TetheringInterfaceServices");
// TODO: Make this a fatal error once Bluetooth IPv6 is sorted.
return;
}
@@ -255,7 +259,7 @@
mNMService.untetherInterface(mIfaceName);
} catch (Exception e) {
mLastError = ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR;
- Log.e(TAG, "Failed to untether interface: " + e.toString());
+ mLog.e("Failed to untether interface: " + e);
}
configureIfaceIp(false);
@@ -316,7 +320,7 @@
maybeLogMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_REQUESTED:
- Log.e(TAG, "CMD_TETHER_REQUESTED while in local hotspot mode.");
+ mLog.e("CMD_TETHER_REQUESTED while in local-only hotspot mode.");
break;
case CMD_TETHER_CONNECTION_CHANGED:
// Ignored in local hotspot state.
@@ -389,7 +393,7 @@
boolean retValue = true;
switch (message.what) {
case CMD_TETHER_REQUESTED:
- Log.e(TAG, "CMD_TETHER_REQUESTED while already tethering.");
+ mLog.e("CMD_TETHER_REQUESTED while already tethering.");
break;
case CMD_TETHER_CONNECTION_CHANGED:
String newUpstreamIfaceName = (String)(message.obj);
@@ -406,7 +410,7 @@
mNMService.startInterfaceForwarding(mIfaceName,
newUpstreamIfaceName);
} catch (Exception e) {
- Log.e(TAG, "Exception enabling Nat: " + e.toString());
+ mLog.e("Exception enabling NAT: " + e);
cleanupUpstreamInterface(newUpstreamIfaceName);
mLastError = ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
transitionTo(mInitialState);
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
index 44c61f0..6941193 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
@@ -163,20 +163,31 @@
}
// Fix up upstream interface types for DUN or mobile. NOTE: independent
- // of the value of |requiresDun|, cell data of one form or another is
+ // of the value of |dunCheck|, cell data of one form or another is
// *always* an upstream, regardless of the upstream interface types
// specified by configuration resources.
if (dunCheck == DUN_REQUIRED) {
if (!upstreamIfaceTypes.contains(TYPE_MOBILE_DUN)) {
upstreamIfaceTypes.add(TYPE_MOBILE_DUN);
}
- } else {
+ } else if (dunCheck == DUN_NOT_REQUIRED) {
if (!upstreamIfaceTypes.contains(TYPE_MOBILE)) {
upstreamIfaceTypes.add(TYPE_MOBILE);
}
if (!upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)) {
upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
}
+ } else {
+ // Fix upstream interface types for case DUN_UNSPECIFIED.
+ // Do not modify if a cellular interface type is already present in the
+ // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no
+ // cellular interface types are found in the upstream interface types.
+ if (!(upstreamIfaceTypes.contains(TYPE_MOBILE_DUN)
+ || upstreamIfaceTypes.contains(TYPE_MOBILE)
+ || upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI))) {
+ upstreamIfaceTypes.add(TYPE_MOBILE);
+ upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
+ }
}
return upstreamIfaceTypes;
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 97a2d5e..be71490 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -29,6 +29,7 @@
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.NetworkState;
+import android.net.util.SharedLog;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -73,6 +74,7 @@
private static final int CALLBACK_MOBILE_REQUEST = 3;
private final Context mContext;
+ private final SharedLog mLog;
private final StateMachine mTarget;
private final Handler mHandler;
private final int mWhat;
@@ -84,16 +86,18 @@
private boolean mDunRequired;
private Network mCurrentDefault;
- public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
+ public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what, SharedLog log) {
mContext = ctx;
mTarget = tgt;
mHandler = mTarget.getHandler();
mWhat = what;
+ mLog = log.forSubComponent(TAG);
}
@VisibleForTesting
- public UpstreamNetworkMonitor(StateMachine tgt, int what, ConnectivityManager cm) {
- this(null, tgt, what);
+ public UpstreamNetworkMonitor(
+ StateMachine tgt, int what, ConnectivityManager cm, SharedLog log) {
+ this(null, tgt, what, log);
mCM = cm;
}
@@ -136,7 +140,7 @@
public void registerMobileNetworkRequest() {
if (mMobileNetworkCallback != null) {
- Log.e(TAG, "registerMobileNetworkRequest() already registered");
+ mLog.e("registerMobileNetworkRequest() already registered");
return;
}
@@ -156,7 +160,7 @@
// TODO: Change the timeout from 0 (no onUnavailable callback) to some
// moderate callback timeout. This might be useful for updating some UI.
// Additionally, we log a message to aid in any subsequent debugging.
- Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest);
+ mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest);
cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType, mHandler);
}
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 069ae73..f804fa1 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -18,6 +18,7 @@
import android.accounts.Account;
import android.accounts.AccountAndUser;
+import android.accounts.AccountManager;
import android.app.backup.BackupManager;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -27,6 +28,7 @@
import android.content.SyncInfo;
import android.content.SyncRequest;
import android.content.SyncStatusInfo;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@@ -350,6 +352,50 @@
void onAuthorityRemoved(EndPoint removedAuthority);
}
+ /**
+ * Validator that maintains a lazy cache of accounts and providers to tell if an authority or
+ * account is valid.
+ */
+ private static class AccountAuthorityValidator {
+ final private AccountManager mAccountManager;
+ final private PackageManager mPackageManager;
+ final private SparseArray<Account[]> mAccountsCache;
+ final private SparseArray<ArrayMap<String, Boolean>> mProvidersPerUserCache;
+
+ AccountAuthorityValidator(Context context) {
+ mAccountManager = context.getSystemService(AccountManager.class);
+ mPackageManager = context.getPackageManager();
+ mAccountsCache = new SparseArray<>();
+ mProvidersPerUserCache = new SparseArray<>();
+ }
+
+ // An account is valid if an installed authenticator has previously created that account
+ // on the device
+ boolean isAccountValid(Account account, int userId) {
+ Account[] accountsForUser = mAccountsCache.get(userId);
+ if (accountsForUser == null) {
+ accountsForUser = mAccountManager.getAccountsAsUser(userId);
+ mAccountsCache.put(userId, accountsForUser);
+ }
+ return ArrayUtils.contains(accountsForUser, account);
+ }
+
+ // An authority is only valid if it has a content provider installed on the system
+ boolean isAuthorityValid(String authority, int userId) {
+ ArrayMap<String, Boolean> authorityMap = mProvidersPerUserCache.get(userId);
+ if (authorityMap == null) {
+ authorityMap = new ArrayMap<>();
+ mProvidersPerUserCache.put(userId, authorityMap);
+ }
+ if (!authorityMap.containsKey(authority)) {
+ authorityMap.put(authority, mPackageManager.resolveContentProviderAsUser(authority,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId) != null);
+ }
+ return authorityMap.get(authority);
+ }
+ }
+
// Primary list of all syncable authorities. Also our global lock.
private final SparseArray<AuthorityInfo> mAuthorities =
new SparseArray<AuthorityInfo>();
@@ -1502,12 +1548,13 @@
eventType = parser.next();
AuthorityInfo authority = null;
PeriodicSync periodicSync = null;
+ AccountAuthorityValidator validator = new AccountAuthorityValidator(mContext);
do {
if (eventType == XmlPullParser.START_TAG) {
tagName = parser.getName();
if (parser.getDepth() == 2) {
if ("authority".equals(tagName)) {
- authority = parseAuthority(parser, version);
+ authority = parseAuthority(parser, version, validator);
periodicSync = null;
if (authority != null) {
if (authority.ident > highestAuthorityId) {
@@ -1636,7 +1683,8 @@
mMasterSyncAutomatically.put(userId, listen);
}
- private AuthorityInfo parseAuthority(XmlPullParser parser, int version) {
+ private AuthorityInfo parseAuthority(XmlPullParser parser, int version,
+ AccountAuthorityValidator validator) {
AuthorityInfo authority = null;
int id = -1;
try {
@@ -1676,21 +1724,26 @@
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
Slog.v(TAG_FILE, "Creating authority entry");
}
- EndPoint info = null;
if (accountName != null && authorityName != null) {
- info = new EndPoint(
+ EndPoint info = new EndPoint(
new Account(accountName, accountType),
authorityName, userId);
- }
- if (info != null) {
- authority = getOrCreateAuthorityLocked(info, id, false);
- // If the version is 0 then we are upgrading from a file format that did not
- // know about periodic syncs. In that case don't clear the list since we
- // want the default, which is a daily periodic sync.
- // Otherwise clear out this default list since we will populate it later with
- // the periodic sync descriptions that are read from the configuration file.
- if (version > 0) {
- authority.periodicSyncs.clear();
+ if (validator.isAccountValid(info.account, userId)
+ && validator.isAuthorityValid(authorityName, userId)) {
+ authority = getOrCreateAuthorityLocked(info, id, false);
+ // If the version is 0 then we are upgrading from a file format that did not
+ // know about periodic syncs. In that case don't clear the list since we
+ // want the default, which is a daily periodic sync.
+ // Otherwise clear out this default list since we will populate it later
+ // with
+ // the periodic sync descriptions that are read from the configuration file.
+ if (version > 0) {
+ authority.periodicSyncs.clear();
+ }
+ } else {
+ EventLog.writeEvent(0x534e4554, "35028827", -1,
+ "account:" + info.account + " provider:" + authorityName + " user:"
+ + userId);
}
}
}
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index dbccc07..1b984a4 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -86,6 +86,7 @@
private boolean mCurrentDreamCanDoze;
private boolean mCurrentDreamIsDozing;
private boolean mCurrentDreamIsWaking;
+ private Runnable mStopDreamRunnable;
private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN;
private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
@@ -349,6 +350,11 @@
private void startDreamLocked(final ComponentName name,
final boolean isTest, final boolean canDoze, final int userId) {
+ if (mStopDreamRunnable != null) {
+ mHandler.removeCallbacks(mStopDreamRunnable);
+ mStopDreamRunnable = null;
+ }
+
if (Objects.equal(mCurrentDreamName, name)
&& mCurrentDreamIsTest == isTest
&& mCurrentDreamCanDoze == canDoze
@@ -386,13 +392,15 @@
mCurrentDreamIsWaking = true;
}
- mHandler.post(new Runnable() {
+ mStopDreamRunnable = new Runnable() {
@Override
public void run() {
Slog.i(TAG, "Performing gentle wake from dream.");
mController.stopDream(immediate);
+ mStopDreamRunnable = null;
}
- });
+ };
+ mHandler.post(mStopDreamRunnable);
}
}
diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
index 98771df..a91fe77 100644
--- a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
+++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
@@ -219,6 +219,7 @@
List<SubscriptionInfo> activeSubscriptionInfoList =
mSubscriptionManager.getActiveSubscriptionInfoList();
if (activeSubscriptionInfoList == null) {
+ setSimNeedsEmergencyAffordance(neededNow);
return neededNow;
}
for (SubscriptionInfo info : activeSubscriptionInfoList) {
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index 4fc6ddd..5339bac 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -41,8 +41,6 @@
public static final int LOCKOUT_TIMED = 1;
public static final int LOCKOUT_PERMANENT = 2;
- private boolean mAlreadyCancelled;
-
public AuthenticationClient(Context context, long halDeviceId, IBinder token,
IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
boolean restricted, String owner) {
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
index 492cd61..1a2e144 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
@@ -44,6 +44,7 @@
private String mOwner;
private Context mContext;
private long mHalDeviceId;
+ protected boolean mAlreadyCancelled;
/**
* @param context context of FingerprintService
diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java
index e1b78a8..6170894 100644
--- a/services/core/java/com/android/server/fingerprint/EnrollClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnrollClient.java
@@ -100,6 +100,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopEnroll: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopEnrollment: no fingerprint HAL!");
@@ -117,6 +121,7 @@
if (initiatedByClient) {
onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
}
+ mAlreadyCancelled = true;
return 0;
}
diff --git a/services/core/java/com/android/server/fingerprint/EnumerateClient.java b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
index 1b8b89c..12827d0 100644
--- a/services/core/java/com/android/server/fingerprint/EnumerateClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
@@ -56,6 +56,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopEnumerate: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopEnumeration: no fingerprint HAL!");
@@ -77,6 +81,7 @@
if (initiatedByClient) {
onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
}
+ mAlreadyCancelled = true;
return 0; // success
}
diff --git a/services/core/java/com/android/server/fingerprint/RemovalClient.java b/services/core/java/com/android/server/fingerprint/RemovalClient.java
index 8646107..ffc8488 100644
--- a/services/core/java/com/android/server/fingerprint/RemovalClient.java
+++ b/services/core/java/com/android/server/fingerprint/RemovalClient.java
@@ -59,6 +59,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopRemove: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopRemoval: no fingerprint HAL!");
@@ -75,6 +79,7 @@
Slog.e(TAG, "stopRemoval failed", e);
return ERROR_ESRCH;
}
+ mAlreadyCancelled = true;
return 0; // success
}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index e07156e..a94ed60 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -129,10 +129,11 @@
brightnessMode = mLastBrightnessMode;
}
- if ((color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
- mBrightnessMode != brightnessMode)) {
+ if (!mInitialized || color != mColor || mode != mMode || onMS != mOnMS ||
+ offMS != mOffMS || mBrightnessMode != brightnessMode) {
if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
+ Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
+ mInitialized = true;
mLastColor = mColor;
mColor = color;
mMode = mode;
@@ -164,6 +165,7 @@
private int mLastColor;
private boolean mVrModeEnabled;
private boolean mUseLowPersistenceForVR;
+ private boolean mInitialized;
}
public LightsService(Context context) {
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index e0017b5..38c6157 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -171,19 +171,63 @@
public void updateSession(MediaSessionRecord record) {
synchronized (mLock) {
FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (user == null || !user.mPriorityStack.contains(record)) {
- Log.d(TAG, "Unknown session updated. Ignoring.");
+ if (user == null) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
return;
}
- user.mPriorityStack.onSessionStateChange(record);
if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
- mGlobalPrioritySession = record;
+ if (mGlobalPrioritySession != record) {
+ Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession
+ + " to " + record);
+ mGlobalPrioritySession = record;
+ if (user != null && user.mPriorityStack.contains(record)) {
+ // Handle the global priority session separately.
+ // Otherwise, it will be the media button session even after it becomes
+ // inactive because it has been the lastly played media app.
+ user.mPriorityStack.removeSession(record);
+ }
+ }
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Global priority session is updated, active=" + record.isActive());
+ }
user.pushAddressedPlayerChangedLocked();
+ } else {
+ if (!user.mPriorityStack.contains(record)) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
+ return;
+ }
+ user.mPriorityStack.onSessionStateChange(record);
}
mHandler.postSessionsChanged(record.getUserId());
}
}
+ private List<MediaSessionRecord> getActiveSessionsLocked(int userId) {
+ List<MediaSessionRecord> records;
+ if (userId == UserHandle.USER_ALL) {
+ records = new ArrayList<>();
+ int size = mUserRecords.size();
+ for (int i = 0; i < size; i++) {
+ records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId));
+ }
+ } else {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "getSessions failed. Unknown user " + userId);
+ return new ArrayList<>();
+ }
+ records = user.mPriorityStack.getActiveSessions(userId);
+ }
+
+ // Return global priority session at the first whenever it's asked.
+ if (isGlobalPriorityActiveLocked()
+ && (userId == UserHandle.USER_ALL
+ || userId == mGlobalPrioritySession.getUserId())) {
+ records.add(0, mGlobalPrioritySession);
+ }
+ return records;
+ }
+
/**
* Tells the system UI that volume has changed on an active remote session.
*/
@@ -339,16 +383,16 @@
if (DEBUG) {
Log.d(TAG, "Destroying " + session);
}
- int userId = session.getUserId();
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user != null) {
- user.removeSessionLocked(session);
- }
+ FullUserRecord user = getFullUserRecordLocked(session.getUserId());
if (mGlobalPrioritySession == session) {
mGlobalPrioritySession = null;
if (session.isActive() && user != null) {
user.pushAddressedPlayerChangedLocked();
}
+ } else {
+ if (user != null) {
+ user.mPriorityStack.removeSession(session);
+ }
}
try {
@@ -484,7 +528,7 @@
throw new RuntimeException("Media Session owner died prematurely.", e);
}
- user.addSessionLocked(session);
+ user.mPriorityStack.addSession(session);
mHandler.postSessionsChanged(userId);
if (DEBUG) {
@@ -509,7 +553,7 @@
Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId);
return;
}
- List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId);
+ List<MediaSessionRecord> records = getActiveSessionsLocked(userId);
int size = records.size();
ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
for (int i = 0; i < size; i++) {
@@ -637,14 +681,6 @@
}
}
- public void addSessionLocked(MediaSessionRecord session) {
- mPriorityStack.addSession(session);
- }
-
- public void removeSessionLocked(MediaSessionRecord session) {
- mPriorityStack.removeSession(session);
- }
-
public void dumpLocked(PrintWriter pw, String prefix) {
pw.print(prefix + "Record for full_user=" + mFullUserId);
// Dump managed profile user ids associated with this user.
@@ -816,27 +852,9 @@
int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
ArrayList<IBinder> binders = new ArrayList<IBinder>();
synchronized (mLock) {
- if (resolvedUserId == UserHandle.USER_ALL) {
- int size = mUserRecords.size();
- for (int i = 0; i < size; i++) {
- List<MediaSessionRecord> records =
- mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(
- resolvedUserId);
- for (MediaSessionRecord record : records) {
- binders.add(record.getControllerBinder().asBinder());
- }
- }
- } else {
- FullUserRecord user = getFullUserRecordLocked(resolvedUserId);
- if (user == null) {
- Log.w(TAG, "getSessions failed. Unknown user " + userId);
- return binders;
- }
- List<MediaSessionRecord> records = user.mPriorityStack
- .getActiveSessions(resolvedUserId);
- for (MediaSessionRecord record : records) {
- binders.add(record.getControllerBinder().asBinder());
- }
+ List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId);
+ for (MediaSessionRecord record : records) {
+ binders.add(record.getControllerBinder().asBinder());
}
}
return binders;
@@ -1292,6 +1310,9 @@
synchronized (mLock) {
pw.println(mSessionsListeners.size() + " sessions listeners.");
pw.println("Global priority session is " + mGlobalPrioritySession);
+ if (mGlobalPrioritySession != null) {
+ mGlobalPrioritySession.dump(pw, " ");
+ }
pw.println("User Records:");
int count = mUserRecords.size();
for (int i = 0; i < count; i++) {
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index f474769..f03f630 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -310,7 +310,6 @@
* Get a priority sorted list of sessions. Can filter to only return active
* sessions or sessions.
* <p>Here's the priority order.
- * <li>System priority session (session with FLAG_EXCLUSIVE_GLOBAL_PRIORITY)</li>
* <li>Active sessions whose PlaybackState is active</li>
* <li>Active sessions whose PlaybackState is inactive</li>
* <li>Inactive sessions</li>
@@ -344,13 +343,7 @@
continue;
}
- if (session.isSystemPriority()) {
- // System priority sessions are special and always go at the
- // front. We expect there to only be one of these at a time.
- result.add(0, session);
- lastPlaybackActiveIndex++;
- lastActiveIndex++;
- } else if (session.isPlaybackActive()) {
+ if (session.isPlaybackActive()) {
result.add(lastPlaybackActiveIndex++, session);
lastActiveIndex++;
} else {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index fc582b0..3667e16 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_TELEVISION;
@@ -90,7 +91,6 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.media.AudioManager;
@@ -114,7 +114,6 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.os.UserManager;
import android.os.Vibrator;
import android.os.VibrationEffect;
import android.provider.Settings;
@@ -473,19 +472,6 @@
out.endDocument();
}
- /** Use this when you actually want to post a notification or toast.
- *
- * Unchecked. Not exposed via Binder, but can be called in the course of enqueue*().
- */
- private boolean noteNotificationOp(String pkg, int uid) {
- if (mAppOps.noteOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
- != AppOpsManager.MODE_ALLOWED) {
- Slog.v(TAG, "notifications are disabled by AppOps for " + pkg);
- return false;
- }
- return true;
- }
-
/** Use this to check if a package can post a notification or toast. */
private boolean checkNotificationOp(String pkg, int uid) {
return mAppOps.checkOp(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
@@ -1154,7 +1140,7 @@
final File systemDir = new File(Environment.getDataDirectory(), "system");
mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml"));
- syncBlockDb();
+ loadPolicyFile();
// This is a ManagedServices object that keeps track of the listeners.
mListeners = notificationListeners;
@@ -1267,46 +1253,6 @@
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
}
- /**
- * Make sure the XML config and the the AppOps system agree about blocks.
- */
- private void syncBlockDb() {
- loadPolicyFile();
-
- // sync bans from ranker into app opps
- Map<Integer, String> packageBans = mRankingHelper.getPackageBans();
- for(Entry<Integer, String> ban : packageBans.entrySet()) {
- final int uid = ban.getKey();
- final String packageName = ban.getValue();
- setNotificationsEnabledForPackageImpl(packageName, uid, false);
- }
-
- // sync bans from app opps into ranker
- packageBans.clear();
- for (UserInfo user : UserManager.get(getContext()).getUsers()) {
- final int userId = user.getUserHandle().getIdentifier();
- final PackageManager packageManager = getContext().getPackageManager();
- List<PackageInfo> packages = packageManager.getInstalledPackagesAsUser(0, userId);
- final int packageCount = packages.size();
- for (int p = 0; p < packageCount; p++) {
- final String packageName = packages.get(p).packageName;
- try {
- final int uid = packageManager.getPackageUidAsUser(packageName, userId);
- if (!checkNotificationOp(packageName, uid)) {
- packageBans.put(uid, packageName);
- }
- } catch (NameNotFoundException e) {
- // forget you
- }
- }
- }
- for (Entry<Integer, String> ban : packageBans.entrySet()) {
- mRankingHelper.setImportance(ban.getValue(), ban.getKey(), IMPORTANCE_NONE);
- }
-
- savePolicyFile();
- }
-
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
@@ -1328,19 +1274,6 @@
}
}
- void setNotificationsEnabledForPackageImpl(String pkg, int uid, boolean enabled) {
- Slog.v(TAG, (enabled?"en":"dis") + "abling notifications for " + pkg);
-
- mAppOps.setMode(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg,
- enabled ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
-
- // Now, cancel any outstanding notifications that are part of a just-disabled app
- if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
- cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
- UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
- }
- }
-
private void updateListenerHintsLocked() {
final int hints = calculateHints();
if (hints == mListenerHints) return;
@@ -1522,7 +1455,8 @@
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
if (ENABLE_BLOCKED_TOASTS && !isSystemToast &&
- (!noteNotificationOp(pkg, Binder.getCallingUid()) || isPackageSuspended)) {
+ (!areNotificationsEnabledForPackage(pkg, Binder.getCallingUid())
+ || isPackageSuspended)) {
Slog.e(TAG, "Suppressing toast from package " + pkg
+ (isPackageSuspended
? " due to package suspended by administrator."
@@ -1643,8 +1577,12 @@
public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
checkCallerIsSystem();
- setNotificationsEnabledForPackageImpl(pkg, uid, enabled);
mRankingHelper.setEnabled(pkg, uid, enabled);
+ // Now, cancel any outstanding notifications that are part of a just-disabled app
+ if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
+ cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
+ UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
+ }
savePolicyFile();
}
@@ -1662,8 +1600,8 @@
@Override
public boolean areNotificationsEnabledForPackage(String pkg, int uid) {
checkCallerIsSystemOrSameApp(pkg);
- return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
- == AppOpsManager.MODE_ALLOWED) && !isPackageSuspendedForUser(pkg, uid);
+
+ return mRankingHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
}
@Override
@@ -3282,11 +3220,12 @@
}
private void doChannelWarningToast(CharSequence toastText) {
+ final int defaultWarningEnabled = Build.IS_DEBUGGABLE ? 1 : 0;
final boolean warningEnabled = Settings.Global.getInt(getContext().getContentResolver(),
- Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, 0) != 0;
- if (warningEnabled || Build.IS_DEBUGGABLE) {
+ Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, defaultWarningEnabled) != 0;
+ if (warningEnabled) {
Toast toast = Toast.makeText(getContext(), mHandler.getLooper(), toastText,
- Toast.LENGTH_LONG);
+ Toast.LENGTH_SHORT);
toast.show();
}
}
@@ -3399,8 +3338,7 @@
}
final boolean isBlocked = r.getImportance() == NotificationManager.IMPORTANCE_NONE
- || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE
- || !noteNotificationOp(pkg, callingUid);
+ || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE;
if (isBlocked) {
Slog.e(TAG, "Suppressing notification from package by user request.");
usageStats.registerBlocked(r);
@@ -3722,14 +3660,6 @@
" intercept=" + record.isIntercepted()
);
- final int currentUser;
- final long token = Binder.clearCallingIdentity();
- try {
- currentUser = ActivityManager.getCurrentUser();
- } finally {
- Binder.restoreCallingIdentity(token);
- }
-
// If we're not supposed to beep, vibrate, etc. then don't.
final String disableEffects = disableNotificationEffects(record);
if (disableEffects != null) {
@@ -3739,50 +3669,53 @@
// Remember if this notification already owns the notification channels.
boolean wasBeep = key != null && key.equals(mSoundNotificationKey);
boolean wasBuzz = key != null && key.equals(mVibrateNotificationKey);
-
// These are set inside the conditional if the notification is allowed to make noise.
boolean hasValidVibrate = false;
boolean hasValidSound = false;
- if (disableEffects == null
- && (record.getUserId() == UserHandle.USER_ALL ||
- record.getUserId() == currentUser ||
- mUserProfiles.isCurrentProfile(record.getUserId()))
- && canInterrupt
- && mSystemReady
- && mAudioManager != null) {
- if (DBG) Slog.v(TAG, "Interrupting!");
- Uri soundUri = record.getSound();
- hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
- long[] vibration = record.getVibration();
- // Demote sound to vibration if vibration missing & phone in vibration mode.
- if (vibration == null
- && hasValidSound
- && (mAudioManager.getRingerModeInternal()
- == AudioManager.RINGER_MODE_VIBRATE)) {
- vibration = mFallbackVibrationPattern;
- }
- hasValidVibrate = vibration != null;
-
- if (!shouldMuteNotificationLocked(record)) {
+ if (isNotificationForCurrentUser(record)) {
+ // If the notification will appear in the status bar, it should send an accessibility
+ // event
+ if (!record.isUpdate && record.getImportance() > IMPORTANCE_MIN) {
sendAccessibilityEvent(notification, record.sbn.getPackageName());
+ }
- if (hasValidSound) {
- mSoundNotificationKey = key;
- if (mInCall) {
- playInCallNotification();
- beep = true;
- } else {
- beep = playSound(record, soundUri);
- }
+ if (disableEffects == null
+ && canInterrupt
+ && mSystemReady
+ && mAudioManager != null) {
+ if (DBG) Slog.v(TAG, "Interrupting!");
+ Uri soundUri = record.getSound();
+ hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
+ long[] vibration = record.getVibration();
+ // Demote sound to vibration if vibration missing & phone in vibration mode.
+ if (vibration == null
+ && hasValidSound
+ && (mAudioManager.getRingerModeInternal()
+ == AudioManager.RINGER_MODE_VIBRATE)) {
+ vibration = mFallbackVibrationPattern;
}
+ hasValidVibrate = vibration != null;
- final boolean ringerModeSilent =
- mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT;
- if (!mInCall && hasValidVibrate && !ringerModeSilent) {
- mVibrateNotificationKey = key;
+ if (!shouldMuteNotificationLocked(record)) {
+ if (hasValidSound) {
+ mSoundNotificationKey = key;
+ if (mInCall) {
+ playInCallNotification();
+ beep = true;
+ } else {
+ beep = playSound(record, soundUri);
+ }
+ }
- buzz = playVibration(record, vibration);
+ final boolean ringerModeSilent =
+ mAudioManager.getRingerModeInternal()
+ == AudioManager.RINGER_MODE_SILENT;
+ if (!mInCall && hasValidVibrate && !ringerModeSilent) {
+ mVibrateNotificationKey = key;
+
+ buzz = playVibration(record, vibration);
+ }
}
}
}
@@ -3826,13 +3759,7 @@
return true;
}
if (record.sbn.isGroup()) {
- if (notification.isGroupSummary()
- && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
- return true;
- } else if (notification.isGroupChild()
- && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
- return true;
- }
+ return notification.suppressAlertingDueToGrouping();
}
return false;
}
@@ -3882,6 +3809,19 @@
}
}
+ private boolean isNotificationForCurrentUser(NotificationRecord record) {
+ final int currentUser;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ currentUser = ActivityManager.getCurrentUser();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return (record.getUserId() == UserHandle.USER_ALL ||
+ record.getUserId() == currentUser ||
+ mUserProfiles.isCurrentProfile(record.getUserId()));
+ }
+
private void playInCallNotification() {
new Thread() {
@Override
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 55cb2f3..2c0cc95 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -21,8 +21,6 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.Preconditions;
-import android.annotation.UserIdInt;
-import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
@@ -35,8 +33,6 @@
import android.metrics.LogMaker;
import android.os.Build;
import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
import android.provider.Settings.Secure;
import android.service.notification.NotificationListenerService.Ranking;
import android.text.TextUtils;
@@ -189,6 +185,10 @@
safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+ r.importance = safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ r.priority = safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+ r.visibility = safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+ r.showBadge = safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
final int innerDepth = parser.getDepth();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -447,7 +447,9 @@
boolean isGroupSummary = record.getNotification().isGroupSummary();
record.setGlobalSortKey(
String.format("intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
- record.isRecentlyIntrusive() ? '0' : '1',
+ record.isRecentlyIntrusive()
+ && record.getImportance() > NotificationManager.IMPORTANCE_MIN
+ ? '0' : '1',
groupProxy.getAuthoritativeRank(),
isGroupSummary ? '0' : '1',
groupSortKeyPortion,
@@ -551,7 +553,7 @@
}
NotificationChannel existing = r.channels.get(channel.getId());
- // Keep existing settings, except deleted status and name
+ // Keep most of the existing settings
if (existing != null && fromTargetApp) {
if (existing.isDeleted()) {
existing.setDeleted(false);
@@ -559,12 +561,13 @@
existing.setName(channel.getName().toString());
existing.setDescription(channel.getDescription());
+ existing.setBlockableSystem(channel.isBlockableSystem());
MetricsLogger.action(getChannelLog(channel, pkg));
updateConfig();
return;
}
- if (channel.getImportance() < NotificationManager.IMPORTANCE_MIN
+ if (channel.getImportance() < NotificationManager.IMPORTANCE_NONE
|| channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
throw new IllegalArgumentException("Invalid importance level");
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index 353b710..c059b37 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -319,7 +319,7 @@
private static final String ATTR_USER_ID = "userId";
private static final String ATTR_VERSION = "version";
- private static final int CURRENT_VERSION = 2;
+ private static final int CURRENT_VERSION = 3;
public static void restore(@NonNull final ArrayList<SettingsItem> table,
@NonNull final InputStream is) throws IOException, XmlPullParserException {
@@ -350,6 +350,7 @@
switch (oldVersion) {
case 0:
case 1:
+ case 2:
// Throw an exception which will cause the overlay file to be ignored
// and overwritten.
throw new XmlPullParserException("old version " + oldVersion + "; ignoring");
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index d364d17..0d1f58a 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -36,6 +36,8 @@
import android.util.Log;
import com.android.server.pm.dex.DexManager;
+import com.android.server.LocalServices;
+import com.android.server.PinnerService;
import java.io.File;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -175,6 +177,7 @@
mAbortPostBootUpdate.set(false);
+ ArraySet<String> updatedPackages = new ArraySet<>();
for (String pkg : pkgs) {
if (mAbortPostBootUpdate.get()) {
// JobScheduler requested an early abort.
@@ -208,11 +211,15 @@
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
// trade-off worth doing to save boot time work.
- pm.performDexOpt(pkg,
+ int result = pm.performDexOptWithStatus(pkg,
/* checkProfiles */ false,
PackageManagerService.REASON_BOOT,
/* force */ false);
+ if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
+ updatedPackages.add(pkg);
+ }
}
+ notifyPinService(updatedPackages);
// Ran to completion, so we abandon our timeslice and do not reschedule.
jobFinished(jobParams, /* reschedule */ false);
}
@@ -265,6 +272,7 @@
private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
long lowStorageThreshold, boolean is_for_primary_dex,
ArraySet<String> failedPackageNames) {
+ ArraySet<String> updatedPackages = new ArraySet<>();
for (String pkg : pkgs) {
int abort_code = abortIdleOptimizations(lowStorageThreshold);
if (abort_code != OPTIMIZE_CONTINUE) {
@@ -284,14 +292,21 @@
// Optimize package if needed. Note that there can be no race between
// concurrent jobs because PackageDexOptimizer.performDexOpt is synchronized.
- boolean success = is_for_primary_dex
- ? pm.performDexOpt(pkg,
- /* checkProfiles */ true,
- PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false)
- : pm.performDexOptSecondary(pkg,
- PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false);
+ boolean success;
+ if (is_for_primary_dex) {
+ int result = pm.performDexOptWithStatus(pkg,
+ /* checkProfiles */ true,
+ PackageManagerService.REASON_BACKGROUND_DEXOPT,
+ /* force */ false);
+ success = result != PackageDexOptimizer.DEX_OPT_FAILED;
+ if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
+ updatedPackages.add(pkg);
+ }
+ } else {
+ success = pm.performDexOptSecondary(pkg,
+ PackageManagerService.REASON_BACKGROUND_DEXOPT,
+ /* force */ false);
+ }
if (success) {
// Dexopt succeeded, remove package from the list of failing ones.
synchronized (failedPackageNames) {
@@ -299,6 +314,7 @@
}
}
}
+ notifyPinService(updatedPackages);
return OPTIMIZE_PROCESSED;
}
@@ -366,11 +382,14 @@
return false;
}
+ boolean result;
if (params.getJobId() == JOB_POST_BOOT_UPDATE) {
- return runPostBootUpdate(params, pm, pkgs);
+ result = runPostBootUpdate(params, pm, pkgs);
} else {
- return runIdleOptimization(params, pm, pkgs);
+ result = runIdleOptimization(params, pm, pkgs);
}
+
+ return result;
}
@Override
@@ -386,4 +405,12 @@
}
return false;
}
+
+ private void notifyPinService(ArraySet<String> updatedPackages) {
+ PinnerService pinnerService = LocalServices.getService(PinnerService.class);
+ if (pinnerService != null) {
+ Log.i(TAG, "Pinning optimized code " + updatedPackages);
+ pinnerService.update(updatedPackages);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 6625331..ac7b763 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -77,8 +77,9 @@
private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
private static final boolean DEBUG = false;
- private static final int DEFAULT_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+ private static final int DEFAULT_FLAGS =
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.MATCH_UNINSTALLED_PACKAGES;
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b1068ae..5ddd2f1 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -20,7 +20,6 @@
import static android.Manifest.permission.INSTALL_PACKAGES;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
-import static android.Manifest.permission.REQUEST_INSTALL_PACKAGES;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@@ -100,10 +99,10 @@
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED;
-
import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter;
import android.Manifest;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -126,10 +125,8 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.AppsQueryHelper;
-import android.content.pm.ChangedPackages;
-import android.content.pm.ComponentInfo;
-import android.content.pm.InstantAppRequest;
import android.content.pm.AuxiliaryResolveInfo;
+import android.content.pm.ChangedPackages;
import android.content.pm.FallbackCategoryProvider;
import android.content.pm.FeatureInfo;
import android.content.pm.IOnPermissionsChangeListener;
@@ -142,6 +139,7 @@
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.InstantAppInfo;
+import android.content.pm.InstantAppRequest;
import android.content.pm.InstantAppResolveInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.IntentFilterVerificationInfo;
@@ -303,6 +301,8 @@
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream;
import java.security.MessageDigest;
@@ -441,6 +441,21 @@
private static final int[] EMPTY_INT_ARRAY = new int[0];
+ private static final int TYPE_UNKNOWN = 0;
+ private static final int TYPE_ACTIVITY = 1;
+ private static final int TYPE_RECEIVER = 2;
+ private static final int TYPE_SERVICE = 3;
+ private static final int TYPE_PROVIDER = 4;
+ @IntDef(prefix = { "TYPE_" }, value = {
+ TYPE_UNKNOWN,
+ TYPE_ACTIVITY,
+ TYPE_RECEIVER,
+ TYPE_SERVICE,
+ TYPE_PROVIDER,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ComponentType {}
+
/**
* Timeout (in milliseconds) after which the watchdog should declare that
* our handler thread is wedged. The usual default for such things is one
@@ -3086,16 +3101,19 @@
@Override
public boolean isFirstBoot() {
+ // allow instant applications
return mFirstBoot;
}
@Override
public boolean isOnlyCoreApps() {
+ // allow instant applications
return mOnlyCore;
}
@Override
public boolean isUpgrade() {
+ // allow instant applications
return mIsUpgrade;
}
@@ -3189,6 +3207,9 @@
@Override
public @Nullable ComponentName getInstantAppResolverComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
final Pair<ComponentName, String> instantAppResolver = getInstantAppResolverLPr();
if (instantAppResolver == null) {
@@ -3496,17 +3517,27 @@
* system partition.</li>
* </ol>
*/
- private boolean canAccessInstantApps(int callingUid) {
- final boolean isSpecialProcess =
- callingUid == Process.SYSTEM_UID
- || callingUid == Process.SHELL_UID
- || callingUid == 0;
- final boolean allowMatchInstant =
- isSpecialProcess
- || mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED;
- return allowMatchInstant;
+ private boolean canViewInstantApps(int callingUid, int userId) {
+ if (callingUid == Process.SYSTEM_UID
+ || callingUid == Process.SHELL_UID
+ || callingUid == Process.ROOT_UID) {
+ return true;
+ }
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED) {
+ return true;
+ }
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.VIEW_INSTANT_APPS) == PERMISSION_GRANTED) {
+ final ComponentName homeComponent = getDefaultHomeActivity(userId);
+ if (homeComponent != null
+ && isCallerSameApp(homeComponent.getPackageName(), callingUid)) {
+ return true;
+ }
+ }
+ return false;
}
+
private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
if (ps == null) {
@@ -3516,32 +3547,15 @@
if (p == null) {
return null;
}
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
// Filter out ephemeral app metadata:
// * The system/shell/root can see metadata for any app
// * An installed app can see metadata for 1) other installed apps
// and 2) ephemeral apps that have explicitly interacted with it
// * Ephemeral apps can only see their own data and exposed installed apps
// * Holding a signature permission allows seeing instant apps
- if (!canAccessInstantApps(callingUid)) {
- final String instantAppPackageName = getInstantAppPackageName(callingUid);
- if (instantAppPackageName != null) {
- // ephemeral apps can only get information on themselves or
- // installed apps that are exposed.
- if (!instantAppPackageName.equals(p.packageName)
- && (ps.getInstantApp(userId) || !p.visibleToInstantApps)) {
- return null;
- }
- } else {
- if (ps.getInstantApp(userId)) {
- // only get access to the ephemeral app if we've been granted access
- final int callingAppId = UserHandle.getAppId(callingUid);
- if (!mInstantAppRegistry.isInstantAccessGranted(
- userId, callingAppId, ps.appId)) {
- return null;
- }
- }
- }
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return null;
}
final PermissionsState permissionsState = ps.getPermissionsState();
@@ -3576,8 +3590,10 @@
@Override
public void checkPackageStartable(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
final boolean userKeyUnlocked = StorageManager.isUserKeyUnlocked(userId);
-
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps == null) {
@@ -3607,12 +3623,16 @@
@Override
public boolean isPackageAvailable(String packageName, int userId) {
if (!sUserManager.exists(userId)) return false;
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */, "is package available");
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "is package available");
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (p != null) {
final PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return false;
+ }
if (ps != null) {
final PackageUserState state = ps.readUserState(userId);
if (state != null) {
@@ -3695,6 +3715,47 @@
return null;
}
+ private boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) {
+ if (isComponentVisibleToInstantApp(component, TYPE_ACTIVITY)) {
+ return true;
+ }
+ if (isComponentVisibleToInstantApp(component, TYPE_SERVICE)) {
+ return true;
+ }
+ if (isComponentVisibleToInstantApp(component, TYPE_PROVIDER)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isComponentVisibleToInstantApp(
+ @Nullable ComponentName component, @ComponentType int type) {
+ if (type == TYPE_ACTIVITY) {
+ final PackageParser.Activity activity = mActivities.mActivities.get(component);
+ return activity != null
+ ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_RECEIVER) {
+ final PackageParser.Activity activity = mReceivers.mActivities.get(component);
+ return activity != null
+ ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_SERVICE) {
+ final PackageParser.Service service = mServices.mServices.get(component);
+ return service != null
+ ? (service.info.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_PROVIDER) {
+ final PackageParser.Provider provider = mProviders.mProviders.get(component);
+ return provider != null
+ ? (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_UNKNOWN) {
+ return isComponentVisibleToInstantApp(component);
+ }
+ return false;
+ }
+
/**
* Returns whether or not access to the application should be filtered.
* <p>
@@ -3703,29 +3764,36 @@
*
* @see #canAccessInstantApps(int)
*/
- private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid,
- @Nullable ComponentName component, boolean componentVisibleToInstantApp, int userId) {
+ private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid,
+ @Nullable ComponentName component, @ComponentType int componentType, int userId) {
// if we're in an isolated process, get the real calling UID
if (Process.isIsolated(callingUid)) {
callingUid = mIsolatedOwners.get(callingUid);
}
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
+ final boolean callerIsInstantApp = instantAppPkgName != null;
+ if (ps == null) {
+ if (callerIsInstantApp) {
+ // pretend the application exists, but, needs to be filtered
+ return true;
+ }
+ return false;
+ }
// if the target and caller are the same application, don't filter
if (isCallerSameApp(ps.name, callingUid)) {
return false;
}
- final String instantAppPkgName = getInstantAppPackageName(callingUid);
- final boolean callerIsInstantApp = instantAppPkgName != null;
if (callerIsInstantApp) {
// request for a specific component; if it hasn't been explicitly exposed, filter
if (component != null) {
- return !componentVisibleToInstantApp;
+ return !isComponentVisibleToInstantApp(component, componentType);
}
// request for application; if no components have been explicitly exposed, filter
- return !ps.pkg.visibleToInstantApps;
+ return ps.getInstantApp(userId) || !ps.pkg.visibleToInstantApps;
}
if (ps.getInstantApp(userId)) {
// caller can see all components of all instant applications, don't filter
- if (canAccessInstantApps(callingUid)) {
+ if (canViewInstantApps(callingUid, userId)) {
return false;
}
// request for a specific instant application component, filter
@@ -3742,8 +3810,8 @@
/**
* @see #filterAppAccessLPr(PackageSetting, int, ComponentName, boolean, int)
*/
- private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid, int userId) {
- return filterAppAccessLPr(ps, callingUid, null, false, userId);
+ private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid, int userId) {
+ return filterAppAccessLPr(ps, callingUid, null, TYPE_UNKNOWN, userId);
}
private boolean filterSharedLibPackageLPr(@Nullable PackageSetting ps, int uid, int userId,
@@ -3797,6 +3865,9 @@
@Override
public String[] currentToCanonicalPackageNames(String[] names) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return names;
+ }
String[] out = new String[names.length];
// reader
synchronized (mPackages) {
@@ -3810,6 +3881,9 @@
@Override
public String[] canonicalToCurrentPackageNames(String[] names) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return names;
+ }
String[] out = new String[names.length];
// reader
synchronized (mPackages) {
@@ -3824,19 +3898,25 @@
@Override
public int getPackageUid(String packageName, int flags, int userId) {
if (!sUserManager.exists(userId)) return -1;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */, "get package uid");
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getPackageUid");
// reader
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(packageName);
if (p != null && p.isMatch(flags)) {
+ PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return -1;
+ }
return UserHandle.getUid(userId, p.applicationInfo.uid);
}
if ((flags & MATCH_KNOWN_PACKAGES) != 0) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
- if (ps != null && ps.isMatch(flags)) {
+ if (ps != null && ps.isMatch(flags)
+ && !filterAppAccessLPr(ps, callingUid, userId)) {
return UserHandle.getUid(userId, ps.appId);
}
}
@@ -3848,23 +3928,27 @@
@Override
public int[] getPackageGids(String packageName, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */,
- "getPackageGids");
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getPackageGids");
// reader
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(packageName);
if (p != null && p.isMatch(flags)) {
PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return null;
+ }
// TODO: Shouldn't this be checking for package installed state for userId and
// return null?
return ps.getPermissionsState().computeGids(userId);
}
if ((flags & MATCH_KNOWN_PACKAGES) != 0) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
- if (ps != null && ps.isMatch(flags)) {
+ if (ps != null && ps.isMatch(flags)
+ && !filterAppAccessLPr(ps, callingUid, userId)) {
return ps.getPermissionsState().computeGids(userId);
}
}
@@ -3887,6 +3971,9 @@
@Override
public PermissionInfo getPermissionInfo(String name, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
final BasePermission p = mSettings.mPermissions.get(name);
@@ -3900,6 +3987,9 @@
@Override
public @Nullable ParceledListSlice<PermissionInfo> queryPermissionsByGroup(String group,
int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
if (group != null && !mPermissionGroups.containsKey(group)) {
@@ -3925,6 +4015,9 @@
@Override
public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
return PackageParser.generatePermissionGroupInfo(
@@ -3934,6 +4027,9 @@
@Override
public @NonNull ParceledListSlice<PermissionGroupInfo> getAllPermissionGroups(int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
// reader
synchronized (mPackages) {
final int N = mPermissionGroups.size();
@@ -4321,11 +4417,12 @@
flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
flags |= PackageManager.MATCH_INSTANT;
} else {
+ final boolean wantMatchInstant = (flags & PackageManager.MATCH_INSTANT) != 0;
final boolean allowMatchInstant =
(wantInstantApps
&& Intent.ACTION_VIEW.equals(intent.getAction())
&& hasWebURI(intent))
- || canAccessInstantApps(callingUid);
+ || (wantMatchInstant && canViewInstantApps(callingUid, userId));
flags &= ~(PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY
| PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY);
if (!allowMatchInstant) {
@@ -4367,9 +4464,7 @@
if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, userId)) {
return null;
}
return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
@@ -4390,10 +4485,19 @@
// The resolver supports EVERYTHING!
return true;
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
PackageParser.Activity a = mActivities.mActivities.get(component);
if (a == null) {
return false;
}
+ PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
+ if (ps == null) {
+ return false;
+ }
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, callingUserId)) {
+ return false;
+ }
for (int i=0; i<a.intents.size(); i++) {
if (a.intents.get(i).match(intent.getAction(), resolvedType, intent.getScheme(),
intent.getData(), intent.getCategories(), TAG) >= 0) {
@@ -4407,8 +4511,9 @@
@Override
public ActivityInfo getReceiverInfo(ComponentName component, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForComponent(flags, userId, component);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */, "get receiver info");
synchronized (mPackages) {
PackageParser.Activity a = mReceivers.mActivities.get(component);
@@ -4417,6 +4522,9 @@
if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) {
+ return null;
+ }
return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
}
}
@@ -4428,6 +4536,9 @@
int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0");
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
flags = updateFlagsForPackage(flags, userId, null);
@@ -4547,9 +4658,7 @@
if (s != null && mSettings.isEnabledAndMatchLPr(s.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (s.info.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) {
return null;
}
ServiceInfo si = PackageParser.generateServiceInfo(s, flags,
@@ -4577,9 +4686,7 @@
if (p != null && mSettings.isEnabledAndMatchLPr(p.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (p.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
return null;
}
ProviderInfo pi = PackageParser.generateProviderInfo(p, flags,
@@ -4595,6 +4702,7 @@
@Override
public String[] getSystemSharedLibraryNames() {
+ // allow instant applications
synchronized (mPackages) {
Set<String> libs = null;
final int libCount = mSharedLibraries.size();
@@ -4638,6 +4746,7 @@
@Override
public @NonNull String getServicesSystemSharedLibraryPackageName() {
+ // allow instant applications
synchronized (mPackages) {
return mServicesSystemSharedLibraryPackageName;
}
@@ -4645,6 +4754,7 @@
@Override
public @NonNull String getSharedSystemSharedLibraryPackageName() {
+ // allow instant applications
synchronized (mPackages) {
return mSharedSystemSharedLibraryPackageName;
}
@@ -4675,6 +4785,9 @@
@Override
public ChangedPackages getChangedPackages(int sequenceNumber, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
if (sequenceNumber >= mChangedPackagesSequenceNumber) {
return null;
@@ -4698,6 +4811,7 @@
@Override
public @NonNull ParceledListSlice<FeatureInfo> getSystemAvailableFeatures() {
+ // allow instant applications
ArrayList<FeatureInfo> res;
synchronized (mAvailableFeatures) {
res = new ArrayList<>(mAvailableFeatures.size() + 1);
@@ -4713,6 +4827,7 @@
@Override
public boolean hasSystemFeature(String name, int version) {
+ // allow instant applications
synchronized (mAvailableFeatures) {
final FeatureInfo feat = mAvailableFeatures.get(name);
if (feat == null) {
@@ -4728,14 +4843,26 @@
if (!sUserManager.exists(userId)) {
return PackageManager.PERMISSION_DENIED;
}
+ final int callingUid = Binder.getCallingUid();
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(pkgName);
if (p != null && p.mExtras != null) {
final PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ final boolean instantApp = ps.getInstantApp(userId);
final PermissionsState permissionsState = ps.getPermissionsState();
if (permissionsState.hasPermission(permName, userId)) {
- return PackageManager.PERMISSION_GRANTED;
+ if (instantApp) {
+ BasePermission bp = mSettings.mPermissions.get(permName);
+ if (bp != null && bp.isInstant()) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } else {
+ return PackageManager.PERMISSION_GRANTED;
+ }
}
// Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -4750,8 +4877,11 @@
@Override
public int checkUidPermission(String permName, int uid) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
+ final boolean isUidInstantApp = getInstantAppPackageName(uid) != null;
final int userId = UserHandle.getUserId(uid);
-
if (!sUserManager.exists(userId)) {
return PackageManager.PERMISSION_DENIED;
}
@@ -4759,10 +4889,27 @@
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj != null) {
- final SettingBase ps = (SettingBase) obj;
- final PermissionsState permissionsState = ps.getPermissionsState();
+ if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ } else if (obj instanceof PackageSetting) {
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ }
+ final SettingBase settingBase = (SettingBase) obj;
+ final PermissionsState permissionsState = settingBase.getPermissionsState();
if (permissionsState.hasPermission(permName, userId)) {
- return PackageManager.PERMISSION_GRANTED;
+ if (isUidInstantApp) {
+ BasePermission bp = mSettings.mPermissions.get(permName);
+ if (bp != null && bp.isInstant()) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } else {
+ return PackageManager.PERMISSION_GRANTED;
+ }
}
// Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -4799,6 +4946,17 @@
return false;
}
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ if (!isCallerSameApp(packageName, callingUid)) {
+ return false;
+ }
+ } else {
+ if (isInstantApp(packageName, userId)) {
+ return false;
+ }
+ }
+
final long identity = Binder.clearCallingIdentity();
try {
final int flags = getPermissionFlags(permission, packageName, userId);
@@ -4810,6 +4968,9 @@
@Override
public String getPermissionControllerPackageName() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
return mRequiredInstallerPackage;
}
@@ -4944,6 +5105,9 @@
}
boolean addPermissionLocked(PermissionInfo info, boolean async) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant apps can't add permissions");
+ }
if (info.labelRes == 0 && info.nonLocalizedLabel == null) {
throw new SecurityException("Label must be specified in permission");
}
@@ -5003,6 +5167,9 @@
@Override
public void removePermission(String name) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
checkPermissionTreeLP(name);
BasePermission bp = mSettings.mPermissions.get(name);
@@ -5018,8 +5185,8 @@
}
}
- private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(PackageParser.Package pkg,
- BasePermission bp) {
+ private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(
+ PackageParser.Package pkg, BasePermission bp) {
int index = pkg.requestedPermissions.indexOf(bp.name);
if (index == -1) {
throw new SecurityException("Package " + pkg.packageName
@@ -5536,6 +5703,9 @@
@Override
public void removeOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
mOnPermissionChangeListeners.removeListenerLocked(listener);
}
@@ -5543,6 +5713,7 @@
@Override
public boolean isProtectedBroadcast(String actionName) {
+ // allow instant applications
synchronized (mPackages) {
if (mProtectedBroadcasts.contains(actionName)) {
return true;
@@ -5568,12 +5739,23 @@
|| p2 == null || p2.mExtras == null) {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps1 = (PackageSetting) p1.mExtras;
+ final PackageSetting ps2 = (PackageSetting) p2.mExtras;
+ if (filterAppAccessLPr(ps1, callingUid, callingUserId)
+ || filterAppAccessLPr(ps2, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
return compareSignatures(p1.mSignatures, p2.mSignatures);
}
}
@Override
public int checkUidSignatures(int uid1, int uid2) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
// Map to base uids.
uid1 = UserHandle.getAppId(uid1);
uid2 = UserHandle.getAppId(uid2);
@@ -5584,9 +5766,16 @@
Object obj = mSettings.getUserIdLPr(uid1);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
s1 = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
- s1 = ((PackageSetting)obj).signatures.mSignatures;
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
+ s1 = ps.signatures.mSignatures;
} else {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
@@ -5596,9 +5785,16 @@
obj = mSettings.getUserIdLPr(uid2);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
s2 = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
- s2 = ((PackageSetting)obj).signatures.mSignatures;
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
+ s2 = ps.signatures.mSignatures;
} else {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
@@ -5764,19 +5960,53 @@
@Override
public List<String> getAllPackages() {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mPackages) {
- return new ArrayList<String>(mPackages.keySet());
+ if (canViewInstantApps(callingUid, callingUserId)) {
+ return new ArrayList<String>(mPackages.keySet());
+ }
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
+ final List<String> result = new ArrayList<>();
+ if (instantAppPkgName != null) {
+ // caller is an instant application; filter unexposed applications
+ for (PackageParser.Package pkg : mPackages.values()) {
+ if (!pkg.visibleToInstantApps) {
+ continue;
+ }
+ result.add(pkg.packageName);
+ }
+ } else {
+ // caller is a normal application; filter instant applications
+ for (PackageParser.Package pkg : mPackages.values()) {
+ final PackageSetting ps =
+ pkg.mExtras != null ? (PackageSetting) pkg.mExtras : null;
+ if (ps != null
+ && ps.getInstantApp(callingUserId)
+ && !mInstantAppRegistry.isInstantAccessGranted(
+ callingUserId, UserHandle.getAppId(callingUid), ps.appId)) {
+ continue;
+ }
+ result.add(pkg.packageName);
+ }
+ }
+ return result;
}
}
@Override
public String[] getPackagesForUid(int uid) {
+ final int callingUid = Binder.getCallingUid();
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
final int userId = UserHandle.getUserId(uid);
uid = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(uid);
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return null;
+ }
final SharedUserSetting sus = (SharedUserSetting) obj;
final int N = sus.packages.size();
String[] res = new String[N];
@@ -5793,7 +6023,7 @@
return res;
} else if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
- if (ps.getInstalled(userId)) {
+ if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) {
return new String[]{ps.name};
}
}
@@ -5803,7 +6033,10 @@
@Override
public String getNameForUid(int uid) {
- // reader
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return null;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5811,6 +6044,9 @@
return sus.name + ":" + sus.userId;
} else if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) {
+ return null;
+ }
return ps.name;
}
}
@@ -5819,7 +6055,10 @@
@Override
public int getUidForSharedUser(String sharedUserName) {
- if(sharedUserName == null) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return -1;
+ }
+ if (sharedUserName == null) {
return -1;
}
// reader
@@ -5839,6 +6078,9 @@
@Override
public int getFlagsForUid(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5854,6 +6096,9 @@
@Override
public int getPrivateFlagsForUid(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5869,6 +6114,9 @@
@Override
public boolean isUidPrivileged(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
uid = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
@@ -5891,6 +6139,9 @@
@Override
public String[] getAppOpPermissionPackages(String permissionName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
ArraySet<String> pkgs = mAppOpPermissionPackages.get(permissionName);
if (pkgs == null) {
@@ -5956,6 +6207,9 @@
@Override
public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
IntentFilter filter, int match, ComponentName activity) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
final int userId = UserHandle.getCallingUserId();
if (DEBUG_PREFERRED) {
Log.v(TAG, "setLastChosenActivity intent=" + intent
@@ -5979,6 +6233,9 @@
@Override
public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
final int userId = UserHandle.getCallingUserId();
if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent);
final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags,
@@ -6440,12 +6697,12 @@
* instant, returns {@code null}.
*/
private String getInstantAppPackageName(int callingUid) {
- // If the caller is an isolated app use the owner's uid for the lookup.
- if (Process.isIsolated(callingUid)) {
- callingUid = mIsolatedOwners.get(callingUid);
- }
- final int appId = UserHandle.getAppId(callingUid);
synchronized (mPackages) {
+ // If the caller is an isolated app use the owner's uid for the lookup.
+ if (Process.isIsolated(callingUid)) {
+ callingUid = mIsolatedOwners.get(callingUid);
+ }
+ final int appId = UserHandle.getAppId(callingUid);
final Object obj = mSettings.getUserIdLPr(appId);
if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
@@ -7360,6 +7617,7 @@
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
flags = updateFlagsForResolve(flags, userId, intent, callingUid,
false /*includeInstantApps*/);
ComponentName comp = intent.getComponent();
@@ -7370,26 +7628,61 @@
}
}
if (comp != null) {
- List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
- ActivityInfo ai = getReceiverInfo(comp, flags, userId);
+ final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final ActivityInfo ai = getReceiverInfo(comp, flags, userId);
if (ai != null) {
- ResolveInfo ri = new ResolveInfo();
- ri.activityInfo = ai;
- list.add(ri);
+ // When specifying an explicit component, we prevent the activity from being
+ // used when either 1) the calling package is normal and the activity is within
+ // an instant application or 2) the calling package is ephemeral and the
+ // activity is not visible to instant applications.
+ final boolean matchInstantApp =
+ (flags & PackageManager.MATCH_INSTANT) != 0;
+ final boolean matchVisibleToInstantAppOnly =
+ (flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
+ final boolean matchExplicitlyVisibleOnly =
+ (flags & PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY) != 0;
+ final boolean isCallerInstantApp =
+ instantAppPkgName != null;
+ final boolean isTargetSameInstantApp =
+ comp.getPackageName().equals(instantAppPkgName);
+ final boolean isTargetInstantApp =
+ (ai.applicationInfo.privateFlags
+ & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
+ final boolean isTargetVisibleToInstantApp =
+ (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
+ final boolean isTargetExplicitlyVisibleToInstantApp =
+ isTargetVisibleToInstantApp
+ && (ai.flags & ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP) == 0;
+ final boolean isTargetHiddenFromInstantApp =
+ !isTargetVisibleToInstantApp
+ || (matchExplicitlyVisibleOnly && !isTargetExplicitlyVisibleToInstantApp);
+ final boolean blockResolution =
+ !isTargetSameInstantApp
+ && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
+ || (matchVisibleToInstantAppOnly && isCallerInstantApp
+ && isTargetHiddenFromInstantApp));
+ if (!blockResolution) {
+ ResolveInfo ri = new ResolveInfo();
+ ri.activityInfo = ai;
+ list.add(ri);
+ }
}
- return list;
+ return applyPostResolutionFilter(list, instantAppPkgName);
}
// reader
synchronized (mPackages) {
String pkgName = intent.getPackage();
if (pkgName == null) {
- return mReceivers.queryIntent(intent, resolvedType, flags, userId);
+ final List<ResolveInfo> result =
+ mReceivers.queryIntent(intent, resolvedType, flags, userId);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
final PackageParser.Package pkg = mPackages.get(pkgName);
if (pkg != null) {
- return mReceivers.queryIntentForPackage(intent, resolvedType, flags, pkg.receivers,
- userId);
+ final List<ResolveInfo> result = mReceivers.queryIntentForPackage(
+ intent, resolvedType, flags, pkg.receivers, userId);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
return Collections.emptyList();
}
@@ -7662,6 +7955,9 @@
@Override
public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForPackage(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
@@ -7776,6 +8072,9 @@
@Override
public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForApplication(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
@@ -7839,7 +8138,6 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return null;
}
-
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
"getEphemeralApplications");
enforceCrossUserPermission(Binder.getCallingUid(), userId,
@@ -7863,9 +8161,9 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return false;
}
- int uid = Binder.getCallingUid();
- if (Process.isIsolated(uid)) {
- uid = mIsolatedOwners.get(uid);
+ int callingUid = Binder.getCallingUid();
+ if (Process.isIsolated(callingUid)) {
+ callingUid = mIsolatedOwners.get(callingUid);
}
synchronized (mPackages) {
@@ -7873,12 +8171,10 @@
PackageParser.Package pkg = mPackages.get(packageName);
final boolean returnAllowed =
ps != null
- && (isCallerSameApp(packageName, uid)
- || mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_INSTANT_APPS)
- == PERMISSION_GRANTED
+ && (isCallerSameApp(packageName, callingUid)
+ || canViewInstantApps(callingUid, userId)
|| mInstantAppRegistry.isInstantAccessGranted(
- userId, UserHandle.getAppId(uid), ps.appId));
+ userId, UserHandle.getAppId(callingUid), ps.appId));
if (returnAllowed) {
return ps.getInstantApp(userId);
}
@@ -7949,6 +8245,9 @@
@Override
public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
return new ParceledListSlice<>(getPersistentApplicationsInternal(flags));
}
@@ -8032,6 +8331,9 @@
*/
@Deprecated
public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
// reader
synchronized (mPackages) {
final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProvidersByAuthority
@@ -8059,11 +8361,11 @@
@Override
public @NonNull ParceledListSlice<ProviderInfo> queryContentProviders(String processName,
int uid, int flags, String metaDataKey) {
+ final int callingUid = Binder.getCallingUid();
final int userId = processName != null ? UserHandle.getUserId(uid)
: UserHandle.getCallingUserId();
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForComponent(flags, userId, processName);
-
ArrayList<ProviderInfo> finalList = null;
// reader
synchronized (mPackages) {
@@ -8083,7 +8385,11 @@
&& (p.metaData == null || !p.metaData.containsKey(metaDataKey))) {
continue;
}
-
+ final ComponentName component =
+ new ComponentName(p.info.packageName, p.info.name);
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
+ continue;
+ }
if (finalList == null) {
finalList = new ArrayList<ProviderInfo>(3);
}
@@ -8105,10 +8411,17 @@
}
@Override
- public InstrumentationInfo getInstrumentationInfo(ComponentName name, int flags) {
+ public InstrumentationInfo getInstrumentationInfo(ComponentName component, int flags) {
// reader
synchronized (mPackages) {
- final PackageParser.Instrumentation i = mInstrumentation.get(name);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
+ if (ps == null) return null;
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_UNKNOWN, callingUserId)) {
+ return null;
+ }
+ final PackageParser.Instrumentation i = mInstrumentation.get(component);
return PackageParser.generateInstrumentationInfo(i, flags);
}
}
@@ -8116,6 +8429,12 @@
@Override
public @NonNull ParceledListSlice<InstrumentationInfo> queryInstrumentation(
String targetPackage, int flags) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps = mSettings.mPackages.get(targetPackage);
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return ParceledListSlice.emptyList();
+ }
return new ParceledListSlice<>(queryInstrumentationInternal(targetPackage, flags));
}
@@ -8727,7 +9046,7 @@
*/
private static final void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid();
- if (uid != Process.SYSTEM_UID && uid != 0) {
+ if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) {
throw new SecurityException(message);
}
}
@@ -8902,7 +9221,18 @@
@Override
public void notifyPackageUse(String packageName, int reason) {
synchronized (mPackages) {
- PackageParser.Package p = mPackages.get(packageName);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ if (getInstantAppPackageName(callingUid) != null) {
+ if (!isCallerSameApp(packageName, callingUid)) {
+ return;
+ }
+ } else {
+ if (isInstantApp(packageName, callingUserId)) {
+ return;
+ }
+ }
+ final PackageParser.Package p = mPackages.get(packageName);
if (p == null) {
return;
}
@@ -8925,14 +9255,28 @@
@Override
public boolean performDexOpt(String packageName,
boolean checkProfiles, int compileReason, boolean force) {
- int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
+ return performDexOptWithStatus(packageName, checkProfiles, compileReason, force) !=
+ PackageDexOptimizer.DEX_OPT_FAILED;
+ }
+
+ /**
+ * Perform dexopt on the given package and return one of following result:
+ * {@link PackageDexOptimizer#DEX_OPT_SKIPPED}
+ * {@link PackageDexOptimizer#DEX_OPT_PERFORMED}
+ * {@link PackageDexOptimizer#DEX_OPT_FAILED}
+ */
+ /* package */ int performDexOptWithStatus(String packageName,
+ boolean checkProfiles, int compileReason, boolean force) {
+ return performDexOptTraced(packageName, checkProfiles,
getCompilerFilterForReason(compileReason), force);
- return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
}
@Override
public boolean performDexOptMode(String packageName,
boolean checkProfiles, String targetCompilerFilter, boolean force) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
targetCompilerFilter, force);
return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
@@ -9026,6 +9370,9 @@
@Override
public boolean performDexOptSecondary(String packageName, String compilerFilter,
boolean force) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
mDexManager.reconcileSecondaryDexFiles(packageName);
return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force);
}
@@ -9042,6 +9389,9 @@
*/
@Override
public void reconcileSecondaryDexFiles(String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
mDexManager.reconcileSecondaryDexFiles(packageName);
}
@@ -9056,6 +9406,9 @@
*/
@Override
public boolean runBackgroundDexoptJob() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext);
}
@@ -13509,6 +13862,9 @@
@Override
public PackageCleanItem nextPackageToClean(PackageCleanItem lastPackage) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// writer
synchronized (mPackages) {
if (!isExternalMediaAvailable()) {
@@ -14090,15 +14446,16 @@
@Override
public boolean isPackageSuspendedForUser(String packageName, int userId) {
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */,
"isPackageSuspendedForUser for user " + userId);
synchronized (mPackages) {
- final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
- if (pkgSetting == null) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
throw new IllegalArgumentException("Unknown target package: " + packageName);
}
- return pkgSetting.getSuspended(userId);
+ return ps.getSuspended(userId);
}
}
@@ -14423,6 +14780,9 @@
@Override
public int getIntentVerificationStatus(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
+ }
synchronized (mPackages) {
return mSettings.getIntentFilterVerificationStatusLPr(packageName, userId);
}
@@ -14446,6 +14806,9 @@
@Override
public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications(
String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
synchronized (mPackages) {
return new ParceledListSlice<>(mSettings.getIntentFilterVerificationsLPr(packageName));
}
@@ -14456,11 +14819,20 @@
if (TextUtils.isEmpty(packageName)) {
return ParceledListSlice.emptyList();
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
if (pkg == null || pkg.activities == null) {
return ParceledListSlice.emptyList();
}
+ if (pkg.mExtras == null) {
+ return ParceledListSlice.emptyList();
+ }
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return ParceledListSlice.emptyList();
+ }
final int count = pkg.activities.size();
ArrayList<IntentFilter> result = new ArrayList<>();
for (int n=0; n<count; n++) {
@@ -14490,6 +14862,9 @@
@Override
public String getDefaultBrowserPackageName(int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
return mSettings.getDefaultBrowserPackageNameLPw(userId);
}
@@ -14508,7 +14883,10 @@
@Override
public void setInstallerPackageName(String targetPackage, String installerPackageName) {
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
// writer
synchronized (mPackages) {
PackageSetting targetPackageSetting = mSettings.mPackages.get(targetPackage);
@@ -14528,17 +14906,17 @@
}
Signature[] callerSignature;
- Object obj = mSettings.getUserIdLPr(uid);
+ Object obj = mSettings.getUserIdLPr(callingUid);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
callerSignature = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
callerSignature = ((PackageSetting)obj).signatures.mSignatures;
} else {
- throw new SecurityException("Bad object " + obj + " for uid " + uid);
+ throw new SecurityException("Bad object " + obj + " for uid " + callingUid);
}
} else {
- throw new SecurityException("Unknown calling UID: " + uid);
+ throw new SecurityException("Unknown calling UID: " + callingUid);
}
// Verify: can't set installerPackageName to a package that is
@@ -14583,6 +14961,9 @@
@Override
public void setApplicationCategoryHint(String packageName, int categoryHint,
String callerPackageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
mContext.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
callerPackageName);
synchronized (mPackages) {
@@ -16592,9 +16973,13 @@
}
}
+ @Override
public List<String> getPreviousCodePaths(String packageName) {
+ final List<String> result = new ArrayList<>();
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return result;
+ }
final PackageSetting ps = mSettings.mPackages.get(packageName);
- final List<String> result = new ArrayList<String>();
if (ps != null && ps.oldCodePaths != null) {
result.addAll(ps.oldCodePaths);
}
@@ -18002,7 +18387,7 @@
private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
- || callingUid == Process.SYSTEM_UID) {
+ || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
return true;
}
final int callingUserId = UserHandle.getUserId(callingUid);
@@ -18043,6 +18428,11 @@
@Override
public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null
+ && !isCallerSameApp(packageName, callingUid)) {
+ return false;
+ }
return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL);
}
@@ -18141,7 +18531,7 @@
pkg.staticSharedLibVersion);
if (libEntry != null) {
for (int currUserId : allUsers) {
- if (userId != UserHandle.USER_ALL && userId != currUserId) {
+ if (removeUser != UserHandle.USER_ALL && removeUser != currUserId) {
continue;
}
List<VersionedPackage> libClientPackages = getPackagesUsingSharedLibraryLPr(
@@ -18719,11 +19109,7 @@
@Override
public boolean setRequiredForSystemUser(String packageName, boolean systemUserApp) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID) {
- throw new SecurityException(
- "setRequiredForSystemUser can only be run by the system or root");
- }
+ enforceSystemOrRoot("setRequiredForSystemUser can only be run by the system or root");
synchronized (mPackages) {
PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps == null) {
@@ -19577,18 +19963,21 @@
@Override
public void clearPackagePreferredActivities(String packageName) {
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
// writer
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
- if (pkg == null || pkg.applicationInfo.uid != uid) {
+ if (pkg == null || pkg.applicationInfo.uid != callingUid) {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
- if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid())
+ if (getUidTargetSdkVersionLockedLPr(callingUid)
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid "
- + Binder.getCallingUid());
+ + callingUid);
return;
}
mContext.enforceCallingOrSelfPermission(
@@ -19711,7 +20100,9 @@
@Override
public int getPreferredActivities(List<IntentFilter> outFilters,
List<ComponentName> outActivities, String packageName) {
-
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
int num = 0;
final int userId = UserHandle.getCallingUserId();
// reader
@@ -20280,6 +20671,9 @@
@Override
public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
}
@@ -20364,6 +20758,9 @@
@Override
public void setHomeActivity(ComponentName comp, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
getHomeActivitiesAsUser(homeActivities, userId);
@@ -20461,43 +20858,58 @@
+ newState);
}
PackageSetting pkgSetting;
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
final int permission;
- if (uid == Process.SYSTEM_UID) {
+ if (callingUid == Process.SYSTEM_UID) {
permission = PackageManager.PERMISSION_GRANTED;
} else {
permission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
}
- enforceCrossUserPermission(uid, userId,
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, true /* checkShell */, "set enabled");
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
boolean sendNow = false;
boolean isApp = (className == null);
+ final boolean isCallerInstantApp = (getInstantAppPackageName(callingUid) != null);
String componentName = isApp ? packageName : className;
int packageUid = -1;
ArrayList<String> components;
- // writer
+ // reader
synchronized (mPackages) {
pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting == null) {
- if (className == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
+ if (!isCallerInstantApp) {
+ if (className == null) {
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ throw new IllegalArgumentException(
+ "Unknown component: " + packageName + "/" + className);
+ } else {
+ // throw SecurityException to prevent leaking package information
+ throw new SecurityException(
+ "Attempt to change component state; "
+ + "pid=" + Binder.getCallingPid()
+ + ", uid=" + callingUid
+ + (className == null
+ ? ", package=" + packageName
+ : ", component=" + packageName + "/" + className));
}
- throw new IllegalArgumentException(
- "Unknown component: " + packageName + "/" + className);
}
}
// Limit who can change which apps
- if (!UserHandle.isSameApp(uid, pkgSetting.appId)) {
+ if (!UserHandle.isSameApp(callingUid, pkgSetting.appId)) {
// Don't allow apps that don't have permission to modify other apps
if (!allowedByPermission) {
throw new SecurityException(
- "Permission Denial: attempt to change component state from pid="
- + Binder.getCallingPid()
- + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
+ "Attempt to change component state; "
+ + "pid=" + Binder.getCallingPid()
+ + ", uid=" + callingUid
+ + (className == null
+ ? ", package=" + packageName
+ : ", component=" + packageName + "/" + className));
}
// Don't allow changing protected packages.
if (mProtectedPackages.isPackageStateProtected(userId, packageName)) {
@@ -20506,7 +20918,7 @@
}
synchronized (mPackages) {
- if (uid == Process.SHELL_UID
+ if (callingUid == Process.SHELL_UID
&& (pkgSetting.pkgFlags & ApplicationInfo.FLAG_TEST_ONLY) == 0) {
// Shell can only change whole packages between ENABLED and DISABLED_USER states
// unless it is a test package.
@@ -20622,6 +21034,9 @@
@Override
public void flushPackageRestrictionsAsUser(int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
if (!sUserManager.exists(userId)) {
return;
}
@@ -20660,16 +21075,19 @@
@Override
public void setPackageStoppedState(String packageName, boolean stopped, int userId) {
if (!sUserManager.exists(userId)) return;
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
final int permission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
- enforceCrossUserPermission(uid, userId,
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, true /* checkShell */, "stop package");
// writer
synchronized (mPackages) {
if (mSettings.setPackageStoppedStateLPw(this, packageName, stopped,
- allowedByPermission, uid, userId)) {
+ allowedByPermission, callingUid, userId)) {
scheduleWritePackageRestrictionsLocked(userId);
}
}
@@ -20677,6 +21095,9 @@
@Override
public String getInstallerPackageName(String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
return mSettings.getInstallerPackageNameLPr(packageName);
@@ -20693,24 +21114,30 @@
@Override
public int getApplicationEnabledSetting(String packageName, int userId) {
if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
- int uid = Binder.getCallingUid();
- enforceCrossUserPermission(uid, userId,
+ int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */, "get enabled");
// reader
synchronized (mPackages) {
+ if (filterAppAccessLPr(mSettings.getPackageLPr(packageName), callingUid, userId)) {
+ return COMPONENT_ENABLED_STATE_DISABLED;
+ }
return mSettings.getApplicationEnabledSettingLPr(packageName, userId);
}
}
@Override
- public int getComponentEnabledSetting(ComponentName componentName, int userId) {
+ public int getComponentEnabledSetting(ComponentName component, int userId) {
if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
- int uid = Binder.getCallingUid();
- enforceCrossUserPermission(uid, userId,
- false /* requireFullPermission */, false /* checkShell */, "get component enabled");
- // reader
+ int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getComponentEnabled");
synchronized (mPackages) {
- return mSettings.getComponentEnabledSettingLPr(componentName, userId);
+ if (filterAppAccessLPr(mSettings.getPackageLPr(component.getPackageName()), callingUid,
+ component, TYPE_UNKNOWN, userId)) {
+ return COMPONENT_ENABLED_STATE_DISABLED;
+ }
+ return mSettings.getComponentEnabledSettingLPr(component, userId);
}
}
@@ -20725,6 +21152,8 @@
@Override
public void systemReady() {
+ enforceSystemOrRoot("Only the system can claim the system is ready");
+
mSystemReady = true;
final ContentResolver resolver = mContext.getContentResolver();
ContentObserver co = new ContentObserver(mHandler) {
@@ -20872,11 +21301,13 @@
@Override
public boolean isSafeMode() {
+ // allow instant applications
return mSafeMode;
}
@Override
public boolean hasSystemUidErrors() {
+ // allow instant applications
return mHasSystemUidErrors;
}
@@ -21838,10 +22269,7 @@
*/
@Override
public void updateExternalMediaStatus(final boolean mediaStatus, final boolean reportStatus) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != 0 && callingUid != Process.SYSTEM_UID) {
- throw new SecurityException("Media status can only be updated by the system");
- }
+ enforceSystemOrRoot("Media status can only be updated by the system");
// reader; this apparently protects mMediaMounted, but should probably
// be a different lock in that case.
synchronized (mPackages) {
@@ -23173,6 +23601,7 @@
@Override
public int getInstallLocation() {
+ // allow instant app access
return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
PackageHelper.APP_INSTALL_AUTO);
@@ -23313,11 +23742,13 @@
@Override
@Deprecated
public boolean isPermissionEnforced(String permission) {
+ // allow instant applications
return true;
}
@Override
public boolean isStorageLow() {
+ // allow instant applications
final long token = Binder.clearCallingIdentity();
try {
final DeviceStorageMonitorInternal
@@ -23334,6 +23765,9 @@
@Override
public IPackageInstaller getPackageInstaller() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return mInstallerService;
}
@@ -23381,13 +23815,22 @@
return null;
}
synchronized(mPackages) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
final PackageParser.Package pkg = mPackages.get(packageName);
if (pkg == null) {
Slog.w(TAG, "KeySet requested for unknown package: " + packageName);
throw new IllegalArgumentException("Unknown package: " + packageName);
}
- if (pkg.applicationInfo.uid != Binder.getCallingUid()
- && Process.SYSTEM_UID != Binder.getCallingUid()) {
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ // filter and pretend the package doesn't exist
+ Slog.w(TAG, "KeySet requested for filtered package: " + packageName
+ + ", uid:" + callingUid);
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ if (pkg.applicationInfo.uid != callingUid
+ && Process.SYSTEM_UID != callingUid) {
throw new SecurityException("May not access signing KeySet of other apps.");
}
KeySetManagerService ksms = mSettings.mKeySetManagerService;
@@ -23397,6 +23840,9 @@
@Override
public boolean isPackageSignedByKeySet(String packageName, KeySet ks) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
if (packageName == null || ks == null) {
return false;
}
@@ -23417,6 +23863,9 @@
@Override
public boolean isPackageSignedByKeySetExactly(String packageName, KeySet ks) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
if (packageName == null || ks == null) {
return false;
}
@@ -23956,8 +24405,8 @@
}
@Override
- public boolean canAccessInstantApps(int callingUid) {
- return PackageManagerService.this.canAccessInstantApps(callingUid);
+ public boolean canAccessInstantApps(int callingUid, int userId) {
+ return PackageManagerService.this.canViewInstantApps(callingUid, userId);
}
}
@@ -24015,8 +24464,12 @@
* Logs process start information (including base APK hash) to the security log.
* @hide
*/
+ @Override
public void logAppProcessStartIfNeeded(String processName, int uid, String seinfo,
String apkFile, int pid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
if (!SecurityLog.isLoggingEnabled()) {
return;
}
@@ -24051,11 +24504,15 @@
@Override
public int getInstallReason(String packageName, int userId) {
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */,
"get install reason");
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return PackageManager.INSTALL_REASON_UNKNOWN;
+ }
if (ps != null) {
return ps.getInstallReason(userId);
}
@@ -24065,6 +24522,9 @@
@Override
public boolean canRequestPackageInstalls(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
return canRequestPackageInstallsInternal(packageName, 0, userId,
true /* throwIfPermNotDeclared*/);
}
@@ -24115,6 +24575,9 @@
@Override
public ComponentName getInstantAppInstallerComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return mInstantAppInstallerActivity == null
? null : mInstantAppInstallerActivity.getComponentName();
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ae9852e..908e517 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -5333,11 +5333,12 @@
@Override
public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs,
WindowState attached, WindowState imeTarget) {
- final boolean visible = win.isVisibleLw() && win.getAttrs().alpha > 0f;
- if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisible=" + visible);
+ final boolean affectsSystemUi = win.canAffectSystemUiFlags();
+ if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": affectsSystemUi=" + affectsSystemUi);
applyKeyguardPolicyLw(win, imeTarget);
final int fl = PolicyControl.getWindowFlags(win, attrs);
- if (mTopFullscreenOpaqueWindowState == null && visible && attrs.type == TYPE_INPUT_METHOD) {
+ if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi
+ && attrs.type == TYPE_INPUT_METHOD) {
mForcingShowNavBar = true;
mForcingShowNavBarLayer = win.getSurfaceLayer();
}
@@ -5353,7 +5354,7 @@
boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW
&& attrs.type < FIRST_SYSTEM_WINDOW;
final int stackId = win.getStackId();
- if (mTopFullscreenOpaqueWindowState == null && visible) {
+ if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi) {
if ((fl & FLAG_FORCE_NOT_FULLSCREEN) != 0) {
mForceStatusBar = true;
}
@@ -5385,7 +5386,7 @@
}
// Voice interaction overrides both top fullscreen and top docked.
- if (visible && win.getAttrs().type == TYPE_VOICE_INTERACTION) {
+ if (affectsSystemUi && win.getAttrs().type == TYPE_VOICE_INTERACTION) {
if (mTopFullscreenOpaqueWindowState == null) {
mTopFullscreenOpaqueWindowState = win;
if (mTopFullscreenOpaqueOrDimmingWindowState == null) {
@@ -5401,7 +5402,7 @@
}
// Keep track of the window if it's dimming but not necessarily fullscreen.
- if (mTopFullscreenOpaqueOrDimmingWindowState == null && visible
+ if (mTopFullscreenOpaqueOrDimmingWindowState == null && affectsSystemUi
&& win.isDimming() && StackId.normallyFullscreenWindows(stackId)) {
mTopFullscreenOpaqueOrDimmingWindowState = win;
}
@@ -5409,7 +5410,7 @@
// We need to keep track of the top "fullscreen" opaque window for the docked stack
// separately, because both the "real fullscreen" opaque window and the one for the docked
// stack can control View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
- if (mTopDockedOpaqueWindowState == null && visible && appWindow && attached == null
+ if (mTopDockedOpaqueWindowState == null && affectsSystemUi && appWindow && attached == null
&& isFullscreen(attrs) && stackId == DOCKED_STACK_ID) {
mTopDockedOpaqueWindowState = win;
if (mTopDockedOpaqueOrDimmingWindowState == null) {
@@ -5419,7 +5420,7 @@
// Also keep track of any windows that are dimming but not necessarily fullscreen in the
// docked stack.
- if (mTopDockedOpaqueOrDimmingWindowState == null && visible && win.isDimming()
+ if (mTopDockedOpaqueOrDimmingWindowState == null && affectsSystemUi && win.isDimming()
&& stackId == DOCKED_STACK_ID) {
mTopDockedOpaqueOrDimmingWindowState = win;
}
@@ -7690,7 +7691,10 @@
default:
return null;
}
- if (pattern.length == 1) {
+ if (pattern.length == 0) {
+ // No vibration
+ return null;
+ } else if (pattern.length == 1) {
// One-shot vibration
return VibrationEffect.createOneShot(pattern[0], VibrationEffect.DEFAULT_AMPLITUDE);
} else {
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 1b4eaf5..da90e5a 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -30,7 +30,7 @@
*/
public class KeyguardServiceDelegate {
private static final String TAG = "KeyguardServiceDelegate";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final int SCREEN_STATE_OFF = 0;
private static final int SCREEN_STATE_TURNING_ON = 1;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index a8d19e9..ed98d1c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -1940,7 +1940,8 @@
&& mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
if (now < nextTimeout) {
- if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {
+ if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT
+ || mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) {
mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
} else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
@@ -3122,10 +3123,6 @@
if (reason == null) {
reason = "";
}
- if (reason.equals(PowerManager.REBOOT_RECOVERY)
- || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
- reason = "recovery";
- }
// If the reason is "quiescent", it means that the boot process should proceed
// without turning on the screen/lights.
@@ -3134,6 +3131,15 @@
if (reason.equals(PowerManager.REBOOT_QUIESCENT)) {
sQuiescent = true;
reason = "";
+ } else if (reason.endsWith("," + PowerManager.REBOOT_QUIESCENT)) {
+ sQuiescent = true;
+ reason = reason.substring(0,
+ reason.length() - PowerManager.REBOOT_QUIESCENT.length() - 1);
+ }
+
+ if (reason.equals(PowerManager.REBOOT_RECOVERY)
+ || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
+ reason = "recovery";
}
if (sQuiescent) {
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 4044fdb..b937f9d 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -96,6 +96,7 @@
public class VrManagerService extends SystemService implements EnabledComponentChangeListener{
public static final String TAG = "VrManagerService";
+ static final boolean DBG = false;
private static final int PENDING_STATE_DELAY_MS = 300;
private static final int EVENT_LOG_SIZE = 32;
@@ -157,7 +158,7 @@
private void setVrModeAllowedLocked(boolean allowed) {
if (mVrModeAllowed != allowed) {
mVrModeAllowed = allowed;
- Slog.i(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
+ if (DBG) Slog.d(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
if (mVrModeAllowed) {
consumeAndApplyPendingStateLocked();
} else {
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index 50b1520..972623c 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -16,14 +16,15 @@
package com.android.server.wm;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
import static android.content.Context.NOTIFICATION_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION;
-import static com.android.internal.notification.SystemNotificationChannels.ALERT_WINDOW;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
@@ -40,7 +41,7 @@
/** Displays an ongoing notification for a process displaying an alert window */
class AlertWindowNotification {
- private static final String TAG_PREFIX = "com.android.server.wm.AlertWindowNotification: ";
+ private static final String CHANNEL_PREFIX = "com.android.server.wm.AlertWindowNotification - ";
private static final int NOTIFICATION_ID = 0;
private static int sNextRequestCode = 0;
@@ -57,7 +58,7 @@
mPackageName = packageName;
mNotificationManager =
(NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE);
- mNotificationTag = TAG_PREFIX + mPackageName;
+ mNotificationTag = CHANNEL_PREFIX + mPackageName;
mRequestCode = sNextRequestCode++;
mIconUtilities = new IconUtilities(mService.mContext);
}
@@ -99,9 +100,11 @@
final String appName = (aInfo != null)
? pm.getApplicationLabel(aInfo).toString() : mPackageName;
+ createNotificationChannel(context, appName);
+
final String message = context.getString(R.string.alert_windows_notification_message,
appName);
- final Notification.Builder builder = new Notification.Builder(context, ALERT_WINDOW)
+ final Notification.Builder builder = new Notification.Builder(context, mNotificationTag)
.setOngoing(true)
.setContentTitle(
context.getString(R.string.alert_windows_notification_title, appName))
@@ -131,6 +134,18 @@
return PendingIntent.getActivity(context, mRequestCode, intent, FLAG_CANCEL_CURRENT);
}
+ private void createNotificationChannel(Context context, String appName) {
+ final String nameChannel =
+ context.getString(R.string.alert_windows_notification_channel_name, appName);
+ final NotificationChannel channel =
+ new NotificationChannel(mNotificationTag, nameChannel, IMPORTANCE_MIN);
+ channel.enableLights(false);
+ channel.enableVibration(false);
+ channel.setBlockableSystem(true);
+ mNotificationManager.createNotificationChannel(channel);
+ }
+
+
private ApplicationInfo getApplicationInfo(PackageManager pm, String packageName) {
try {
return pm.getApplicationInfo(packageName, 0);
diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java
index 65e3ec0..f769261 100644
--- a/services/core/java/com/android/server/wm/AppWindowAnimator.java
+++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java
@@ -78,6 +78,9 @@
// requires that the duration of the two animations are the same.
SurfaceControl thumbnail;
int thumbnailTransactionSeq;
+ // TODO(b/62029108): combine both members into a private one. Create a member function to set
+ // the thumbnail layer to +1 to the highest layer position and replace all setter instances
+ // with this function. Remove all unnecessary calls to both variables in other classes.
int thumbnailLayer;
int thumbnailForceAboveLayer;
Animation thumbnailAnimation;
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index c982f08..1a685eb 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -107,7 +107,7 @@
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer
+ ": startingWindow=" + mContainer.startingWindow
+ " startingView=" + mContainer.startingSurface);
- if (mContainer.startingWindow != null) {
+ if (mContainer.startingData != null) {
surface = mContainer.startingSurface;
mContainer.startingData = null;
mContainer.startingSurface = null;
@@ -164,18 +164,16 @@
if (surface != null) {
boolean abort = false;
synchronized(mWindowMap) {
+ // If the window was successfully added, then
+ // we need to remove it.
if (container.removed || container.startingData == null) {
- // If the window was successfully added, then
- // we need to remove it.
- if (container.startingWindow != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
- "Aborted starting " + container
- + ": removed=" + container.removed
- + " startingData=" + container.startingData);
- container.startingWindow = null;
- container.startingData = null;
- abort = true;
- }
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+ "Aborted starting " + container
+ + ": removed=" + container.removed
+ + " startingData=" + container.startingData);
+ container.startingWindow = null;
+ container.startingData = null;
+ abort = true;
} else {
container.startingSurface = surface;
}
@@ -348,6 +346,24 @@
final AppWindowToken wtoken = mContainer;
+ // Don't set visibility to false if we were already not visible. This prevents WM from
+ // adding the app to the closing app list which doesn't make sense for something that is
+ // already not visible. However, set visibility to true even if we are already visible.
+ // This makes sure the app is added to the opening apps list so that the right
+ // transition can be selected.
+ // TODO: Probably a good idea to separate the concept of opening/closing apps from the
+ // concept of setting visibility...
+ if (!visible && wtoken.hiddenRequested) {
+
+ if (!deferHidingClient && wtoken.mDeferHidingClient) {
+ // We previously deferred telling the client to hide itself when visibility was
+ // initially set to false. Now we would like it to hide, so go ahead and set it.
+ wtoken.mDeferHidingClient = deferHidingClient;
+ wtoken.setClientHidden(true);
+ }
+ return;
+ }
+
if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility("
+ mToken + ", visible=" + visible + "): " + mService.mAppTransition
+ " hidden=" + wtoken.hidden + " hiddenRequested="
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 17db253..37ebfd3 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
@@ -51,6 +52,7 @@
import android.annotation.NonNull;
import android.app.Activity;
+import android.app.ActivityManager;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
@@ -341,7 +343,9 @@
boolean delayed = false;
inPendingTransaction = false;
-
+ // Reset the state of mHiddenSetFromTransferredStartingWindow since visibility is actually
+ // been set by the app now.
+ mHiddenSetFromTransferredStartingWindow = false;
setClientHidden(!visible);
// Allow for state changes and animation to be applied if:
@@ -911,7 +915,11 @@
}
if (mPendingRelaunchCount > 0) {
mPendingRelaunchCount--;
+ } else {
+ // Update keyguard flags upon finishing relaunch.
+ checkKeyguardFlagsChanged();
}
+
updateAllDrawn();
}
@@ -1343,9 +1351,11 @@
}
mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, token).sendToTarget();
- final TaskStack s = getStack();
- if (s != null) {
- s.onAllWindowsDrawn();
+ // Notify the pinned stack upon all windows drawn. If there was an animation in
+ // progress then this signal will resume that animation.
+ final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
+ if (pinnedStack != null) {
+ pinnedStack.onAllWindowsDrawn();
}
}
}
@@ -1499,6 +1509,12 @@
}
boolean containsDismissKeyguardWindow() {
+ // Window state is transient during relaunch. We are not guaranteed to be frozen during the
+ // entirety of the relaunch.
+ if (isRelaunching()) {
+ return mLastContainsDismissKeyguardWindow;
+ }
+
for (int i = mChildren.size() - 1; i >= 0; i--) {
if ((mChildren.get(i).mAttrs.flags & FLAG_DISMISS_KEYGUARD) != 0) {
return true;
@@ -1508,11 +1524,19 @@
}
boolean containsShowWhenLockedWindow() {
+ // When we are relaunching, it is possible for us to be unfrozen before our previous
+ // windows have been added back. Using the cached value ensures that our previous
+ // showWhenLocked preference is honored until relaunching is complete.
+ if (isRelaunching()) {
+ return mLastContainsShowWhenLockedWindow;
+ }
+
for (int i = mChildren.size() - 1; i >= 0; i--) {
if ((mChildren.get(i).mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) {
return true;
}
}
+
return false;
}
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index 7f3c89c..410efcd 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -139,8 +139,14 @@
private final boolean mSkipAnimationStart;
// True if this animation was canceled by the user, not as a part of a replacing animation
private boolean mSkipAnimationEnd;
+
+ // True if the animation target is animating from the fullscreen. Only one of
+ // {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be true at any time in the
+ // animation.
+ private boolean mMoveFromFullscreen;
// True if the animation target should be moved to the fullscreen stack at the end of this
- // animation
+ // animation. Only one of {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be
+ // true at any time in the animation.
private boolean mMoveToFullscreen;
// Whether to schedule PiP mode changes on animation start/end
@@ -151,15 +157,21 @@
private final int mFrozenTaskWidth;
private final int mFrozenTaskHeight;
+ // Timeout callback to ensure we continue the animation if waiting for resuming or app
+ // windows drawn fails
+ private final Runnable mResumeRunnable = () -> resume();
+
BoundsAnimator(BoundsAnimationTarget target, Rect from, Rect to,
@SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen, boolean replacingExistingAnimation) {
+ boolean moveFromFullscreen, boolean moveToFullscreen,
+ boolean replacingExistingAnimation) {
super();
mTarget = target;
mFrom.set(from);
mTo.set(to);
mSkipAnimationStart = replacingExistingAnimation;
mSchedulePipModeChangedState = schedulePipModeChangedState;
+ mMoveFromFullscreen = moveFromFullscreen;
mMoveToFullscreen = moveToFullscreen;
addUpdateListener(this);
addListener(this);
@@ -177,13 +189,6 @@
}
}
- final Runnable mResumeRunnable = new Runnable() {
- @Override
- public void run() {
- resume();
- }
- };
-
@Override
public void onAnimationStart(Animator animation) {
if (DEBUG) Slog.d(TAG, "onAnimationStart: mTarget=" + mTarget
@@ -199,6 +204,12 @@
if (!mSkipAnimationStart) {
mTarget.onAnimationStart(mSchedulePipModeChangedState ==
SCHEDULE_PIP_MODE_CHANGED_ON_START);
+
+ // When starting an animation from fullscreen, pause here and wait for the
+ // windows-drawn signal before we start the rest of the transition down into PiP.
+ if (mMoveFromFullscreen) {
+ pause();
+ }
}
// Immediately update the task bounds if they have to become larger, but preserve
@@ -213,13 +224,20 @@
// correct logic to make this resize seamless.
if (mMoveToFullscreen) {
pause();
- mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
}
}
}
@Override
+ public void pause() {
+ if (DEBUG) Slog.d(TAG, "pause: waiting for windows drawn");
+ super.pause();
+ mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
+ }
+
+ @Override
public void resume() {
+ if (DEBUG) Slog.d(TAG, "resume:");
mHandler.removeCallbacks(mResumeRunnable);
super.resume();
}
@@ -336,15 +354,15 @@
public void animateBounds(final BoundsAnimationTarget target, Rect from, Rect to,
int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen) {
+ boolean moveFromFullscreen, boolean moveToFullscreen) {
animateBoundsImpl(target, from, to, animationDuration, schedulePipModeChangedState,
- moveToFullscreen);
+ moveFromFullscreen, moveToFullscreen);
}
@VisibleForTesting
BoundsAnimator animateBoundsImpl(final BoundsAnimationTarget target, Rect from, Rect to,
int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen) {
+ boolean moveFromFullscreen, boolean moveToFullscreen) {
final BoundsAnimator existing = mRunningAnimations.get(target);
final boolean replacing = existing != null;
@@ -387,7 +405,7 @@
existing.cancel();
}
final BoundsAnimator animator = new BoundsAnimator(target, from, to,
- schedulePipModeChangedState, moveToFullscreen, replacing);
+ schedulePipModeChangedState, moveFromFullscreen, moveToFullscreen, replacing);
mRunningAnimations.put(target, animator);
animator.setFloatValues(0f, 1f);
animator.setDuration((animationDuration != -1 ? animationDuration
@@ -397,14 +415,19 @@
return animator;
}
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ public void onAllWindowsDrawn() {
+ if (DEBUG) Slog.d(TAG, "onAllWindowsDrawn:");
+ mHandler.post(this::resume);
+ }
+
private void resume() {
for (int i = 0; i < mRunningAnimations.size(); i++) {
final BoundsAnimator b = mRunningAnimations.valueAt(i);
b.resume();
}
}
-
- public void onAllWindowsDrawn() {
- mHandler.post(this::resume);
- }
}
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index e300256..2d7fc68 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -191,12 +191,16 @@
mTmpRect);
int dividerSize = mDividerWindowWidth - 2 * mDividerInsets;
Configuration configuration = mDisplayContent.getConfiguration();
+ // The offset in the left (landscape)/top (portrait) is calculated with the minimized
+ // offset value with the divider size and any system insets in that direction.
if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
outBounds.set(0, mTaskHeightInMinimizedMode + dividerSize + mTmpRect.top,
di.logicalWidth, di.logicalHeight);
} else {
- outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left, 0,
- di.logicalWidth, di.logicalHeight);
+ // In landscape append the left position with the statusbar height to match the
+ // minimized size height in portrait mode.
+ outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left + mTmpRect.top,
+ 0, di.logicalWidth, di.logicalHeight);
}
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index fc4ec28..9a9e29a 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -92,17 +92,16 @@
private final Rect mStableInsets = new Rect();
// The size and position information that describes where the pinned stack will go by default.
+ private int mDefaultMinSize;
private int mDefaultStackGravity;
private float mDefaultAspectRatio;
private Point mScreenEdgeInsets;
+ private int mCurrentMinSize;
// The aspect ratio bounds of the PIP.
private float mMinAspectRatio;
private float mMaxAspectRatio;
- // The minimum edge size of the normal PiP bounds.
- private int mMinSize;
-
// Temp vars for calculation
private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
private final Rect mTmpInsets = new Rect();
@@ -124,6 +123,13 @@
}
@Override
+ public void setMinEdgeSize(int minEdgeSize) {
+ mHandler.post(() -> {
+ mCurrentMinSize = Math.max(mDefaultMinSize, minEdgeSize);
+ });
+ }
+
+ @Override
public int getDisplayRotation() {
synchronized (mService.mWindowMap) {
return mDisplayInfo.rotation;
@@ -160,10 +166,12 @@
*/
private void reloadResources() {
final Resources res = mService.mContext.getResources();
- mMinSize = res.getDimensionPixelSize(
+ mDefaultMinSize = res.getDimensionPixelSize(
com.android.internal.R.dimen.default_minimal_size_pip_resizable_task);
+ mCurrentMinSize = mDefaultMinSize;
mDefaultAspectRatio = res.getFloat(
com.android.internal.R.dimen.config_pictureInPictureDefaultAspectRatio);
+ mAspectRatio = mDefaultAspectRatio;
final String screenEdgeInsetsDpString = res.getString(
com.android.internal.R.string.config_defaultPictureInPictureScreenEdgeInsets);
final Size screenEdgeInsetsDp = !screenEdgeInsetsDpString.isEmpty()
@@ -212,11 +220,15 @@
* Returns the current bounds (or the default bounds if there are no current bounds) with the
* specified aspect ratio.
*/
- Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio) {
+ Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio,
+ boolean useCurrentMinEdgeSize) {
// Save the snap fraction, calculate the aspect ratio based on screen size
final float snapFraction = mSnapAlgorithm.getSnapFraction(stackBounds,
getMovementBounds(stackBounds));
- final Size size = getSize(aspectRatio);
+
+ final int minEdgeSize = useCurrentMinEdgeSize ? mCurrentMinSize : mDefaultMinSize;
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, minEdgeSize,
+ mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
final int left = (int) (stackBounds.centerX() - size.getWidth() / 2f);
final int top = (int) (stackBounds.centerY() - size.getHeight() / 2f);
stackBounds.set(left, top, left + size.getWidth(), top + size.getHeight());
@@ -228,16 +240,6 @@
}
/**
- * @return the size of the PIP based on the given {@param aspectRatio}.
- */
- Size getSize(float aspectRatio) {
- synchronized (mService.mWindowMap) {
- return mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, mMinSize,
- mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
- }
- }
-
- /**
* @return the default bounds to show the PIP when there is no active PIP.
*/
Rect getDefaultBounds() {
@@ -246,7 +248,8 @@
getInsetBounds(insetBounds);
final Rect defaultBounds = new Rect();
- final Size size = getSize(mDefaultAspectRatio);
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(mDefaultAspectRatio,
+ mDefaultMinSize, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
Gravity.apply(mDefaultStackGravity, size.getWidth(), size.getHeight(), insetBounds,
0, mIsImeShowing ? mImeHeight : 0, defaultBounds);
return defaultBounds;
@@ -401,7 +404,8 @@
getInsetBounds(insetBounds);
final Rect normalBounds = getDefaultBounds();
if (isValidPictureInPictureAspectRatio(mAspectRatio)) {
- transformBoundsToAspectRatio(normalBounds, mAspectRatio);
+ transformBoundsToAspectRatio(normalBounds, mAspectRatio,
+ false /* useCurrentMinEdgeSize */);
}
final Rect animatingBounds = mTmpAnimatingBoundsRect;
final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index b0b93ab..989e8f2 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
-import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
@@ -36,7 +35,8 @@
*/
public class PinnedStackWindowController extends StackWindowController {
- private Rect mTmpBoundsRect = new Rect();
+ private Rect mTmpFromBounds = new Rect();
+ private Rect mTmpToBounds = new Rect();
public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
int displayId, boolean onTop, Rect outBounds) {
@@ -44,16 +44,16 @@
}
/**
- * @param useExistingStackBounds Apply {@param aspectRatio} to the existing target stack bounds
- * if possible
+ * @return the {@param currentStackBounds} transformed to the give {@param aspectRatio}. If
+ * {@param currentStackBounds} is null, then the {@param aspectRatio} is applied to the
+ * default bounds.
*/
- public Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ public Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) {
synchronized (mWindowMap) {
if (!mService.mSupportsPictureInPicture || mContainer == null) {
return null;
}
- final Rect stackBounds;
final DisplayContent displayContent = mContainer.getDisplayContent();
if (displayContent == null) {
return null;
@@ -61,18 +61,14 @@
final PinnedStackController pinnedStackController =
displayContent.getPinnedStackController();
- if (useExistingStackBounds) {
- // If the stack exists, then use its final bounds to calculate the new aspect ratio
- // bounds
- stackBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(stackBounds);
- } else {
- // Otherwise, just calculate the aspect ratio bounds from the default bounds
+ if (stackBounds == null) {
+ // Calculate the aspect ratio bounds from the default bounds
stackBounds = pinnedStackController.getDefaultBounds();
}
if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
- return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio);
+ return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio,
+ true /* useCurrentMinEdgeSize */);
} else {
return stackBounds;
}
@@ -83,7 +79,7 @@
* Animates the pinned stack.
*/
public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
- int animationDuration, boolean schedulePipModeChangedOnAnimationEnd) {
+ int animationDuration, boolean fromFullscreen) {
synchronized (mWindowMap) {
if (mContainer == null) {
throw new IllegalArgumentException("Pinned stack container not found :(");
@@ -98,22 +94,22 @@
NO_PIP_MODE_CHANGED_CALLBACKS;
final boolean toFullscreen = toBounds == null;
if (toFullscreen) {
- if (schedulePipModeChangedOnAnimationEnd) {
+ if (fromFullscreen) {
throw new IllegalArgumentException("Should not defer scheduling PiP mode"
+ " change on animation to fullscreen.");
}
schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START;
- mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpBoundsRect);
- if (!mTmpBoundsRect.isEmpty()) {
+ mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpToBounds);
+ if (!mTmpToBounds.isEmpty()) {
// If there is a fullscreen bounds, use that
- toBounds = new Rect(mTmpBoundsRect);
+ toBounds = new Rect(mTmpToBounds);
} else {
// Otherwise, use the display bounds
toBounds = new Rect();
mContainer.getDisplayContent().getLogicalDisplayRect(toBounds);
}
- } else if (schedulePipModeChangedOnAnimationEnd) {
+ } else if (fromFullscreen) {
schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END;
}
@@ -122,13 +118,13 @@
final Rect finalToBounds = toBounds;
final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
schedulePipModeChangedState;
- UiThread.getHandler().post(() -> {
+ mService.mBoundsAnimationController.getHandler().post(() -> {
if (mContainer == null) {
return;
}
mService.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
finalToBounds, animationDuration, finalSchedulePipModeChangedState,
- toFullscreen);
+ fromFullscreen, toFullscreen);
});
}
}
@@ -142,17 +138,16 @@
return;
}
- final Rect toBounds = getPictureInPictureBounds(aspectRatio,
- true /* useExistingStackBounds */);
- final Rect targetBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(targetBounds);
final PinnedStackController pinnedStackController =
mContainer.getDisplayContent().getPinnedStackController();
if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) {
- if (!toBounds.equals(targetBounds)) {
- animateResizePinnedStack(toBounds, null /* sourceHintBounds */,
- -1 /* duration */, false /* schedulePipModeChangedOnAnimationEnd */);
+ mContainer.getAnimationOrCurrentBounds(mTmpFromBounds);
+ mTmpToBounds.set(mTmpFromBounds);
+ getPictureInPictureBounds(aspectRatio, mTmpToBounds);
+ if (!mTmpToBounds.equals(mTmpFromBounds)) {
+ animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */,
+ -1 /* duration */, false /* fromFullscreen */);
}
pinnedStackController.setAspectRatio(
pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 233e75b..fb500bc 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -858,14 +858,20 @@
final int privateflags = attrs.privateFlags;
boolean displayHasContent = false;
+ if (DEBUG_KEEP_SCREEN_ON && (attrFlags & FLAG_KEEP_SCREEN_ON) != 0
+ && w != mService.mLastWakeLockHoldingWindow) {
+ Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w
+ + " has FLAG_KEEP_SCREEN_ON set, hasSurface=" + w.mHasSurface
+ + ", canBeSeen=" + canBeSeen);
+ }
+
if (w.mHasSurface && canBeSeen) {
if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
mHoldScreen = w.mSession;
mHoldScreenWindow = w;
} else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
- + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
- + Debug.getCallers(10));
+ + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!!");
}
if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
mScreenBrightness = w.mAttrs.screenBrightness;
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 24cb464..b266778 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -17,15 +17,14 @@
package com.android.server.wm;
import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS;
-import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
-import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
-import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
-import static android.graphics.PixelFormat.RGBA_8888;
+import static android.graphics.Bitmap.Config.ARGB_8888;
+import static android.graphics.Bitmap.Config.HARDWARE;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.TaskSnapshot;
+import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
@@ -42,7 +41,6 @@
import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter;
import java.io.PrintWriter;
-import java.util.function.Consumer;
/**
* When an app token becomes invisible, we take a snapshot (bitmap) of the corresponding task and
@@ -240,22 +238,22 @@
final int color = task.getTaskDescription().getBackgroundColor();
final int statusBarColor = task.getTaskDescription().getStatusBarColor();
final int navigationBarColor = task.getTaskDescription().getNavigationBarColor();
- final GraphicBuffer buffer = GraphicBuffer.create(mainWindow.getFrameLw().width(),
- mainWindow.getFrameLw().height(),
- RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_WRITE_RARELY | USAGE_SW_READ_NEVER);
- if (buffer == null) {
- return null;
- }
- final Canvas c = buffer.lockCanvas();
+ final Bitmap b = Bitmap.createBitmap(mainWindow.getFrameLw().width(),
+ mainWindow.getFrameLw().height(), ARGB_8888);
+ final Canvas c = new Canvas(b);
c.drawColor(color);
final LayoutParams attrs = mainWindow.getAttrs();
final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor);
decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets);
decorPainter.drawDecors(c, null /* statusBarExcludeFrame */);
- buffer.unlockCanvasAndPost(c);
- return new TaskSnapshot(buffer, topChild.getConfiguration().orientation,
- mainWindow.mStableInsets, false /* reduced */, 1.0f /* scale */);
+
+ // Flush writer.
+ c.setBitmap(null);
+ final Bitmap hwBitmap = b.copy(HARDWARE, false /* isMutable */);
+ return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(),
+ topChild.getConfiguration().orientation, mainWindow.mStableInsets,
+ false /* reduced */, 1.0f /* scale */);
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 9d48ce5..eff8ed9 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -738,7 +738,8 @@
// When the home stack is resizable, should always have the same stack and task bounds
if (mStackId == HOME_STACK_ID) {
- if (findHomeTask().isResizeable()) {
+ final Task homeTask = findHomeTask();
+ if (homeTask != null && homeTask.isResizeable()) {
// Calculate the home stack bounds when in docked mode and the home stack is
// resizeable.
getDisplayContent().mDividerControllerLocked
@@ -1488,7 +1489,7 @@
}
void onAllWindowsDrawn() {
- if (!mBoundsAnimating) {
+ if (!mBoundsAnimating && !mBoundsAnimatingRequested) {
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java
index 172ec48..01a3143 100644
--- a/services/core/java/com/android/server/wm/WindowLayersController.java
+++ b/services/core/java/com/android/server/wm/WindowLayersController.java
@@ -257,9 +257,20 @@
w.mLayer = layer;
w.mWinAnimator.mAnimLayer = w.getAnimLayerAdjustment()
+ w.getSpecialWindowAnimLayerAdjustment();
- if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0
- && w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) {
- w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer;
+ if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0) {
+ if (w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) {
+ w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer;
+ }
+ // TODO(b/62029108): the entire contents of the if statement should call the refactored
+ // function to set the thumbnail layer for w.AppToken
+ int highestLayer = w.mAppToken.getHighestAnimLayer();
+ if (highestLayer > 0) {
+ if (w.mAppToken.mAppAnimator.thumbnail != null
+ && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer != highestLayer) {
+ w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = highestLayer;
+ w.mAppToken.mAppAnimator.thumbnail.setLayer(highestLayer + 1);
+ }
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
index 8279b51..c080f34 100644
--- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
+++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
@@ -77,5 +77,5 @@
static final boolean DEBUG_UNKNOWN_APP_VISIBILITY = false;
static final String TAG_KEEP_SCREEN_ON = "DebugKeepScreenOn";
- static final boolean DEBUG_KEEP_SCREEN_ON = false;
+ static final boolean DEBUG_KEEP_SCREEN_ON = true;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 2ffa152..4c86166 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1403,6 +1403,16 @@
|| ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null)));
}
+ // TODO: Another visibility method that was added late in the release to minimize risk.
+ @Override
+ public boolean canAffectSystemUiFlags() {
+ final boolean shown = mWinAnimator.getShown();
+ final boolean exiting = mAnimatingExit || mDestroying
+ || mAppToken != null && mAppToken.hidden;
+ final boolean translucent = mAttrs.alpha == 0.0f;
+ return shown && !exiting && !translucent;
+ }
+
/**
* Like isOnScreen, but returns false if the surface hasn't yet
* been drawn.
@@ -2192,18 +2202,30 @@
}
}
- void prepareWindowToDisplayDuringRelayout(MergedConfiguration mergedConfiguration) {
- if ((mAttrs.softInputMode & SOFT_INPUT_MASK_ADJUST)
- == SOFT_INPUT_ADJUST_RESIZE) {
- mLayoutNeeded = true;
- }
- if (isDrawnLw() && mService.okToDisplay()) {
- mWinAnimator.applyEnterAnimationLocked();
- }
+ void prepareWindowToDisplayDuringRelayout(MergedConfiguration mergedConfiguration,
+ boolean wasVisible) {
+ // We need to turn on screen regardless of visibility.
if ((mAttrs.flags & FLAG_TURN_SCREEN_ON) != 0) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "Relayout window turning screen on: " + this);
mTurnOnScreen = true;
}
+
+ // If we were already visible, skip rest of preparation.
+ if (wasVisible) {
+ if (DEBUG_VISIBILITY) Slog.v(TAG,
+ "Already visible and does not turn on screen, skip preparing: " + this);
+ return;
+ }
+
+ if ((mAttrs.softInputMode & SOFT_INPUT_MASK_ADJUST)
+ == SOFT_INPUT_ADJUST_RESIZE) {
+ mLayoutNeeded = true;
+ }
+
+ if (isDrawnLw() && mService.okToDisplay()) {
+ mWinAnimator.applyEnterAnimationLocked();
+ }
+
if (isConfigChanged()) {
final Configuration globalConfig = mService.mRoot.getConfiguration();
final Configuration overrideConfig = getMergedOverrideConfiguration();
@@ -4338,9 +4360,9 @@
mLastVisibleLayoutRotation = getDisplayContent().getRotation();
mWinAnimator.mEnteringAnimation = true;
- if (!wasVisible) {
- prepareWindowToDisplayDuringRelayout(mergedConfiguration);
- }
+
+ prepareWindowToDisplayDuringRelayout(mergedConfiguration, wasVisible);
+
if ((attrChanges & FORMAT_CHANGED) != 0) {
// If the format can't be changed in place, preserve the old surface until the app draws
// on the new one. This prevents blinking when we change elevation of freeform and
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d75afcf..73f8d27 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -687,6 +687,7 @@
mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
attrs.getTitle().toString(),
width, height, format, flags, this, windowType, ownerUid);
+ mSurfaceFormat = format;
w.setHasSurface(true);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index b620b3e..6f53099 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -185,6 +185,8 @@
"com.google.android.clockwork.ThermalObserver";
private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
"com.google.android.clockwork.connectivity.WearConnectivityService";
+ private static final String WEAR_DISPLAY_SERVICE_CLASS =
+ "com.google.android.clockwork.display.WearDisplayService";
private static final String WEAR_TIME_SERVICE_CLASS =
"com.google.android.clockwork.time.WearTimeService";
private static final String ACCOUNT_SERVICE_CLASS =
@@ -671,7 +673,6 @@
VibratorService vibrator = null;
IStorageManager storageManager = null;
NetworkManagementService networkManagement = null;
- IpSecService ipSecService = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
ConnectivityService connectivity = null;
@@ -1024,15 +1025,6 @@
reportWtf("starting NetworkManagement Service", e);
}
traceEnd();
-
- traceBeginAndSlog("StartIpSecService");
- try {
- ipSecService = IpSecService.create(context);
- ServiceManager.addService(Context.IPSEC_SERVICE, ipSecService);
- } catch (Throwable e) {
- reportWtf("starting IpSec Service", e);
- }
- traceEnd();
}
if (!disableNonCoreServices && !disableTextServices) {
@@ -1509,6 +1501,7 @@
if (!disableNonCoreServices) {
traceBeginAndSlog("StartWearTimeService");
+ mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
traceEnd();
}
@@ -1643,7 +1636,6 @@
final TelephonyRegistry telephonyRegistryF = telephonyRegistry;
final MediaRouterService mediaRouterF = mediaRouter;
final MmsServiceBroker mmsServiceF = mmsService;
- final IpSecService ipSecServiceF = ipSecService;
final WindowManagerService windowManagerF = wm;
// We now tell the activity manager it is okay to run third party
@@ -1708,13 +1700,6 @@
.networkScoreAndNetworkManagementServiceReady();
}
traceEnd();
- traceBeginAndSlog("MakeIpSecServiceReady");
- try {
- if (ipSecServiceF != null) ipSecServiceF.systemReady();
- } catch (Throwable e) {
- reportWtf("making IpSec Service ready", e);
- }
- traceEnd();
traceBeginAndSlog("MakeNetworkStatsServiceReady");
try {
if (networkStatsF != null) networkStatsF.systemReady();
diff --git a/services/net/java/android/net/util/SharedLog.java b/services/net/java/android/net/util/SharedLog.java
new file mode 100644
index 0000000..343d237
--- /dev/null
+++ b/services/net/java/android/net/util/SharedLog.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 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 android.net.util;
+
+import android.text.TextUtils;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.StringJoiner;
+
+
+/**
+ * Class to centralize logging functionality for tethering.
+ *
+ * All access to class methods other than dump() must be on the same thread.
+ *
+ * @hide
+ */
+public class SharedLog {
+ private final static int DEFAULT_MAX_RECORDS = 500;
+ private final static String COMPONENT_DELIMITER = ".";
+
+ private enum Category {
+ NONE,
+ ERROR,
+ MARK,
+ WARN,
+ };
+
+ private final LocalLog mLocalLog;
+ // The tag to use for output to the system log. This is not output to the
+ // LocalLog because that would be redundant.
+ private final String mTag;
+ // The component (or subcomponent) of a system that is sharing this log.
+ // This can grow in depth if components call forSubComponent() to obtain
+ // their SharedLog instance. The tag is not included in the component for
+ // brevity.
+ private final String mComponent;
+
+ public SharedLog(String tag) {
+ this(DEFAULT_MAX_RECORDS, tag);
+ }
+
+ public SharedLog(int maxRecords, String tag) {
+ this(new LocalLog(maxRecords), tag, tag);
+ }
+
+ private SharedLog(LocalLog localLog, String tag, String component) {
+ mLocalLog = localLog;
+ mTag = tag;
+ mComponent = component;
+ }
+
+ public SharedLog forSubComponent(String component) {
+ if (!isRootLogInstance()) {
+ component = mComponent + COMPONENT_DELIMITER + component;
+ }
+ return new SharedLog(mLocalLog, mTag, component);
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ mLocalLog.readOnlyLocalLog().dump(fd, writer, args);
+ }
+
+ //////
+ // Methods that both log an entry and emit it to the system log.
+ //////
+
+ public void e(Exception e) {
+ Log.e(mTag, record(Category.ERROR, e.toString()));
+ }
+
+ public void e(String msg) {
+ Log.e(mTag, record(Category.ERROR, msg));
+ }
+
+ public void i(String msg) {
+ Log.i(mTag, record(Category.NONE, msg));
+ }
+
+ public void w(String msg) {
+ Log.w(mTag, record(Category.WARN, msg));
+ }
+
+ //////
+ // Methods that only log an entry (and do NOT emit to the system log).
+ //////
+
+ public void log(String msg) {
+ record(Category.NONE, msg);
+ }
+
+ public void mark(String msg) {
+ record(Category.MARK, msg);
+ }
+
+ private String record(Category category, String msg) {
+ final String entry = logLine(category, msg);
+ mLocalLog.log(entry);
+ return entry;
+ }
+
+ private String logLine(Category category, String msg) {
+ final StringJoiner sj = new StringJoiner(" ");
+ if (!isRootLogInstance()) sj.add("[" + mComponent + "]");
+ if (category != Category.NONE) sj.add(category.toString());
+ return sj.add(msg).toString();
+ }
+
+ // Check whether this SharedLog instance is nominally the top level in
+ // a potential hierarchy of shared logs (the root of a tree),
+ // or is a subcomponent within the hierarchy.
+ private boolean isRootLogInstance() {
+ return TextUtils.isEmpty(mComponent) || mComponent.equals(mTag);
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
new file mode 100644
index 0000000..3007cb1
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 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.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.app.NotificationChannel;
+import android.os.Parcel;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationChannelTest extends NotificationTestCase {
+
+ @Test
+ public void testWriteToParcel() {
+ NotificationChannel channel =
+ new NotificationChannel("1", "one", IMPORTANCE_DEFAULT);
+ Parcel parcel = Parcel.obtain();
+ channel.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ NotificationChannel channel1 = NotificationChannel.CREATOR.createFromParcel(parcel);
+ assertEquals(channel, channel1);
+ }
+
+ @Test
+ public void testSystemBlockable() {
+ NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+ assertEquals(false, channel.isBlockableSystem());
+ channel.setBlockableSystem(true);
+ assertEquals(true, channel.isBlockableSystem());
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 06b5821..5a72e6b 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -18,6 +18,7 @@
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MAX;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
@@ -27,6 +28,7 @@
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -50,15 +52,11 @@
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings.Secure;
-import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.TestableContext;
-import android.testing.TestableSettingsProvider;
import android.util.ArrayMap;
-import android.util.Slog;
import android.util.Xml;
import java.io.BufferedInputStream;
@@ -87,10 +85,10 @@
public class RankingHelperTest extends NotificationTestCase {
private static final String PKG = "com.android.server.notification";
private static final int UID = 0;
- private static final UserHandle USER = UserHandle.getUserHandleForUid(UID);
+ private static final UserHandle USER = UserHandle.of(0);
private static final String UPDATED_PKG = "updatedPkg";
- private static final int UID2 = 1111111;
- private static final UserHandle USER2 = UserHandle.getUserHandleForUid(UID2);
+ private static final int UID2 = 1111;
+ private static final UserHandle USER2 = UserHandle.of(10);
private static final String TEST_CHANNEL_ID = "test_channel_id";
@Mock NotificationUsageStats mUsageStats;
@@ -199,24 +197,21 @@
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
serializer.startDocument(null, true);
- serializer.startTag(null, "ranking");
mHelper.writeXml(serializer, forBackup);
- serializer.endTag(null, "ranking");
serializer.endDocument();
serializer.flush();
-
for (String channelId : channelIds) {
mHelper.permanentlyDeleteNotificationChannel(pkg, uid, channelId);
}
return baos;
}
- private void loadStreamXml(ByteArrayOutputStream stream) throws Exception {
+ private void loadStreamXml(ByteArrayOutputStream stream, boolean forRestore) throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(stream.toByteArray())),
null);
parser.nextTag();
- mHelper.readXml(parser, false);
+ mHelper.readXml(parser, forRestore);
}
private void compareChannels(NotificationChannel expected, NotificationChannel actual) {
@@ -323,7 +318,7 @@
channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
assertTrue(mHelper.canShowBadge(PKG, UID));
assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
@@ -354,6 +349,76 @@
}
@Test
+ public void testChannelXmlForBackup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel2.setDescription("descriptions for all");
+ channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel2.enableLights(true);
+ channel2.setBypassDnd(true);
+ channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel2.enableVibration(false);
+ channel2.setGroup(ncg.getId());
+ channel2.setLightColor(Color.BLUE);
+ NotificationChannel channel3 = new NotificationChannel("id3", "NAM3", IMPORTANCE_HIGH);
+ channel3.enableVibration(true);
+
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, false);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+
+ mHelper.setShowBadge(PKG, UID, true);
+
+ mHelper.setImportance(UPDATED_PKG, UID2, IMPORTANCE_NONE);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
+ channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+ mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG, UPDATED_PKG},
+ new int[]{UID, UID2});
+
+ mHelper.setShowBadge(UPDATED_PKG, UID2, true);
+
+ loadStreamXml(baos, true);
+
+ assertEquals(IMPORTANCE_NONE, mHelper.getImportance(UPDATED_PKG, UID2));
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+ compareChannels(channel2,
+ mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+ compareChannels(channel3,
+ mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
+
+ List<NotificationChannelGroup> actualGroups =
+ mHelper.getNotificationChannelGroups(PKG, UID, false).getList();
+ boolean foundNcg = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (ncg.getId().equals(actual.getId())) {
+ foundNcg = true;
+ compareGroups(ncg, actual);
+ } else if (ncg2.getId().equals(actual.getId())) {
+ compareGroups(ncg2, actual);
+ }
+ }
+ assertTrue(foundNcg);
+
+ boolean foundChannel2Group = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
+ foundChannel2Group = true;
+ break;
+ }
+ }
+ assertTrue(foundChannel2Group);
+ }
+
+ @Test
public void testChannelXml_backup() throws Exception {
NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
@@ -397,7 +462,7 @@
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
final NotificationChannel updated = mHelper.getNotificationChannel(PKG, UID,
NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -417,7 +482,7 @@
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel(
PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false).getImportance());
@@ -465,7 +530,7 @@
final ApplicationInfo upgraded = new ApplicationInfo();
upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Default Channel should be gone.
assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -483,7 +548,7 @@
final ApplicationInfo upgraded = new ApplicationInfo();
upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Default Channel should be gone.
assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -497,7 +562,7 @@
mHelper.createNotificationChannel(PKG, UID,
new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Should still have the newly created channel that wasn't in the xml.
assertTrue(mHelper.getNotificationChannel(PKG, UID, "bananas", false) != null);
@@ -512,14 +577,32 @@
}
@Test
- public void testCreateChannel_ImportanceNone() throws Exception {
+ public void testCreateChannel_badImportance() throws Exception {
try {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
- fail("Was allowed to create a blocked channel");
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1), true);
+ fail("Was allowed to create a channel with invalid importance");
} catch (IllegalArgumentException e) {
// yay
}
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED), true);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1), true);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true);
}
@@ -1271,5 +1354,4 @@
assertFalse(mHelper.badgingEnabled(USER));
assertTrue(mHelper.badgingEnabled(USER2));
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 9cfa542..bac1216 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -235,8 +235,7 @@
if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
mStack = new PinnedActivityStack(this, recents, mOnTop) {
@Override
- Rect getPictureInPictureBounds(float aspectRatio,
- boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return new Rect(50, 50, 100, 100);
}
};
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index 19defe1..2f202d98 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -36,6 +36,7 @@
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,6 +59,7 @@
* Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \
* com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
*/
+@Ignore
@SmallTest
@RunWith(AndroidJUnit4.class)
public class CoreSettingsObserverTest {
diff --git a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
index 9014539..f02cf51 100644
--- a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
@@ -54,6 +54,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -78,6 +79,7 @@
* Run: adb shell am instrument -e class com.android.server.net.ConnOnActivityStartTest -w \
* com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
*/
+@Ignore
@LargeTest
@RunWith(AndroidJUnit4.class)
public class ConnOnActivityStartTest {
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
index da3b9c9..65a5632 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
@@ -19,18 +19,24 @@
import org.junit.Test;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.SecurityTest;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.view.WindowManager;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.res.Configuration.EMPTY;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
+import java.util.function.Consumer;
+
/**
* Test class for {@link AppWindowContainerController}.
*
@@ -90,6 +96,9 @@
assertNull(atoken.startingSurface);
assertNull(atoken.startingWindow);
assertNull(atoken.startingData);
+ atoken.forAllWindows(windowState -> {
+ assertFalse(windowState.getBaseType() == TYPE_APPLICATION_STARTING);
+ }, true);
}
@Test
@@ -108,6 +117,22 @@
}
@Test
+ public void testAddRemoveRace() throws Exception {
+
+ // There was once a race condition between adding and removing starting windows
+ for (int i = 0; i < 1000; i++) {
+ final WindowTestUtils.TestAppWindowContainerController controller =
+ createAppWindowController();
+ controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
+ android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,
+ false);
+ controller.removeStartingWindow();
+ waitUntilHandlersIdle();
+ assertNoStartingWindow(controller.getAppWindowToken(mDisplayContent));
+ }
+ }
+
+ @Test
public void testTransferStartingWindow() throws Exception {
final WindowTestUtils.TestAppWindowContainerController controller1 =
createAppWindowController();
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index 46f10c1..36083bf 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -30,13 +30,15 @@
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-
/**
* Tests for the {@link AppWindowToken} class.
*
@@ -184,4 +186,31 @@
// Can specify orientation if the current orientation candidate is orientation behind.
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, token.getOrientation(SCREEN_ORIENTATION_BEHIND));
}
+
+ @Test
+ public void testKeyguardFlagsDuringRelaunch() throws Exception {
+ final WindowTestUtils.TestAppWindowToken token =
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
+ final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
+ TYPE_BASE_APPLICATION);
+ attrs.flags |= FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD;
+ attrs.setTitle("AppWindow");
+ final WindowTestUtils.TestWindowState appWindow = createWindowState(attrs, token);
+
+ // Add window with show when locked flag
+ token.addWindow(appWindow);
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Start relaunching
+ token.startRelaunching();
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Remove window and make sure that we still report back flag
+ token.removeChild(appWindow);
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Finish relaunching and ensure flag is now not reported
+ token.finishRelaunching();
+ assertFalse(token.containsShowWhenLockedWindow() || token.containsDismissKeyguardWindow());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index cd7a7c7..ee09f4b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -152,8 +152,6 @@
mAwaitingAnimationStart = false;
mAnimationStarted = true;
mSchedulePipModeChangedOnStart = schedulePipModeChangedCallback;
-
- mController.onAllWindowsDrawn();
}
@Override
@@ -207,6 +205,9 @@
throw new IllegalArgumentException("Call restart() to restart an animation");
}
+ boolean fromFullscreen = from.equals(BOUNDS_FULL);
+ boolean toFullscreen = to.equals(BOUNDS_FULL);
+
mTarget.initialize(from);
// Started, not running
@@ -215,6 +216,15 @@
startImpl(from, to);
+ // Ensure that the animator is paused for the all windows drawn signal when animating
+ // to/from fullscreen
+ if (fromFullscreen || toFullscreen) {
+ assertTrue(mAnimator.isPaused());
+ mController.onAllWindowsDrawn();
+ } else {
+ assertTrue(!mAnimator.isPaused());
+ }
+
// Started and running
assertTrue(!mTarget.mAwaitingAnimationStart);
assertTrue(mTarget.mAnimationStarted);
@@ -262,7 +272,7 @@
? SCHEDULE_PIP_MODE_CHANGED_ON_END
: NO_PIP_MODE_CHANGED_CALLBACKS;
mAnimator = mController.animateBoundsImpl(mTarget, from, to, DURATION,
- schedulePipModeChangedState, toFullscreen);
+ schedulePipModeChangedState, fromFullscreen, toFullscreen);
// Original stack bounds, frozen task bounds
assertEquals(mFrom, mTarget.mStackBounds);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 5f51898..c809c32 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import android.util.MergedConfiguration;
+import android.view.WindowManager;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -204,4 +206,20 @@
assertEquals(mediaChild, windows.pollFirst());
assertTrue(windows.isEmpty());
}
+
+ @Test
+ public void testPrepareWindowToDisplayDuringRelayout() throws Exception {
+ testPrepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ testPrepareWindowToDisplayDuringRelayout(true /*wasVisible*/);
+ }
+
+ private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) {
+ final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
+ root.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+ root.mTurnOnScreen = false;
+
+ root.prepareWindowToDisplayDuringRelayout(new MergedConfiguration(),
+ wasVisible /*wasVisible*/);
+ assertTrue(root.mTurnOnScreen);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 32eee84..6618a69 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -115,6 +115,10 @@
"mChildAppWindowAbove");
mChildAppWindowBelow = createCommonWindow(mAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
"mChildAppWindowBelow");
+
+ // Adding a display will cause freezing the display. Make sure to wait until it's unfrozen
+ // to not run into race conditions with the tests.
+ waitUntilHandlersIdle();
}
@After
@@ -135,6 +139,9 @@
mDisplayContent.removeImmediately();
sWm.mInputMethodTarget = null;
}
+
+ // Wait until everything is really cleaned up.
+ waitUntilHandlersIdle();
}
private WindowState createCommonWindow(WindowState parent, int type, String name) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 912e7a8..073a17e 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -411,8 +411,8 @@
}
}
- private boolean shouldObfuscateInstantAppsForCaller(int callingUid) {
- return !mPackageManagerInternal.canAccessInstantApps(callingUid);
+ private boolean shouldObfuscateInstantAppsForCaller(int callingUid, int userId) {
+ return !mPackageManagerInternal.canAccessInstantApps(callingUid, userId);
}
void clearAppIdleForPackage(String packageName, int userId) {
@@ -1390,7 +1390,7 @@
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
final int userId = UserHandle.getCallingUserId();
final long token = Binder.clearCallingIdentity();
@@ -1435,7 +1435,7 @@
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
final int userId = UserHandle.getCallingUserId();
final long token = Binder.clearCallingIdentity();
@@ -1456,7 +1456,7 @@
throw re.rethrowFromSystemServer();
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), userId);
final long token = Binder.clearCallingIdentity();
try {
return UsageStatsService.this.isAppIdleFilteredOrParoled(packageName, userId,
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index dc0c485..f373785 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -523,6 +523,26 @@
public static final String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
/**
+ * Connection event used to inform {@link InCallService}s when the process of merging a
+ * Connection into a conference has begun.
+ * <p>
+ * Sent via {@link #sendConnectionEvent(String, Bundle)}. The {@link Bundle} parameter is
+ * expected to be null when this connection event is used.
+ * @hide
+ */
+ public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START";
+
+ /**
+ * Connection event used to inform {@link InCallService}s when the process of merging a
+ * Connection into a conference has completed.
+ * <p>
+ * Sent via {@link #sendConnectionEvent(String, Bundle)}. The {@link Bundle} parameter is
+ * expected to be null when this connection event is used.
+ * @hide
+ */
+ public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE";
+
+ /**
* Connection event used to inform {@link InCallService}s when a call has been put on hold by
* the remote party.
* <p>
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index bf8f8e4..a9655d8 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -100,6 +100,7 @@
private static final String SESSION_ADD_CS_ADAPTER = "CS.aCSA";
private static final String SESSION_REMOVE_CS_ADAPTER = "CS.rCSA";
private static final String SESSION_CREATE_CONN = "CS.crCo";
+ private static final String SESSION_CREATE_CONN_COMPLETE = "CS.crCoC";
private static final String SESSION_CREATE_CONN_FAILED = "CS.crCoF";
private static final String SESSION_ABORT = "CS.ab";
private static final String SESSION_ANSWER = "CS.an";
@@ -152,6 +153,7 @@
private static final int MSG_ON_START_RTT = 26;
private static final int MSG_ON_STOP_RTT = 27;
private static final int MSG_RTT_UPGRADE_RESPONSE = 28;
+ private static final int MSG_CREATE_CONNECTION_COMPLETE = 29;
private static Connection sNullConnection;
@@ -221,6 +223,19 @@
}
@Override
+ public void createConnectionComplete(String id, Session.Info sessionInfo) {
+ Log.startSession(sessionInfo, SESSION_CREATE_CONN_COMPLETE);
+ try {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = id;
+ args.arg2 = Log.createSubsession();
+ mHandler.obtainMessage(MSG_CREATE_CONNECTION_COMPLETE, args).sendToTarget();
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
public void createConnectionFailed(
PhoneAccountHandle connectionManagerPhoneAccount,
String callId,
@@ -630,6 +645,33 @@
}
break;
}
+ case MSG_CREATE_CONNECTION_COMPLETE: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ Log.continueSession((Session) args.arg2,
+ SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE);
+ try {
+ final String id = (String) args.arg1;
+ if (!mAreAccountsInitialized) {
+ Log.d(this, "Enqueueing pre-init request %s", id);
+ mPreInitializationConnectionRequests.add(
+ new android.telecom.Logging.Runnable(
+ SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE
+ + ".pICR",
+ null /*lock*/) {
+ @Override
+ public void loggedRun() {
+ notifyCreateConnectionComplete(id);
+ }
+ }.prepare());
+ } else {
+ notifyCreateConnectionComplete(id);
+ }
+ } finally {
+ args.recycle();
+ Log.endSession();
+ }
+ break;
+ }
case MSG_CREATE_CONNECTION_FAILED: {
SomeArgs args = (SomeArgs) msg.obj;
Log.continueSession((Session) args.arg3, SESSION_HANDLER +
@@ -1373,6 +1415,17 @@
}
}
+ /**
+ * Called by Telecom when the creation of a new Connection has completed and it is now added
+ * to Telecom.
+ * @param callId The ID of the connection.
+ */
+ private void notifyCreateConnectionComplete(final String callId) {
+ Log.i(this, "notifyCreateConnectionComplete %s", callId);
+ onCreateConnectionComplete(findConnectionForAction(callId,
+ "notifyCreateConnectionComplete"));
+ }
+
private void abort(String callId) {
Log.d(this, "abort %s", callId);
findConnectionForAction(callId, "abort").onAbort();
@@ -1770,10 +1823,28 @@
*/
public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
Connection connection) {
+ addExistingConnection(phoneAccountHandle, connection, null /* conference */);
+ }
+
+ /**
+ * Adds a connection created by the {@link ConnectionService} and informs telecom of the new
+ * connection.
+ *
+ * @param phoneAccountHandle The phone account handle for the connection.
+ * @param connection The connection to add.
+ * @param conference The parent conference of the new connection.
+ * @hide
+ */
+ public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
+ Connection connection, Conference conference) {
String id = addExistingConnectionInternal(phoneAccountHandle, connection);
if (id != null) {
List<String> emptyList = new ArrayList<>(0);
+ String conferenceId = null;
+ if (conference != null) {
+ conferenceId = mIdByConference.get(conference);
+ }
ParcelableConnection parcelableConnection = new ParcelableConnection(
phoneAccountHandle,
@@ -1794,7 +1865,8 @@
connection.getStatusHints(),
connection.getDisconnectCause(),
emptyList,
- connection.getExtras());
+ connection.getExtras(),
+ conferenceId);
mAdapter.addExistingConnection(id, parcelableConnection);
}
}
@@ -1836,6 +1908,18 @@
}
/**
+ * Called after the {@link Connection} returned by
+ * {@link #onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)}
+ * or {@link #onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} has been
+ * added to the {@link ConnectionService} and sent to Telecom.
+ *
+ * @param connection the {@link Connection}.
+ * @hide
+ */
+ public void onCreateConnectionComplete(Connection connection) {
+ }
+
+ /**
* Called by Telecom to inform the {@link ConnectionService} that its request to create a new
* incoming {@link Connection} was denied.
* <p>
diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java
index e9dba68..434abf5 100644
--- a/telecomm/java/android/telecom/ParcelableConnection.java
+++ b/telecomm/java/android/telecom/ParcelableConnection.java
@@ -51,6 +51,35 @@
private final DisconnectCause mDisconnectCause;
private final List<String> mConferenceableConnectionIds;
private final Bundle mExtras;
+ private String mParentCallId;
+
+ /** @hide */
+ public ParcelableConnection(
+ PhoneAccountHandle phoneAccount,
+ int state,
+ int capabilities,
+ int properties,
+ int supportedAudioRoutes,
+ Uri address,
+ int addressPresentation,
+ String callerDisplayName,
+ int callerDisplayNamePresentation,
+ IVideoProvider videoProvider,
+ int videoState,
+ boolean ringbackRequested,
+ boolean isVoipAudioMode,
+ long connectTimeMillis,
+ StatusHints statusHints,
+ DisconnectCause disconnectCause,
+ List<String> conferenceableConnectionIds,
+ Bundle extras,
+ String parentCallId) {
+ this(phoneAccount, state, capabilities, properties, supportedAudioRoutes, address,
+ addressPresentation, callerDisplayName, callerDisplayNamePresentation,
+ videoProvider, videoState, ringbackRequested, isVoipAudioMode, connectTimeMillis,
+ statusHints, disconnectCause, conferenceableConnectionIds, extras);
+ mParentCallId = parentCallId;
+ }
/** @hide */
public ParcelableConnection(
@@ -90,6 +119,7 @@
mDisconnectCause = disconnectCause;
mConferenceableConnectionIds = conferenceableConnectionIds;
mExtras = extras;
+ mParentCallId = null;
}
public PhoneAccountHandle getPhoneAccount() {
@@ -176,6 +206,10 @@
return mExtras;
}
+ public final String getParentCallId() {
+ return mParentCallId;
+ }
+
@Override
public String toString() {
return new StringBuilder()
@@ -189,6 +223,8 @@
.append(Connection.propertiesToString(mConnectionProperties))
.append(", extras:")
.append(mExtras)
+ .append(", parent:")
+ .append(mParentCallId)
.toString();
}
@@ -218,6 +254,7 @@
Bundle extras = Bundle.setDefusable(source.readBundle(classLoader), true);
int properties = source.readInt();
int supportedAudioRoutes = source.readInt();
+ String parentCallId = source.readString();
return new ParcelableConnection(
phoneAccount,
@@ -237,7 +274,8 @@
statusHints,
disconnectCause,
conferenceableConnectionIds,
- extras);
+ extras,
+ parentCallId);
}
@Override
@@ -274,5 +312,6 @@
destination.writeBundle(mExtras);
destination.writeInt(mConnectionProperties);
destination.writeInt(mSupportedAudioRoutes);
+ destination.writeString(mParentCallId);
}
}
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
index c631d08..e428286 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
@@ -47,6 +47,8 @@
boolean isUnknown,
in Session.Info sessionInfo);
+ void createConnectionComplete(String callId, in Session.Info sessionInfo);
+
void createConnectionFailed(in PhoneAccountHandle connectionManagerPhoneAccount, String callId,
in ConnectionRequest request, boolean isIncoming, in Session.Info sessionInfo);
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index b4f3d69..9caf9d0 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -113,6 +113,15 @@
</activity>
<activity
+ android:name="DrawIntoHwBitmapActivity"
+ android:label="Bitmaps/DrawIntoHwBitmap">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.hwui.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="PathOffsetActivity"
android:label="Path/Offset">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
new file mode 100644
index 0000000..faabdfc
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 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.test.hwui;
+
+import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
+import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.GraphicBuffer;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.DisplayListCanvas;
+import android.view.RenderNode;
+import android.view.Surface;
+import android.view.ThreadedRenderer;
+import android.widget.ImageView;
+
+public class DrawIntoHwBitmapActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ImageView view = new ImageView(this);
+ view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ setContentView(view);
+ view.setImageBitmap(createBitmap());
+ }
+
+ Bitmap createBitmap() {
+ RenderNode node = RenderNode.create("HwuiCanvas", null);
+ node.setLeftTopRightBottom(0, 0, 500, 500);
+ node.setClipToBounds(false);
+ DisplayListCanvas canvas = node.start(500, 500);
+ Paint p = new Paint();
+ p.setColor(Color.BLACK);
+ p.setTextSize(20 * getResources().getDisplayMetrics().density);
+ canvas.drawColor(0xFF2196F3);
+ p.setColor(0xFFBBDEFB);
+ canvas.drawRect(0, 0, 500, 100, p);
+ p.setColor(Color.BLACK);
+ canvas.drawText("Hello, World!", 0, 90, p);
+ node.end(canvas);
+ return ThreadedRenderer.createHardwareBitmap(node, 500, 500);
+ }
+}
diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java
new file mode 100644
index 0000000..7fd7a63
--- /dev/null
+++ b/tests/net/java/android/net/util/SharedLogTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 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 android.net.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Vector;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SharedLogTest {
+ private static final String TIMESTAMP_PATTERN =
+ "^[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]";
+ private static final String TIMESTAMP = "mm-dd HH:MM:SS.xxx";
+
+ @Test
+ public void testBasicOperation() {
+ final SharedLog logTop = new SharedLog("top");
+ logTop.mark("first post!");
+
+ final SharedLog logLevel2a = logTop.forSubComponent("twoA");
+ final SharedLog logLevel2b = logTop.forSubComponent("twoB");
+ logLevel2b.e("2b or not 2b");
+ logLevel2a.w("second post?");
+
+ final SharedLog logLevel3 = logLevel2a.forSubComponent("three");
+ logTop.log("still logging");
+ logLevel3.log("3 >> 2");
+ logLevel2a.mark("ok: last post");
+
+ final String[] expected = {
+ TIMESTAMP + " - MARK first post!",
+ TIMESTAMP + " - [twoB] ERROR 2b or not 2b",
+ TIMESTAMP + " - [twoA] WARN second post?",
+ TIMESTAMP + " - still logging",
+ TIMESTAMP + " - [twoA.three] 3 >> 2",
+ TIMESTAMP + " - [twoA] MARK ok: last post",
+ };
+ // Verify the logs are all there and in the correct order.
+ verifyLogLines(expected, logTop);
+
+ // In fact, because they all share the same underlying LocalLog,
+ // every subcomponent SharedLog's dump() is identical.
+ verifyLogLines(expected, logLevel2a);
+ verifyLogLines(expected, logLevel2b);
+ verifyLogLines(expected, logLevel3);
+ }
+
+ private static void verifyLogLines(String[] expected, SharedLog log) {
+ final ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+ final PrintWriter pw = new PrintWriter(ostream, true);
+ log.dump(null, pw, null);
+
+ final String dumpOutput = ostream.toString();
+ assertTrue(dumpOutput != null);
+ assertTrue(!"".equals(dumpOutput));
+
+ final String[] lines = dumpOutput.split("\n");
+ assertEquals(expected.length, lines.length);
+
+ for (int i = 0; i < lines.length; i++) {
+ // Fix up the timestamps.
+ lines[i] = lines[i].replaceAll(TIMESTAMP_PATTERN, TIMESTAMP);
+ }
+
+ for (int i = 0; i < expected.length; i++) {
+ assertEquals(expected[i], lines[i]);
+ }
+ }
+}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
index a3f33dc..27e683c 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
@@ -38,6 +38,7 @@
import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.RemoteException;
import android.os.test.TestLooper;
@@ -63,12 +64,14 @@
@Mock private IControlsTethering mTetherHelper;
@Mock private InterfaceConfiguration mInterfaceConfiguration;
@Mock private IPv6TetheringInterfaceServices mIPv6TetheringInterfaceServices;
+ @Mock private SharedLog mSharedLog;
private final TestLooper mLooper = new TestLooper();
private TetherInterfaceStateMachine mTestedSm;
private void initStateMachine(int interfaceType) throws Exception {
- mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), interfaceType,
+ mTestedSm = new TetherInterfaceStateMachine(
+ IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog,
mNMService, mStatsService, mTetherHelper, mIPv6TetheringInterfaceServices);
mTestedSm.start();
// Starting the state machine always puts us in a consistent state and notifies
@@ -90,12 +93,13 @@
@Before public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
}
@Test
public void startsOutAvailable() {
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(),
- TETHERING_BLUETOOTH, mNMService, mStatsService, mTetherHelper,
+ TETHERING_BLUETOOTH, mSharedLog, mNMService, mStatsService, mTetherHelper,
mIPv6TetheringInterfaceServices);
mTestedSm.start();
mLooper.dispatchAll();
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
index 9fcd1b5..ddceea2 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
@@ -128,5 +128,8 @@
assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
// Just to prove we haven't clobbered Wi-Fi:
assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+ // Check that we have not added new cellular interface types
+ assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
}
}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index c72efb0..9bb392a 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -25,11 +25,13 @@
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Handler;
@@ -40,6 +42,7 @@
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.net.util.SharedLog;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -69,6 +72,7 @@
@Mock private Context mContext;
@Mock private IConnectivityManager mCS;
+ @Mock private SharedLog mLog;
private TestStateMachine mSM;
private TestConnectivityManager mCM;
@@ -78,10 +82,12 @@
MockitoAnnotations.initMocks(this);
reset(mContext);
reset(mCS);
+ reset(mLog);
+ when(mLog.forSubComponent(anyString())).thenReturn(mLog);
mCM = spy(new TestConnectivityManager(mContext, mCS));
mSM = new TestStateMachine();
- mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
+ mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM, mLog);
}
@After public void tearDown() throws Exception {
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index b460258..bf18949 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -99,6 +99,7 @@
"link/PrivateAttributeMover.cpp",
"link/ReferenceLinker.cpp",
"link/TableMerger.cpp",
+ "link/XmlCompatVersioner.cpp",
"link/XmlNamespaceRemover.cpp",
"link/XmlReferenceLinker.cpp",
"optimize/ResourceDeduper.cpp",
diff --git a/tools/aapt2/Debug.h b/tools/aapt2/Debug.h
index 56e2e95..e2456c7 100644
--- a/tools/aapt2/Debug.h
+++ b/tools/aapt2/Debug.h
@@ -37,6 +37,7 @@
const ResourceName& target_style);
static void DumpHex(const void* data, size_t len);
static void DumpXml(xml::XmlResource* doc);
+ static std::string ToString(xml::XmlResource* doc);
};
} // namespace aapt
diff --git a/tools/aapt2/Format.proto b/tools/aapt2/Format.proto
index 0917129..870b735 100644
--- a/tools/aapt2/Format.proto
+++ b/tools/aapt2/Format.proto
@@ -69,6 +69,7 @@
optional Visibility visibility = 1;
optional Source source = 2;
optional string comment = 3;
+ optional bool allow_new = 4;
}
message Entry {
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index e45d142..1d2e3a4 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,7 +27,7 @@
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "15";
+static const char* sMinorVersion = "16";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 493f238..0a74c1a 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -388,13 +388,20 @@
struct hash<aapt::ResourceName> {
size_t operator()(const aapt::ResourceName& name) const {
android::hash_t h = 0;
- h = android::JenkinsHashMix(h, hash<string>()(name.package));
+ h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.package)));
h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
- h = android::JenkinsHashMix(h, hash<string>()(name.entry));
+ h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.entry)));
return static_cast<size_t>(h);
}
};
+template <>
+struct hash<aapt::ResourceId> {
+ size_t operator()(const aapt::ResourceId& id) const {
+ return id.id;
+ }
+};
+
} // namespace std
#endif // AAPT_RESOURCE_H
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 0d1850f..57ae270 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -92,14 +92,14 @@
Source source;
ResourceId id;
Maybe<SymbolState> symbol_state;
+ bool allow_new = false;
std::string comment;
std::unique_ptr<Value> value;
std::list<ParsedResource> child_resources;
};
// Recursively adds resources to the ResourceTable.
-static bool AddResourcesToTable(ResourceTable* table, IDiagnostics* diag,
- ParsedResource* res) {
+static bool AddResourcesToTable(ResourceTable* table, IDiagnostics* diag, ParsedResource* res) {
StringPiece trimmed_comment = util::TrimWhitespace(res->comment);
if (trimmed_comment.size() != res->comment.size()) {
// Only if there was a change do we re-assign.
@@ -111,6 +111,7 @@
symbol.state = res->symbol_state.value();
symbol.source = res->source;
symbol.comment = res->comment;
+ symbol.allow_new = res->allow_new;
if (!table->SetSymbolState(res->name, res->id, symbol, diag)) {
return false;
}
@@ -121,8 +122,8 @@
res->value->SetComment(std::move(res->comment));
res->value->SetSource(std::move(res->source));
- if (!table->AddResource(res->name, res->id, res->config, res->product,
- std::move(res->value), diag)) {
+ if (!table->AddResource(res->name, res->id, res->config, res->product, std::move(res->value),
+ diag)) {
return false;
}
}
@@ -849,6 +850,7 @@
ParsedResource* out_resource) {
if (ParseSymbolImpl(parser, out_resource)) {
out_resource->symbol_state = SymbolState::kUndefined;
+ out_resource->allow_new = true;
return true;
}
return false;
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index faa6607..e3abde6 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -777,8 +777,7 @@
ASSERT_FALSE(TestParse(input));
}
-TEST_F(ResourceParserTest,
- AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
+TEST_F(ResourceParserTest, AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
ASSERT_TRUE(TestParse(input));
@@ -788,6 +787,7 @@
const ResourceEntry* entry = result.value().entry;
ASSERT_NE(nullptr, entry);
EXPECT_EQ(SymbolState::kUndefined, entry->symbol_status.state);
+ EXPECT_TRUE(entry->symbol_status.allow_new);
}
TEST_F(ResourceParserTest, ParseItemElementWithFormat) {
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 1947628..168004f 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -440,8 +440,7 @@
return true;
}
-bool ResourceTable::SetSymbolState(const ResourceNameRef& name,
- const ResourceId& res_id,
+bool ResourceTable::SetSymbolState(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag) {
return SetSymbolStateImpl(name, res_id, symbol, ValidateName, diag);
}
@@ -489,8 +488,7 @@
diag->Error(DiagMessage(symbol.source)
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but resource already has ID "
- << ResourceId(package->id.value(), type->id.value(),
- entry->id.value()));
+ << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
return false;
}
@@ -505,6 +503,11 @@
type->symbol_status.state = SymbolState::kPublic;
}
+ if (symbol.allow_new) {
+ // This symbol can be added as a new resource when merging (if it belongs to an overlay).
+ entry->symbol_status.allow_new = true;
+ }
+
if (symbol.state == SymbolState::kUndefined &&
entry->symbol_status.state != SymbolState::kUndefined) {
// We can't undefine a symbol (remove its visibility). Ignore.
@@ -517,7 +520,10 @@
return true;
}
- entry->symbol_status = std::move(symbol);
+ // This symbol definition takes precedence, replace.
+ entry->symbol_status.state = symbol.state;
+ entry->symbol_status.source = symbol.source;
+ entry->symbol_status.comment = symbol.comment;
return true;
}
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index b032121..4295d06 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -50,6 +50,10 @@
struct Symbol {
SymbolState state = SymbolState::kUndefined;
Source source;
+
+ // Whether this entry (originating from an overlay) can be added as a new resource.
+ bool allow_new = false;
+
std::string comment;
};
@@ -223,8 +227,7 @@
bool SetSymbolState(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag);
- bool SetSymbolStateAllowMangled(const ResourceNameRef& name,
- const ResourceId& res_id,
+ bool SetSymbolStateAllowMangled(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag);
struct SearchResult {
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 0cb8c67..34bd2b4 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -333,6 +333,12 @@
}
}
+Attribute::Attribute()
+ : type_mask(0u),
+ min_int(std::numeric_limits<int32_t>::min()),
+ max_int(std::numeric_limits<int32_t>::max()) {
+}
+
Attribute::Attribute(bool w, uint32_t t)
: type_mask(t),
min_int(std::numeric_limits<int32_t>::min()),
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index c71c738..06f949f 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -18,6 +18,7 @@
#define AAPT_RESOURCE_VALUES_H
#include <array>
+#include <limits>
#include <ostream>
#include <vector>
@@ -251,6 +252,7 @@
int32_t max_int;
std::vector<Symbol> symbols;
+ Attribute();
explicit Attribute(bool w, uint32_t t = 0u);
bool Equals(const Value* value) const override;
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index e806714..041cb4f 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -26,9 +26,9 @@
namespace aapt {
static const char* sDevelopmentSdkCodeName = "O";
-static int sDevelopmentSdkLevel = 26;
+static ApiVersion sDevelopmentSdkLevel = 26;
-static const std::vector<std::pair<uint16_t, size_t>> sAttrIdMap = {
+static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
{0x021c, 1},
{0x021d, 2},
{0x0269, SDK_CUPCAKE},
@@ -48,26 +48,29 @@
{0x03f1, SDK_KITKAT},
{0x03f6, SDK_KITKAT_WATCH},
{0x04ce, SDK_LOLLIPOP},
+ {0x04d8, SDK_LOLLIPOP_MR1},
+ {0x04f1, SDK_MARSHMALLOW},
+ {0x0527, SDK_NOUGAT},
+ {0x0530, SDK_NOUGAT_MR1},
+ {0x0568, SDK_O},
};
-static bool less_entry_id(const std::pair<uint16_t, size_t>& p,
- uint16_t entryId) {
+static bool less_entry_id(const std::pair<uint16_t, ApiVersion>& p, uint16_t entryId) {
return p.first < entryId;
}
-size_t FindAttributeSdkLevel(const ResourceId& id) {
- if (id.package_id() != 0x01 && id.type_id() != 0x01) {
+ApiVersion FindAttributeSdkLevel(const ResourceId& id) {
+ if (id.package_id() != 0x01 || id.type_id() != 0x01) {
return 0;
}
- auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(),
- id.entry_id(), less_entry_id);
+ auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(), id.entry_id(), less_entry_id);
if (iter == sAttrIdMap.end()) {
return SDK_LOLLIPOP_MR1;
}
return iter->second;
}
-static const std::unordered_map<std::string, size_t> sAttrMap = {
+static const std::unordered_map<std::string, ApiVersion> sAttrMap = {
{"marqueeRepeatLimit", 2},
{"windowNoDisplay", 3},
{"backgroundDimEnabled", 3},
@@ -729,7 +732,7 @@
{"windowActivityTransitions", 21},
{"colorEdgeEffect", 21}};
-size_t FindAttributeSdkLevel(const ResourceName& name) {
+ApiVersion FindAttributeSdkLevel(const ResourceName& name) {
if (name.package != "android" && name.type != ResourceType::kAttr) {
return 0;
}
@@ -741,9 +744,8 @@
return SDK_LOLLIPOP_MR1;
}
-std::pair<StringPiece, int> GetDevelopmentSdkCodeNameAndVersion() {
- return std::make_pair(StringPiece(sDevelopmentSdkCodeName),
- sDevelopmentSdkLevel);
+std::pair<StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion() {
+ return std::make_pair(StringPiece(sDevelopmentSdkCodeName), sDevelopmentSdkLevel);
}
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index c2ee252..e3745e8 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -25,7 +25,9 @@
namespace aapt {
-enum : int {
+using ApiVersion = int;
+
+enum : ApiVersion {
SDK_CUPCAKE = 3,
SDK_DONUT = 4,
SDK_ECLAIR = 5,
@@ -49,12 +51,12 @@
SDK_MARSHMALLOW = 23,
SDK_NOUGAT = 24,
SDK_NOUGAT_MR1 = 25,
- SDK_O = 26, // STOPSHIP Replace with real version
+ SDK_O = 26,
};
-size_t FindAttributeSdkLevel(const ResourceId& id);
-size_t FindAttributeSdkLevel(const ResourceName& name);
-std::pair<android::StringPiece, int> GetDevelopmentSdkCodeNameAndVersion();
+ApiVersion FindAttributeSdkLevel(const ResourceId& id);
+ApiVersion FindAttributeSdkLevel(const ResourceName& name);
+std::pair<android::StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion();
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants_test.cpp b/tools/aapt2/SdkConstants_test.cpp
index 716d922..61f4d71 100644
--- a/tools/aapt2/SdkConstants_test.cpp
+++ b/tools/aapt2/SdkConstants_test.cpp
@@ -21,18 +21,11 @@
namespace aapt {
TEST(SdkConstantsTest, FirstAttributeIsSdk1) {
- EXPECT_EQ(1u, FindAttributeSdkLevel(ResourceId(0x01010000)));
+ EXPECT_EQ(1, FindAttributeSdkLevel(ResourceId(0x01010000)));
}
-TEST(SdkConstantsTest, AllAttributesAfterLollipopAreLollipopMR1) {
- EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010103f7)));
- EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010104ce)));
-
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104cf)));
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d8)));
-
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d9)));
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x0101ffff)));
+TEST(SdkConstantsTest, NonFrameworkAttributeIsSdk0) {
+ EXPECT_EQ(0, FindAttributeSdkLevel(ResourceId(0x7f010345)));
}
} // namespace aapt
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 5adf04a..e09a3979 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -478,7 +478,8 @@
{
std::string content;
- if (!android::base::ReadFileToString(path_data.source.path, &content)) {
+ if (!android::base::ReadFileToString(path_data.source.path, &content,
+ true /*follow_symlinks*/)) {
context->GetDiagnostics()->Error(DiagMessage(path_data.source)
<< android::base::SystemErrorCodeToString(errno));
return false;
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 8accfa8..dd4b2ba 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -50,6 +50,7 @@
#include "link/ManifestFixer.h"
#include "link/ReferenceLinker.h"
#include "link/TableMerger.h"
+#include "link/XmlCompatVersioner.h"
#include "optimize/ResourceDeduper.h"
#include "optimize/VersionCollapser.h"
#include "process/IResourceTableConsumer.h"
@@ -247,25 +248,20 @@
IAaptContext* context_;
};
-static bool FlattenXml(xml::XmlResource* xml_res, const StringPiece& path,
- Maybe<size_t> max_sdk_level, bool keep_raw_values, IArchiveWriter* writer,
- IAaptContext* context) {
+static bool FlattenXml(IAaptContext* context, xml::XmlResource* xml_res, const StringPiece& path,
+ bool keep_raw_values, IArchiveWriter* writer) {
BigBuffer buffer(1024);
XmlFlattenerOptions options = {};
options.keep_raw_values = keep_raw_values;
- options.max_sdk_level = max_sdk_level;
XmlFlattener flattener(&buffer, options);
if (!flattener.Consume(context, xml_res)) {
return false;
}
if (context->IsVerbose()) {
- DiagMessage msg;
- msg << "writing " << path << " to archive";
- if (max_sdk_level) {
- msg << " maxSdkLevel=" << max_sdk_level.value() << " keepRawValues=" << keep_raw_values;
- }
- context->GetDiagnostics()->Note(msg);
+ context->GetDiagnostics()->Note(DiagMessage(path) << "writing to archive (keep_raw_values="
+ << (keep_raw_values ? "true" : "false")
+ << ")");
}
io::BigBufferInputStream input_stream(&buffer);
@@ -311,12 +307,33 @@
std::unordered_set<std::string> extensions_to_not_compress;
};
+// A sampling of public framework resource IDs.
+struct R {
+ struct attr {
+ enum : uint32_t {
+ paddingLeft = 0x010100d6u,
+ paddingRight = 0x010100d8u,
+ paddingHorizontal = 0x0101053du,
+
+ paddingTop = 0x010100d7u,
+ paddingBottom = 0x010100d9u,
+ paddingVertical = 0x0101053eu,
+
+ layout_marginLeft = 0x010100f7u,
+ layout_marginRight = 0x010100f9u,
+ layout_marginHorizontal = 0x0101053bu,
+
+ layout_marginTop = 0x010100f8u,
+ layout_marginBottom = 0x010100fau,
+ layout_marginVertical = 0x0101053cu,
+ };
+ };
+};
+
class ResourceFileFlattener {
public:
ResourceFileFlattener(const ResourceFileFlattenerOptions& options, IAaptContext* context,
- proguard::KeepSet* keep_set)
- : options_(options), context_(context), keep_set_(keep_set) {
- }
+ proguard::KeepSet* keep_set);
bool Flatten(ResourceTable* table, IArchiveWriter* archive_writer);
@@ -325,7 +342,7 @@
ConfigDescription config;
// The entry this file came from.
- const ResourceEntry* entry;
+ ResourceEntry* entry;
// The file to copy as-is.
io::IFile* file_to_copy;
@@ -335,19 +352,72 @@
// The destination to write this file to.
std::string dst_path;
- bool skip_version = false;
};
uint32_t GetCompressionFlags(const StringPiece& str);
- bool LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
- std::queue<FileOperation>* out_file_op_queue);
+ std::vector<std::unique_ptr<xml::XmlResource>> LinkAndVersionXmlFile(ResourceTable* table,
+ FileOperation* file_op);
ResourceFileFlattenerOptions options_;
IAaptContext* context_;
proguard::KeepSet* keep_set_;
+ XmlCompatVersioner::Rules rules_;
};
+ResourceFileFlattener::ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
+ IAaptContext* context, proguard::KeepSet* keep_set)
+ : options_(options), context_(context), keep_set_(keep_set) {
+ SymbolTable* symm = context_->GetExternalSymbols();
+
+ // Build up the rules for degrading newer attributes to older ones.
+ // NOTE(adamlesinski): These rules are hardcoded right now, but they should be
+ // generated from the attribute definitions themselves (b/62028956).
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingHorizontal)) {
+ std::vector<ReplacementAttr> replacements{
+ {"paddingLeft", R::attr::paddingLeft,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"paddingRight", R::attr::paddingRight,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingVertical)) {
+ std::vector<ReplacementAttr> replacements{
+ {"paddingTop", R::attr::paddingTop,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"paddingBottom", R::attr::paddingBottom,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::paddingVertical] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginHorizontal)) {
+ std::vector<ReplacementAttr> replacements{
+ {"layout_marginLeft", R::attr::layout_marginLeft,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"layout_marginRight", R::attr::layout_marginRight,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::layout_marginHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginVertical)) {
+ std::vector<ReplacementAttr> replacements{
+ {"layout_marginTop", R::attr::layout_marginTop,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"layout_marginBottom", R::attr::layout_marginBottom,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::layout_marginVertical] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+}
+
uint32_t ResourceFileFlattener::GetCompressionFlags(const StringPiece& str) {
if (options_.do_not_compress_anything) {
return 0;
@@ -369,8 +439,19 @@
name == "transitionManager";
}
-bool ResourceFileFlattener::LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
- std::queue<FileOperation>* out_file_op_queue) {
+static bool IsVectorElement(const std::string& name) {
+ return name == "vector" || name == "animated-vector";
+}
+
+template <typename T>
+std::vector<T> make_singleton_vec(T&& val) {
+ std::vector<T> vec;
+ vec.emplace_back(std::forward<T>(val));
+ return vec;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> ResourceFileFlattener::LinkAndVersionXmlFile(
+ ResourceTable* table, FileOperation* file_op) {
xml::XmlResource* doc = file_op->xml_to_flatten.get();
const Source& src = doc->file.source;
@@ -380,107 +461,60 @@
XmlReferenceLinker xml_linker;
if (!xml_linker.Consume(context_, doc)) {
- return false;
+ return {};
}
if (options_.update_proguard_spec && !proguard::CollectProguardRules(src, doc, keep_set_)) {
- return false;
+ return {};
}
if (options_.no_xml_namespaces) {
XmlNamespaceRemover namespace_remover;
if (!namespace_remover.Consume(context_, doc)) {
- return false;
+ return {};
}
}
- if (!options_.no_auto_version) {
- if (options_.no_version_vectors) {
- // Skip this if it is a vector or animated-vector.
- xml::Element* el = xml::FindRootElement(doc);
- if (el && el->namespace_uri.empty()) {
- if (el->name == "vector" || el->name == "animated-vector") {
- // We are NOT going to version this file.
- file_op->skip_version = true;
- return true;
- }
- }
- }
- if (options_.no_version_transitions) {
- // Skip this if it is a transition resource.
- xml::Element* el = xml::FindRootElement(doc);
- if (el && el->namespace_uri.empty()) {
- if (IsTransitionElement(el->name)) {
- // We are NOT going to version this file.
- file_op->skip_version = true;
- return true;
- }
- }
- }
+ if (options_.no_auto_version) {
+ return make_singleton_vec(std::move(file_op->xml_to_flatten));
+ }
- const ConfigDescription& config = file_op->config;
-
- // Find the first SDK level used that is higher than this defined config and
- // not superseded by a lower or equal SDK level resource.
- const int min_sdk_version = context_->GetMinSdkVersion();
- for (int sdk_level : xml_linker.sdk_levels()) {
- if (sdk_level > min_sdk_version && sdk_level > config.sdkVersion) {
- if (!ShouldGenerateVersionedResource(file_op->entry, config, sdk_level)) {
- // If we shouldn't generate a versioned resource, stop checking.
- break;
- }
-
- ResourceFile versioned_file_desc = doc->file;
- versioned_file_desc.config.sdkVersion = (uint16_t)sdk_level;
-
- FileOperation new_file_op;
- new_file_op.xml_to_flatten = util::make_unique<xml::XmlResource>(
- versioned_file_desc, StringPool{}, doc->root->Clone());
- new_file_op.config = versioned_file_desc.config;
- new_file_op.entry = file_op->entry;
- new_file_op.dst_path =
- ResourceUtils::BuildResourceFileName(versioned_file_desc, context_->GetNameMangler());
-
- if (context_->IsVerbose()) {
- context_->GetDiagnostics()->Note(DiagMessage(versioned_file_desc.source)
- << "auto-versioning resource from config '" << config
- << "' -> '" << versioned_file_desc.config << "'");
- }
-
- bool added = table->AddFileReferenceAllowMangled(
- versioned_file_desc.name, versioned_file_desc.config, versioned_file_desc.source,
- new_file_op.dst_path, nullptr, context_->GetDiagnostics());
- if (!added) {
- return false;
- }
-
- out_file_op_queue->push(std::move(new_file_op));
- break;
+ if (options_.no_version_vectors || options_.no_version_transitions) {
+ // Skip this if it is a vector or animated-vector.
+ xml::Element* el = xml::FindRootElement(doc);
+ if (el && el->namespace_uri.empty()) {
+ if ((options_.no_version_vectors && IsVectorElement(el->name)) ||
+ (options_.no_version_transitions && IsTransitionElement(el->name))) {
+ return make_singleton_vec(std::move(file_op->xml_to_flatten));
}
}
}
- return true;
+
+ const ConfigDescription& config = file_op->config;
+ ResourceEntry* entry = file_op->entry;
+
+ XmlCompatVersioner xml_compat_versioner(&rules_);
+ const util::Range<ApiVersion> api_range{config.sdkVersion,
+ FindNextApiVersionForConfig(entry, config)};
+ return xml_compat_versioner.Process(context_, doc, api_range);
}
-/**
- * Do not insert or remove any resources while executing in this function. It
- * will
- * corrupt the iteration order.
- */
bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
bool error = false;
std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
for (auto& pkg : table->packages) {
for (auto& type : pkg->types) {
- // Sort by config and name, so that we get better locality in the zip
- // file.
+ // Sort by config and name, so that we get better locality in the zip file.
config_sorted_files.clear();
std::queue<FileOperation> file_operations;
// Populate the queue with all files in the ResourceTable.
for (auto& entry : type->entries) {
for (auto& config_value : entry->values) {
+ // WARNING! Do not insert or remove any resources while executing in this scope. It will
+ // corrupt the iteration order.
+
FileReference* file_ref = ValueCast<FileReference>(config_value->value.get());
if (!file_ref) {
continue;
@@ -497,6 +531,7 @@
file_op.entry = entry.get();
file_op.dst_path = *file_ref->path;
file_op.config = config_value->config;
+ file_op.file_to_copy = file;
const StringPiece src_path = file->GetSource().path;
if (type->type != ResourceType::kRaw &&
@@ -518,68 +553,51 @@
file_op.xml_to_flatten->file.config = config_value->config;
file_op.xml_to_flatten->file.source = file_ref->GetSource();
file_op.xml_to_flatten->file.name = ResourceName(pkg->name, type->type, entry->name);
-
- // Enqueue the XML files to be processed.
- file_operations.push(std::move(file_op));
- } else {
- file_op.file_to_copy = file;
-
- // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
- // else we end up copying the string in the std::make_pair() method,
- // then creating a StringPiece from the copy, which would cause us
- // to end up referencing garbage in the map.
- const StringPiece entry_name(entry->name);
- config_sorted_files[std::make_pair(config_value->config, entry_name)] =
- std::move(file_op);
}
+
+ // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
+ // else we end up copying the string in the std::make_pair() method,
+ // then creating a StringPiece from the copy, which would cause us
+ // to end up referencing garbage in the map.
+ const StringPiece entry_name(entry->name);
+ config_sorted_files[std::make_pair(config_value->config, entry_name)] =
+ std::move(file_op);
}
}
- // Now process the XML queue
- for (; !file_operations.empty(); file_operations.pop()) {
- FileOperation& file_op = file_operations.front();
-
- if (!LinkAndVersionXmlFile(table, &file_op, &file_operations)) {
- error = true;
- continue;
- }
-
- // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
- // we end up copying the string in the std::make_pair() method, then
- // creating a StringPiece from the copy, which would cause us to end up
- // referencing garbage in the map.
- const StringPiece entry_name(file_op.entry->name);
- config_sorted_files[std::make_pair(file_op.config, entry_name)] = std::move(file_op);
- }
-
- if (error) {
- return false;
- }
-
// Now flatten the sorted values.
for (auto& map_entry : config_sorted_files) {
const ConfigDescription& config = map_entry.first.first;
- const FileOperation& file_op = map_entry.second;
+ FileOperation& file_op = map_entry.second;
if (file_op.xml_to_flatten) {
- Maybe<size_t> max_sdk_level;
- if (!options_.no_auto_version && !file_op.skip_version) {
- max_sdk_level = std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
- context_->GetMinSdkVersion());
- }
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ LinkAndVersionXmlFile(table, &file_op);
+ for (std::unique_ptr<xml::XmlResource>& doc : versioned_docs) {
+ std::string dst_path = file_op.dst_path;
+ if (doc->file.config != file_op.config) {
+ // Only add the new versioned configurations.
+ if (context_->IsVerbose()) {
+ context_->GetDiagnostics()->Note(DiagMessage(doc->file.source)
+ << "auto-versioning resource from config '"
+ << config << "' -> '" << doc->file.config << "'");
+ }
- bool result = FlattenXml(file_op.xml_to_flatten.get(), file_op.dst_path, max_sdk_level,
- options_.keep_raw_values, archive_writer, context_);
- if (!result) {
- error = true;
+ dst_path =
+ ResourceUtils::BuildResourceFileName(doc->file, context_->GetNameMangler());
+ bool result = table->AddFileReferenceAllowMangled(doc->file.name, doc->file.config,
+ doc->file.source, dst_path, nullptr,
+ context_->GetDiagnostics());
+ if (!result) {
+ return false;
+ }
+ }
+ error |= !FlattenXml(context_, doc.get(), dst_path, options_.keep_raw_values,
+ archive_writer);
}
} else {
- bool result =
- io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
- GetCompressionFlags(file_op.dst_path), archive_writer);
- if (!result) {
- error = true;
- }
+ error |= !io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
+ GetCompressionFlags(file_op.dst_path), archive_writer);
}
}
}
@@ -614,7 +632,7 @@
static bool LoadStableIdMap(IDiagnostics* diag, const std::string& path,
std::unordered_map<ResourceName, ResourceId>* out_id_map) {
std::string content;
- if (!android::base::ReadFileToString(path, &content)) {
+ if (!android::base::ReadFileToString(path, &content, true /*follow_symlinks*/)) {
diag->Error(DiagMessage(path) << "failed reading stable ID file");
return false;
}
@@ -1358,8 +1376,7 @@
bool WriteApk(IArchiveWriter* writer, proguard::KeepSet* keep_set, xml::XmlResource* manifest,
ResourceTable* table) {
const bool keep_raw_values = context_->GetPackageType() == PackageType::kStaticLib;
- bool result =
- FlattenXml(manifest, "AndroidManifest.xml", {}, keep_raw_values, writer, context_);
+ bool result = FlattenXml(context_, manifest, "AndroidManifest.xml", keep_raw_values, writer);
if (!result) {
return false;
}
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 14d4260..8741b7b 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -131,7 +131,7 @@
}
static xml::AaptAttribute CreateAttributeWithId(const ResourceId& id) {
- return xml::AaptAttribute{id, Attribute(true)};
+ return xml::AaptAttribute(Attribute(), id);
}
std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index e98d2d7..0711749 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -194,16 +194,9 @@
// Filter the attributes.
for (xml::Attribute& attr : node->attributes) {
- if (options_.max_sdk_level && attr.compiled_attribute && attr.compiled_attribute.value().id) {
- size_t sdk_level = FindAttributeSdkLevel(attr.compiled_attribute.value().id.value());
- if (sdk_level > options_.max_sdk_level.value()) {
- continue;
- }
+ if (attr.namespace_uri != xml::kSchemaTools) {
+ filtered_attrs_.push_back(&attr);
}
- if (attr.namespace_uri == xml::kSchemaTools) {
- continue;
- }
- filtered_attrs_.push_back(&attr);
}
if (filtered_attrs_.empty()) {
diff --git a/tools/aapt2/flatten/XmlFlattener.h b/tools/aapt2/flatten/XmlFlattener.h
index f5129fd..87557f2 100644
--- a/tools/aapt2/flatten/XmlFlattener.h
+++ b/tools/aapt2/flatten/XmlFlattener.h
@@ -30,11 +30,6 @@
* Keep attribute raw string values along with typed values.
*/
bool keep_raw_values = false;
-
- /**
- * If set, the max SDK level of attribute to flatten. All others are ignored.
- */
- Maybe<size_t> max_sdk_level;
};
class XmlFlattener : public IXmlResourceConsumer {
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index cfa89bb..f1e903f 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -149,31 +149,6 @@
ASSERT_EQ(android::ResXMLTree::END_DOCUMENT, tree.next());
}
-TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
- std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
- <View xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingStart="1dp"
- android:colorAccent="#ffffff"/>)EOF");
-
- XmlReferenceLinker linker;
- ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
- ASSERT_TRUE(linker.sdk_levels().count(17) == 1);
- ASSERT_TRUE(linker.sdk_levels().count(21) == 1);
-
- android::ResXMLTree tree;
- XmlFlattenerOptions options;
- options.max_sdk_level = 17;
- ASSERT_TRUE(Flatten(doc.get(), &tree, options));
-
- while (tree.next() != android::ResXMLTree::START_TAG) {
- ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
- ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
- }
-
- ASSERT_EQ(1u, tree.getAttributeCount());
- EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
-}
-
TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripOnlyTools) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
<View xmlns:tools="http://schemas.android.com/tools"
@@ -234,13 +209,11 @@
}
const StringPiece16 kPackage = u"package";
- EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()),
- 0);
+ EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()), 0);
}
TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) {
- std::unique_ptr<xml::XmlResource> doc =
- test::BuildXmlDom("<View package=\"\"/>");
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom("<View package=\"\"/>");
android::ResXMLTree tree;
ASSERT_TRUE(Flatten(doc.get(), &tree));
@@ -251,8 +224,7 @@
}
const StringPiece16 kPackage = u"package";
- ssize_t idx =
- tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
+ ssize_t idx = tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
ASSERT_GE(idx, 0);
size_t len;
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/Android.mk b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
new file mode 100644
index 0000000..012728f
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptAutoVersionTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
new file mode 100644
index 0000000..e66d709
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.autoversiontest">
+
+ <uses-sdk android:minSdkVersion="7" />
+</manifest>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
new file mode 100644
index 0000000..bfc5445
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingVertical="24dp" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
new file mode 100644
index 0000000..091a8ce
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoStart="true"
+ android:expandableListViewWhiteStyle="@empty"
+ android:screenSize="large"
+ android:subtitle="Hello"
+ android:resizeMode="none"
+ android:largestWidthLimitDp="999"
+ android:uiOptions="none"
+ android:parentActivityName="Hello"
+ android:paddingStart="999dp"
+ android:requiredForAllUsers="true"
+ android:category="Hello"
+ android:isGame="true"
+ android:colorPrimary="#ffffff"
+ android:revisionCode="999"
+ android:autoVerify="true"
+ android:use32bitAbi="true"
+ android:shortcutId="@+id/id" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
new file mode 100644
index 0000000..339337a
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ class="foo">
+ <View
+ android:paddingHorizontal="24dp" />
+ <View
+ android:paddingHorizontal="24dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp" />
+ <View
+ android:paddingHorizontal="24dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp" />
+ <View
+ android:paddingVertical="24dp" />
+ <View
+ android:paddingVertical="24dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp" />
+ <View
+ android:layout_marginHorizontal="24dp" />
+ <View
+ android:layout_marginHorizontal="24dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp" />
+ <View
+ android:layout_marginVertical="24dp" />
+ <View
+ android:layout_marginVertical="24dp"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="16dp" />
+</View>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
new file mode 100644
index 0000000..8025ce1
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
new file mode 100644
index 0000000..ff13faa
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <style name="Style2">
+ <!-- API 7 -->
+ <item name="android:autoStart">false</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">0dp</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#00ff00</item>
+ </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
new file mode 100644
index 0000000..c4f09846
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <style name="Style1">
+ <!-- API 7 -->
+ <item name="android:autoStart">true</item>
+
+ <!-- API 8 -->
+ <item name="android:expandableListViewWhiteStyle">@null</item>
+
+ <!-- API 9 -->
+ <item name="android:screenSize">large</item>
+
+ <!-- API 11 -->
+ <item name="android:subtitle">Hello</item>
+
+ <!-- API 12 -->
+ <item name="android:resizeMode">none</item>
+
+ <!-- API 13 -->
+ <item name="android:largestWidthLimitDp">999</item>
+
+ <!-- API 14 -->
+ <item name="android:uiOptions">none</item>
+
+ <!-- API 16 -->
+ <item name="android:parentActivityName">Hello</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">999dp</item>
+
+ <!-- API 18 -->
+ <item name="android:requiredForAllUsers">true</item>
+
+ <!-- API 19 -->
+ <item name="android:category">Hello</item>
+
+ <!-- API 20 -->
+ <item name="android:isGame">true</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#ffffff</item>
+
+ <!-- API 22 -->
+ <item name="android:revisionCode">999</item>
+
+ <!-- API 23 -->
+ <item name="android:autoVerify">true</item>
+
+ <!-- API 24 -->
+ <item name="android:use32bitAbi">true</item>
+
+ <!-- API 25 -->
+ <item name="android:shortcutId">@+id/id</item>
+
+ <!-- API 26 -->
+ <item name="android:paddingHorizontal">999dp</item>
+ </style>
+
+ <style name="Style2">
+ <!-- API 7 -->
+ <item name="android:autoStart">true</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">999dp</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#ffffff</item>
+ </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/Android.mk b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
new file mode 100644
index 0000000..902fc65
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptSymlinkTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
new file mode 100644
index 0000000..abbfa53
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.symlinktest" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
new file mode 120000
index 0000000..a7e8e2f
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
@@ -0,0 +1 @@
+../../targets/white_3x3.9.png
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
new file mode 120000
index 0000000..29c30e1
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
@@ -0,0 +1 @@
+../../targets/layout.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
new file mode 120000
index 0000000..554bb71
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
@@ -0,0 +1 @@
+../../targets/values.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
new file mode 100644
index 0000000..e5835ed
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
new file mode 100644
index 0000000..5b02843
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <bool name="foo">true</bool>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
Binary files differ
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 77471ea..f80c6e9 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -27,13 +27,15 @@
namespace aapt {
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
- const ConfigDescription& config,
- const int sdk_version_to_generate) {
- // We assume the caller is trying to generate a version greater than the
- // current configuration.
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+ const ApiVersion sdk_version_to_generate) {
+ // We assume the caller is trying to generate a version greater than the current configuration.
CHECK(sdk_version_to_generate > config.sdkVersion);
+ return sdk_version_to_generate < FindNextApiVersionForConfig(entry, config);
+}
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry,
+ const ConfigDescription& config) {
const auto end_iter = entry->values.end();
auto iter = entry->values.begin();
for (; iter != end_iter; ++iter) {
@@ -46,26 +48,23 @@
CHECK(iter != entry->values.end());
++iter;
- // The next configuration either only varies in sdkVersion, or it is
- // completely different
- // and therefore incompatible. If it is incompatible, we must generate the
- // versioned resource.
+ // The next configuration either only varies in sdkVersion, or it is completely different
+ // and therefore incompatible. If it is incompatible, we must generate the versioned resource.
- // NOTE: The ordering of configurations takes sdkVersion as higher precedence
- // than other
+ // NOTE: The ordering of configurations takes sdkVersion as higher precedence than other
// qualifiers, so we need to iterate through the entire list to be sure there
// are no higher sdk level versions of this resource.
ConfigDescription temp_config(config);
for (; iter != end_iter; ++iter) {
temp_config.sdkVersion = (*iter)->config.sdkVersion;
if (temp_config == (*iter)->config) {
- // The two configs are the same, check the sdk version.
- return sdk_version_to_generate < (*iter)->config.sdkVersion;
+ // The two configs are the same, return the sdkVersion.
+ return (*iter)->config.sdkVersion;
}
}
- // No match was found, so we should generate the versioned resource.
- return true;
+ // Didn't find another config with a different sdk version, so return the highest possible value.
+ return std::numeric_limits<ApiVersion>::max();
}
bool AutoVersioner::Consume(IAaptContext* context, ResourceTable* table) {
@@ -86,7 +85,7 @@
}
if (Style* style = ValueCast<Style>(config_value->value.get())) {
- Maybe<size_t> min_sdk_stripped;
+ Maybe<ApiVersion> min_sdk_stripped;
std::vector<Style::Entry> stripped;
auto iter = style->entries.begin();
@@ -95,17 +94,14 @@
// Find the SDK level that is higher than the configuration
// allows.
- const size_t sdk_level =
- FindAttributeSdkLevel(iter->key.id.value());
- if (sdk_level >
- std::max<size_t>(config_value->config.sdkVersion, 1)) {
+ const ApiVersion sdk_level = FindAttributeSdkLevel(iter->key.id.value());
+ if (sdk_level > std::max<ApiVersion>(config_value->config.sdkVersion, 1)) {
// Record that we are about to strip this.
stripped.emplace_back(std::move(*iter));
// We use the smallest SDK level to generate the new style.
if (min_sdk_stripped) {
- min_sdk_stripped =
- std::min(min_sdk_stripped.value(), sdk_level);
+ min_sdk_stripped = std::min(min_sdk_stripped.value(), sdk_level);
} else {
min_sdk_stripped = sdk_level;
}
@@ -126,10 +122,9 @@
min_sdk_stripped.value())) {
// Let's create a new Style for this versioned resource.
ConfigDescription new_config(config_value->config);
- new_config.sdkVersion = min_sdk_stripped.value();
+ new_config.sdkVersion = static_cast<uint16_t>(min_sdk_stripped.value());
- std::unique_ptr<Style> new_style(
- style->Clone(&table->string_pool));
+ std::unique_ptr<Style> new_style(style->Clone(&table->string_pool));
new_style->SetComment(style->GetComment());
new_style->SetSource(style->GetSource());
@@ -140,8 +135,7 @@
std::make_move_iterator(stripped.end()));
// Insert the new Resource into the correct place.
- entry->FindOrCreateValue(new_config, {})->value =
- std::move(new_style);
+ entry->FindOrCreateValue(new_config, {})->value = std::move(new_style);
}
}
}
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index d00fa73..5527f90 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -23,6 +23,7 @@
#include "android-base/macros.h"
#include "Resource.h"
+#include "SdkConstants.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
@@ -44,9 +45,12 @@
* Determines whether a versioned resource should be created. If a versioned
* resource already exists, it takes precedence.
*/
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
- const ConfigDescription& config,
- const int sdk_version_to_generate);
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+ const ApiVersion sdk_version_to_generate);
+
+// Finds the next largest ApiVersion of the config which is identical to the given config except
+// for sdkVersion.
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry, const ConfigDescription& config);
class AutoVersioner : public IResourceTableConsumer {
public:
@@ -105,11 +109,10 @@
class ProductFilter : public IResourceTableConsumer {
public:
- using ResourceConfigValueIter =
- std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
+ using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
- explicit ProductFilter(std::unordered_set<std::string> products)
- : products_(products) {}
+ explicit ProductFilter(std::unordered_set<std::string> products) : products_(products) {
+ }
ResourceConfigValueIter SelectProductToKeep(
const ResourceNameRef& name, const ResourceConfigValueIter begin,
@@ -118,19 +121,9 @@
bool Consume(IAaptContext* context, ResourceTable* table) override;
private:
- std::unordered_set<std::string> products_;
-
DISALLOW_COPY_AND_ASSIGN(ProductFilter);
-};
-class XmlAutoVersioner : public IXmlResourceConsumer {
- public:
- XmlAutoVersioner() = default;
-
- bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(XmlAutoVersioner);
+ std::unordered_set<std::string> products_;
};
/**
@@ -143,8 +136,7 @@
*/
class XmlNamespaceRemover : public IXmlResourceConsumer {
public:
- explicit XmlNamespaceRemover(bool keep_uris = false)
- : keep_uris_(keep_uris){};
+ explicit XmlNamespaceRemover(bool keep_uris = false) : keep_uris_(keep_uris){};
bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
@@ -165,17 +157,8 @@
bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
- /**
- * Once the XmlResource has been consumed, this returns the various SDK levels
- * in which
- * framework attributes used within the XML document were defined.
- */
- inline const std::set<int>& sdk_levels() const { return sdk_levels_found_; }
-
private:
DISALLOW_COPY_AND_ASSIGN(XmlReferenceLinker);
-
- std::set<int> sdk_levels_found_;
};
} // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index 833ae69..18498e3 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -274,7 +274,7 @@
if (out_error) *out_error = "is not an attribute";
return {};
}
- return xml::AaptAttribute{symbol->id, *symbol->attribute};
+ return xml::AaptAttribute(*symbol->attribute, symbol->id);
}
void ReferenceLinker::WriteResourceName(DiagMessage* out_msg,
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 9311091..cce750a 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -243,8 +243,7 @@
bool error = false;
for (auto& src_type : src_package->types) {
- ResourceTableType* dst_type =
- master_package_->FindOrCreateType(src_type->type);
+ ResourceTableType* dst_type = master_package_->FindOrCreateType(src_type->type);
if (!MergeType(context_, src, dst_type, src_type.get())) {
error = true;
continue;
@@ -253,27 +252,24 @@
for (auto& src_entry : src_type->entries) {
std::string entry_name = src_entry->name;
if (mangle_package) {
- entry_name =
- NameMangler::MangleEntry(src_package->name, src_entry->name);
+ entry_name = NameMangler::MangleEntry(src_package->name, src_entry->name);
}
ResourceEntry* dst_entry;
- if (allow_new_resources) {
+ if (allow_new_resources || src_entry->symbol_status.allow_new) {
dst_entry = dst_type->FindOrCreateEntry(entry_name);
} else {
dst_entry = dst_type->FindEntry(entry_name);
}
- const ResourceNameRef res_name(src_package->name, src_type->type,
- src_entry->name);
+ const ResourceNameRef res_name(src_package->name, src_type->type, src_entry->name);
if (!dst_entry) {
- context_->GetDiagnostics()->Error(
- DiagMessage(src) << "resource " << res_name
- << " does not override an existing resource");
- context_->GetDiagnostics()->Note(
- DiagMessage(src) << "define an <add-resource> tag or use "
- << "--auto-add-overlay");
+ context_->GetDiagnostics()->Error(DiagMessage(src)
+ << "resource " << res_name
+ << " does not override an existing resource");
+ context_->GetDiagnostics()->Note(DiagMessage(src) << "define an <add-resource> tag or use "
+ << "--auto-add-overlay");
error = true;
continue;
}
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index 742f5a7..147d857 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -248,18 +248,18 @@
TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
std::unique_ptr<ResourceTable> table_a =
- test::ResourceTableBuilder()
- .SetPackageId("", 0x7f)
- .SetSymbolState("bool/foo", {}, SymbolState::kUndefined)
- .Build();
+ test::ResourceTableBuilder().SetPackageId("", 0x7f).Build();
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("", 0x7f)
+ .SetSymbolState("bool/foo", {}, SymbolState::kUndefined, true /*allow new overlay*/)
.AddValue("bool/foo", ResourceUtils::TryParseBool("true"))
.Build();
ResourceTable final_table;
- TableMerger merger(context_.get(), &final_table, TableMergerOptions{});
+ TableMergerOptions options;
+ options.auto_add_overlay = false;
+ TableMerger merger(context_.get(), &final_table, options);
ASSERT_TRUE(merger.Merge({}, table_a.get()));
ASSERT_TRUE(merger.MergeOverlay({}, table_b.get()));
diff --git a/tools/aapt2/link/XmlCompatVersioner.cpp b/tools/aapt2/link/XmlCompatVersioner.cpp
new file mode 100644
index 0000000..f1f4e3b
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include <algorithm>
+
+#include "util/Util.h"
+
+namespace aapt {
+
+static xml::Attribute CopyAttr(const xml::Attribute& src, StringPool* out_string_pool) {
+ xml::Attribute dst{src.namespace_uri, src.name, src.value, src.compiled_attribute};
+ if (src.compiled_value != nullptr) {
+ dst.compiled_value.reset(src.compiled_value->Clone(out_string_pool));
+ }
+ return dst;
+}
+
+// Returns false if the attribute is not copied because an existing attribute takes precedence
+// (came from a rule).
+static bool CopyAttribute(const xml::Attribute& src_attr, bool generated, xml::Element* dst_el,
+ StringPool* out_string_pool) {
+ xml::Attribute* dst_attr = dst_el->FindAttribute(src_attr.namespace_uri, src_attr.name);
+ if (dst_attr != nullptr) {
+ if (generated) {
+ // Generated attributes always take precedence.
+ dst_attr->value = src_attr.value;
+ dst_attr->compiled_attribute = src_attr.compiled_attribute;
+ if (src_attr.compiled_value != nullptr) {
+ dst_attr->compiled_value.reset(src_attr.compiled_value->Clone(out_string_pool));
+ }
+ return true;
+ }
+ return false;
+ }
+ dst_el->attributes.push_back(CopyAttr(src_attr, out_string_pool));
+ return true;
+}
+
+void XmlCompatVersioner::ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+ const ApiVersion& src_attr_version, const IDegradeRule* rule,
+ const util::Range<ApiVersion>& api_range, bool generated,
+ xml::Element* dst_el,
+ std::set<ApiVersion>* out_apis_referenced,
+ StringPool* out_string_pool) {
+ if (src_attr_version <= api_range.start) {
+ // The API is compatible, so don't check the rule and just copy.
+ if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+ // TODO(adamlesinski): Log a warning that an attribute was overridden?
+ }
+ return;
+ }
+
+ if (api_range.start >= SDK_LOLLIPOP_MR1) {
+ // Since LOLLIPOP MR1, the framework can handle silently ignoring unknown public attributes,
+ // so we don't need to erase/version them.
+ // Copy.
+ if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+ // TODO(adamlesinski): Log a warning that an attribute was overridden?
+ }
+ } else {
+ // We are going to erase this attribute from this XML resource version, but check if
+ // we even need to move it anywhere. A developer may have effectively overwritten it with
+ // a similarly versioned XML resource.
+ if (src_attr_version < api_range.end) {
+ // There is room for another versioned XML resource between this XML resource and the next
+ // versioned XML resource defined by the developer.
+ out_apis_referenced->insert(std::min<ApiVersion>(src_attr_version, SDK_LOLLIPOP_MR1));
+ }
+ }
+
+ if (rule != nullptr) {
+ for (const DegradeResult& result : rule->Degrade(src_el, src_attr, out_string_pool)) {
+ const ResourceId attr_resid = result.attr.compiled_attribute.value().id.value();
+ const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+ auto iter = rules_->find(attr_resid);
+ ProcessRule(src_el, result.attr, attr_version,
+ iter != rules_->end() ? iter->second.get() : nullptr, api_range,
+ true /*generated*/, dst_el, out_apis_referenced, out_string_pool);
+ }
+ }
+}
+
+XmlCompatVersioner::XmlCompatVersioner(const Rules* rules) : rules_(rules) {
+}
+
+std::unique_ptr<xml::XmlResource> XmlCompatVersioner::ProcessDoc(
+ ApiVersion target_api, ApiVersion max_api, xml::XmlResource* doc,
+ std::set<ApiVersion>* out_apis_referenced) {
+ const util::Range<ApiVersion> api_range{target_api, max_api};
+
+ std::unique_ptr<xml::XmlResource> cloned_doc = util::make_unique<xml::XmlResource>(doc->file);
+ cloned_doc->file.config.sdkVersion = static_cast<uint16_t>(target_api);
+
+ cloned_doc->root = doc->root->Clone([&](const xml::Element& el, xml::Element* out_el) {
+ for (const auto& attr : el.attributes) {
+ if (!attr.compiled_attribute) {
+ // Just copy if this isn't a compiled attribute.
+ out_el->attributes.push_back(CopyAttr(attr, &cloned_doc->string_pool));
+ continue;
+ }
+
+ const ResourceId attr_resid = attr.compiled_attribute.value().id.value();
+ const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+ auto rule = rules_->find(attr_resid);
+ ProcessRule(el, attr, attr_version, rule != rules_->end() ? rule->second.get() : nullptr,
+ api_range, false /*generated*/, out_el, out_apis_referenced,
+ &cloned_doc->string_pool);
+ }
+ });
+ return cloned_doc;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> XmlCompatVersioner::Process(
+ IAaptContext* context, xml::XmlResource* doc, util::Range<ApiVersion> api_range) {
+ // Adjust the API range so that it falls after this document and after minSdkVersion.
+ api_range.start = std::max(api_range.start, context->GetMinSdkVersion());
+ api_range.start = std::max(api_range.start, static_cast<ApiVersion>(doc->file.config.sdkVersion));
+
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs;
+ std::set<ApiVersion> apis_referenced;
+ versioned_docs.push_back(ProcessDoc(api_range.start, api_range.end, doc, &apis_referenced));
+
+ // Adjust the sdkVersion of the first XML document back to its original (this only really
+ // makes a difference if the sdk version was below the minSdk to start).
+ versioned_docs.back()->file.config.sdkVersion = doc->file.config.sdkVersion;
+
+ // Iterate from smallest to largest API version.
+ for (ApiVersion api : apis_referenced) {
+ std::set<ApiVersion> dummy;
+ versioned_docs.push_back(ProcessDoc(api, api_range.end, doc, &dummy));
+ }
+ return versioned_docs;
+}
+
+DegradeToManyRule::DegradeToManyRule(std::vector<ReplacementAttr> attrs)
+ : attrs_(std::move(attrs)) {
+}
+
+static inline std::unique_ptr<Item> CloneIfNotNull(const std::unique_ptr<Item>& src,
+ StringPool* out_string_pool) {
+ if (src == nullptr) {
+ return {};
+ }
+ return std::unique_ptr<Item>(src->Clone(out_string_pool));
+}
+
+std::vector<DegradeResult> DegradeToManyRule::Degrade(const xml::Element& src_el,
+ const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const {
+ std::vector<DegradeResult> result;
+ result.reserve(attrs_.size());
+ for (const ReplacementAttr& attr : attrs_) {
+ result.push_back(
+ DegradeResult{xml::Attribute{xml::kSchemaAndroid, attr.name, src_attr.value,
+ xml::AaptAttribute{attr.attr, attr.id},
+ CloneIfNotNull(src_attr.compiled_value, out_string_pool)},
+ FindAttributeSdkLevel(attr.id)});
+ }
+ return result;
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/XmlCompatVersioner.h b/tools/aapt2/link/XmlCompatVersioner.h
new file mode 100644
index 0000000..099e23c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT_LINKER_XMLCOMPATVERSIONER_H
+#define AAPT_LINKER_XMLCOMPATVERSIONER_H
+
+#include <set>
+#include <unordered_map>
+#include <vector>
+
+#include "android-base/macros.h"
+
+#include "Resource.h"
+#include "SdkConstants.h"
+#include "process/IResourceTableConsumer.h"
+#include "util/Util.h"
+#include "xml/XmlDom.h"
+
+namespace aapt {
+
+class IDegradeRule;
+
+struct DegradeResult {
+ xml::Attribute attr;
+ ApiVersion attr_api_version;
+};
+
+class IDegradeRule {
+ public:
+ IDegradeRule() = default;
+ virtual ~IDegradeRule() = default;
+
+ virtual std::vector<DegradeResult> Degrade(const xml::Element& src_el,
+ const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(IDegradeRule);
+};
+
+class XmlCompatVersioner {
+ public:
+ using Rules = std::unordered_map<ResourceId, std::unique_ptr<IDegradeRule>>;
+
+ XmlCompatVersioner(const Rules* rules);
+
+ std::vector<std::unique_ptr<xml::XmlResource>> Process(IAaptContext* context,
+ xml::XmlResource* doc,
+ util::Range<ApiVersion> api_range);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(XmlCompatVersioner);
+
+ std::unique_ptr<xml::XmlResource> ProcessDoc(ApiVersion target_api, ApiVersion max_api,
+ xml::XmlResource* doc,
+ std::set<ApiVersion>* out_apis_referenced);
+ void ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+ const ApiVersion& src_attr_version, const IDegradeRule* rule,
+ const util::Range<ApiVersion>& api_range, bool generated, xml::Element* dst_el,
+ std::set<ApiVersion>* out_apis_referenced, StringPool* out_string_pool);
+
+ const Rules* rules_;
+};
+
+struct ReplacementAttr {
+ std::string name;
+ ResourceId id;
+ Attribute attr;
+};
+
+class DegradeToManyRule : public IDegradeRule {
+ public:
+ DegradeToManyRule(std::vector<ReplacementAttr> attrs);
+ virtual ~DegradeToManyRule() = default;
+
+ std::vector<DegradeResult> Degrade(const xml::Element& src_el, const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DegradeToManyRule);
+
+ std::vector<ReplacementAttr> attrs_;
+};
+
+} // namespace aapt
+
+#endif // AAPT_LINKER_XMLCOMPATVERSIONER_H
diff --git a/tools/aapt2/link/XmlCompatVersioner_test.cpp b/tools/aapt2/link/XmlCompatVersioner_test.cpp
new file mode 100644
index 0000000..ce6605c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner_test.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include "Linkers.h"
+#include "test/Test.h"
+
+namespace aapt {
+
+constexpr auto TYPE_DIMENSION = android::ResTable_map::TYPE_DIMENSION;
+constexpr auto TYPE_STRING = android::ResTable_map::TYPE_STRING;
+
+struct R {
+ struct attr {
+ enum : uint32_t {
+ paddingLeft = 0x010100d6u, // (API 1)
+ paddingRight = 0x010100d8u, // (API 1)
+ progressBarPadding = 0x01010319u, // (API 11)
+ paddingStart = 0x010103b3u, // (API 17)
+ paddingHorizontal = 0x0101053du, // (API 26)
+ };
+ };
+};
+
+class XmlCompatVersionerTest : public ::testing::Test {
+ public:
+ void SetUp() override {
+ context_ =
+ test::ContextBuilder()
+ .SetCompilationPackage("com.app")
+ .SetPackageId(0x7f)
+ .SetPackageType(PackageType::kApp)
+ .SetMinSdkVersion(SDK_GINGERBREAD)
+ .AddSymbolSource(
+ test::StaticSymbolSourceBuilder()
+ .AddPublicSymbol("android:attr/paddingLeft", R::attr::paddingLeft,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingRight", R::attr::paddingRight,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/progressBarPadding", R::attr::progressBarPadding,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingStart", R::attr::paddingStart,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingHorizontal", R::attr::paddingHorizontal,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddSymbol("com.app:attr/foo", ResourceId(0x7f010000),
+ util::make_unique<Attribute>(false, TYPE_STRING))
+ .Build())
+ .Build();
+ }
+
+ protected:
+ std::unique_ptr<IAaptContext> context_;
+};
+
+TEST_F(XmlCompatVersionerTest, NoRulesOnlyStripsAndCopies) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:paddingHorizontal="24dp"
+ app:foo="16dp"
+ foo="bar"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ // Source XML file's sdkVersion == 0, so the first one must also have the same sdkVersion.
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(3u, el->attributes.size());
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+}
+
+TEST_F(XmlCompatVersionerTest, SingleRule) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:paddingHorizontal="24dp"
+ app:foo="16dp"
+ foo="bar"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(4u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(5u, el->attributes.size());
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, ChainedRule) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp" />)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::progressBarPadding] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>({ReplacementAttr{
+ "progressBarPadding", R::attr::progressBarPadding, Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(3u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_HONEYCOMB), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(1u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[2]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[2].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, DegradeRuleOverridesExistingAttribute) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ Item* padding_horizontal_value = xml::FindRootElement(doc.get())
+ ->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal")
+ ->compiled_value.get();
+ ASSERT_NE(nullptr, padding_horizontal_value);
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(3u, el->attributes.size());
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 94bdccd..721fc26 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -72,13 +72,13 @@
using xml::PackageAwareVisitor::Visit;
XmlVisitor(const Source& source, const CallSite& callsite, IAaptContext* context,
- SymbolTable* symbols, std::set<int>* sdk_levels_found)
+ SymbolTable* symbols)
: source_(source),
callsite_(callsite),
context_(context),
symbols_(symbols),
- sdk_levels_found_(sdk_levels_found),
- reference_visitor_(callsite, context, symbols, this) {}
+ reference_visitor_(callsite, context, symbols, this) {
+ }
void Visit(xml::Element* el) override {
// The default Attribute allows everything except enums or flags.
@@ -118,22 +118,12 @@
continue;
}
- // Find this compiled attribute's SDK level.
- const xml::AaptAttribute& aapt_attr = attr.compiled_attribute.value();
- if (aapt_attr.id) {
- // Record all SDK levels from which the attributes were defined.
- const size_t sdk_level = FindAttributeSdkLevel(aapt_attr.id.value());
- if (sdk_level > 1) {
- sdk_levels_found_->insert(sdk_level);
- }
- }
- attribute = &aapt_attr.attribute;
+ attribute = &attr.compiled_attribute.value().attribute;
}
attr.compiled_value = ResourceUtils::TryParseItemForAttribute(attr.value, attribute);
if (attr.compiled_value) {
- // With a compiledValue, we must resolve the reference and assign it an
- // ID.
+ // With a compiledValue, we must resolve the reference and assign it an ID.
attr.compiled_value->SetSource(source);
attr.compiled_value->Accept(&reference_visitor_);
} else if ((attribute->type_mask & android::ResTable_map::TYPE_STRING) == 0) {
@@ -164,7 +154,6 @@
IAaptContext* context_;
SymbolTable* symbols_;
- std::set<int>* sdk_levels_found_;
ReferenceVisitor reference_visitor_;
bool error_ = false;
};
@@ -172,10 +161,8 @@
} // namespace
bool XmlReferenceLinker::Consume(IAaptContext* context, xml::XmlResource* resource) {
- sdk_levels_found_.clear();
const CallSite callsite = {resource->file.name};
- XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols(),
- &sdk_levels_found_);
+ XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols());
if (resource->root) {
resource->root->Accept(&visitor);
return !visitor.HasError();
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index 66ecc15..de81e73 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -160,16 +160,6 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
}
-TEST_F(XmlReferenceLinkerTest, SdkLevelsAreRecorded) {
- std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
- <View xmlns:android="http://schemas.android.com/apk/res/android"
- android:colorAccent="#ffffff" />)EOF");
-
- XmlReferenceLinker linker;
- ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
- EXPECT_TRUE(linker.sdk_levels().count(21) == 1);
-}
-
TEST_F(XmlReferenceLinkerTest, LinkMangledAttributes) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
<View xmlns:support="http://schemas.android.com/apk/res/com.android.support"
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 1a648bf..882a85b 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -237,14 +237,12 @@
}
// We found a resource.
- std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
- s->id = id;
+ std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>(id);
// Check to see if it is an attribute.
for (size_t i = 0; i < (size_t)count; i++) {
if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
- s->attribute = std::make_shared<Attribute>(false);
- s->attribute->type_mask = entry[i].map.value.data;
+ s->attribute = std::make_shared<Attribute>(false, entry[i].map.value.data);
break;
}
}
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index bd252d2..4a2181e 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -53,16 +53,12 @@
class SymbolTable {
public:
struct Symbol {
- Symbol() : Symbol(Maybe<ResourceId>{}) {}
+ Symbol() = default;
- explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {}
-
- Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr)
- : Symbol(i, attr, false) {}
-
- Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr,
- bool pub)
- : id(i), attribute(attr), is_public(pub) {}
+ explicit Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr = {},
+ bool pub = false)
+ : id(i), attribute(attr), is_public(pub) {
+ }
Symbol(const Symbol&) = default;
Symbol(Symbol&&) = default;
diff --git a/tools/aapt2/proto/TableProtoDeserializer.cpp b/tools/aapt2/proto/TableProtoDeserializer.cpp
index d93d495..1d0041b 100644
--- a/tools/aapt2/proto/TableProtoDeserializer.cpp
+++ b/tools/aapt2/proto/TableProtoDeserializer.cpp
@@ -32,8 +32,7 @@
public:
using ValueVisitor::Visit;
- explicit ReferenceIdToNameVisitor(
- const std::map<ResourceId, ResourceNameRef>* mapping)
+ explicit ReferenceIdToNameVisitor(const std::map<ResourceId, ResourceNameRef>* mapping)
: mapping_(mapping) {
CHECK(mapping_ != nullptr);
}
@@ -75,13 +74,11 @@
std::map<ResourceId, ResourceNameRef> idIndex;
- ResourceTablePackage* pkg =
- table->CreatePackage(pbPackage.package_name(), id);
+ ResourceTablePackage* pkg = table->CreatePackage(pbPackage.package_name(), id);
for (const pb::Type& pbType : pbPackage.types()) {
const ResourceType* resType = ParseResourceType(pbType.name());
if (!resType) {
- diag_->Error(DiagMessage(source_) << "unknown type '" << pbType.name()
- << "'");
+ diag_->Error(DiagMessage(source_) << "unknown type '" << pbType.name() << "'");
return {};
}
@@ -95,21 +92,20 @@
if (pbEntry.has_symbol_status()) {
const pb::SymbolStatus& pbStatus = pbEntry.symbol_status();
if (pbStatus.has_source()) {
- DeserializeSourceFromPb(pbStatus.source(), *source_pool_,
- &entry->symbol_status.source);
+ DeserializeSourceFromPb(pbStatus.source(), *source_pool_, &entry->symbol_status.source);
}
if (pbStatus.has_comment()) {
entry->symbol_status.comment = pbStatus.comment();
}
- SymbolState visibility =
- DeserializeVisibilityFromPb(pbStatus.visibility());
+ entry->symbol_status.allow_new = pbStatus.allow_new();
+
+ SymbolState visibility = DeserializeVisibilityFromPb(pbStatus.visibility());
entry->symbol_status.state = visibility;
if (visibility == SymbolState::kPublic) {
- // This is a public symbol, we must encode the ID now if there is
- // one.
+ // This is a public symbol, we must encode the ID now if there is one.
if (pbEntry.has_id()) {
entry->id = static_cast<uint16_t>(pbEntry.id());
}
@@ -142,16 +138,15 @@
return {};
}
- ResourceConfigValue* configValue =
- entry->FindOrCreateValue(config, pbConfig.product());
+ ResourceConfigValue* configValue = entry->FindOrCreateValue(config, pbConfig.product());
if (configValue->value) {
// Duplicate config.
diag_->Error(DiagMessage(source_) << "duplicate configuration");
return {};
}
- configValue->value = DeserializeValueFromPb(
- pbConfigValue.value(), config, &table->string_pool);
+ configValue->value =
+ DeserializeValueFromPb(pbConfigValue.value(), config, &table->string_pool);
if (!configValue->value) {
return {};
}
diff --git a/tools/aapt2/proto/TableProtoSerializer.cpp b/tools/aapt2/proto/TableProtoSerializer.cpp
index 7230b55..de10bb8 100644
--- a/tools/aapt2/proto/TableProtoSerializer.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer.cpp
@@ -250,19 +250,16 @@
// Write the SymbolStatus struct.
pb::SymbolStatus* pb_status = pb_entry->mutable_symbol_status();
- pb_status->set_visibility(
- SerializeVisibilityToPb(entry->symbol_status.state));
- SerializeSourceToPb(entry->symbol_status.source, &source_pool,
- pb_status->mutable_source());
+ pb_status->set_visibility(SerializeVisibilityToPb(entry->symbol_status.state));
+ SerializeSourceToPb(entry->symbol_status.source, &source_pool, pb_status->mutable_source());
pb_status->set_comment(entry->symbol_status.comment);
+ pb_status->set_allow_new(entry->symbol_status.allow_new);
for (auto& config_value : entry->values) {
pb::ConfigValue* pb_config_value = pb_entry->add_config_values();
- SerializeConfig(config_value->config,
- pb_config_value->mutable_config());
+ SerializeConfig(config_value->config, pb_config_value->mutable_config());
if (!config_value->product.empty()) {
- pb_config_value->mutable_config()->set_product(
- config_value->product);
+ pb_config_value->mutable_config()->set_product(config_value->product);
}
pb::Value* pb_value = pb_config_value->mutable_value();
diff --git a/tools/aapt2/proto/TableProtoSerializer_test.cpp b/tools/aapt2/proto/TableProtoSerializer_test.cpp
index fdd5197..e6ce6d3 100644
--- a/tools/aapt2/proto/TableProtoSerializer_test.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer_test.cpp
@@ -28,12 +28,11 @@
std::unique_ptr<ResourceTable> table =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .AddFileReference("com.app.a:layout/main", ResourceId(0x7f020000),
- "res/layout/main.xml")
- .AddReference("com.app.a:layout/other", ResourceId(0x7f020001),
- "com.app.a:layout/main")
+ .AddFileReference("com.app.a:layout/main", ResourceId(0x7f020000), "res/layout/main.xml")
+ .AddReference("com.app.a:layout/other", ResourceId(0x7f020001), "com.app.a:layout/main")
.AddString("com.app.a:string/text", {}, "hi")
.AddValue("com.app.a:id/foo", {}, util::make_unique<Id>())
+ .SetSymbolState("com.app.a:bool/foo", {}, SymbolState::kUndefined, true /*allow_new*/)
.Build();
Symbol public_symbol;
@@ -94,21 +93,23 @@
EXPECT_EQ(SymbolState::kPublic, result.value().type->symbol_status.state);
EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbol_status.state);
+ result = new_table->FindResource(test::ParseNameOrDie("com.app.a:bool/foo"));
+ ASSERT_TRUE(result);
+ EXPECT_EQ(SymbolState::kUndefined, result.value().entry->symbol_status.state);
+ EXPECT_TRUE(result.value().entry->symbol_status.allow_new);
+
// Find the product-dependent values
BinaryPrimitive* prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
- new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"),
- "");
+ new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(123u, prim->value.data);
prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
- new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"),
- "tablet");
+ new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "tablet");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(321u, prim->value.data);
- Reference* actual_ref =
- test::GetValue<Reference>(new_table.get(), "com.app.a:layout/abc");
+ Reference* actual_ref = test::GetValue<Reference>(new_table.get(), "com.app.a:layout/abc");
ASSERT_NE(nullptr, actual_ref);
AAPT_ASSERT_TRUE(actual_ref->name);
AAPT_ASSERT_TRUE(actual_ref->id);
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index e92565f..0290e30 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,5 +1,16 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
+## Version 2.17
+### `aapt2 compile ...`
+- Fixed an issue where symlinks would not be followed when compiling PNGs. (bug 62144459)
+- Fixed issue where overlays that declared `<add-resource>` did not compile. (bug 38355988)
+
+## Version 2.16
+### `aapt2 link ...`
+- Versioning of XML files is more intelligent, using a small set of rules to degrade
+ specific newer attributes to backwards compatible versions of them.
+ Ex: `android:paddingHorizontal` degrades to `android:paddingLeft` and `android:paddingRight`.
+
## Version 2.15
### `aapt2 compile ...`
- Add `--no-crunch` option to avoid processing PNGs during the compile phase. Note that this
diff --git a/tools/aapt2/test/Builders.h b/tools/aapt2/test/Builders.h
index 6888cf3..02acedb 100644
--- a/tools/aapt2/test/Builders.h
+++ b/tools/aapt2/test/Builders.h
@@ -117,12 +117,12 @@
}
ResourceTableBuilder& SetSymbolState(const android::StringPiece& name, const ResourceId& id,
- SymbolState state) {
+ SymbolState state, bool allow_new = false) {
ResourceName res_name = ParseNameOrDie(name);
Symbol symbol;
symbol.state = state;
- CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol,
- &diagnostics_));
+ symbol.allow_new = allow_new;
+ CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol, &diagnostics_));
return *this;
}
diff --git a/tools/aapt2/util/Files.cpp b/tools/aapt2/util/Files.cpp
index d10351b..1bf2594 100644
--- a/tools/aapt2/util/Files.cpp
+++ b/tools/aapt2/util/Files.cpp
@@ -181,12 +181,13 @@
return std::move(filemap);
}
-bool AppendArgsFromFile(const StringPiece& path,
- std::vector<std::string>* out_arglist,
+bool AppendArgsFromFile(const StringPiece& path, std::vector<std::string>* out_arglist,
std::string* out_error) {
std::string contents;
- if (!android::base::ReadFileToString(path.to_string(), &contents)) {
- if (out_error) *out_error = "failed to read argument-list file";
+ if (!android::base::ReadFileToString(path.to_string(), &contents, true /*follow_symlinks*/)) {
+ if (out_error) {
+ *out_error = "failed to read argument-list file";
+ }
return false;
}
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 30b9af6..386f74b 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -44,6 +44,12 @@
namespace aapt {
namespace util {
+template <typename T>
+struct Range {
+ T start;
+ T end;
+};
+
std::vector<std::string> Split(const android::StringPiece& str, char sep);
std::vector<std::string> SplitAndLowercase(const android::StringPiece& str, char sep);
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 98f5f1d..885ab3e 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -356,17 +356,16 @@
return util::make_unique<XmlResource>(ResourceFile{}, std::move(string_pool), std::move(root));
}
-std::unique_ptr<Node> Namespace::Clone() {
+std::unique_ptr<Node> Namespace::Clone(const ElementCloneFunc& el_cloner) {
auto ns = util::make_unique<Namespace>();
ns->comment = comment;
ns->line_number = line_number;
ns->column_number = column_number;
ns->namespace_prefix = namespace_prefix;
ns->namespace_uri = namespace_uri;
-
ns->children.reserve(children.size());
for (const std::unique_ptr<xml::Node>& child : children) {
- ns->AppendChild(child->Clone());
+ ns->AppendChild(child->Clone(el_cloner));
}
return std::move(ns);
}
@@ -412,6 +411,15 @@
return nullptr;
}
+const Attribute* Element::FindAttribute(const StringPiece& ns, const StringPiece& name) const {
+ for (const auto& attr : attributes) {
+ if (ns == attr.namespace_uri && name == attr.name) {
+ return &attr;
+ }
+ }
+ return nullptr;
+}
+
Element* Element::FindChild(const StringPiece& ns, const StringPiece& name) {
return FindChildWithAttribute(ns, name, {}, {}, {});
}
@@ -464,29 +472,23 @@
return elements;
}
-std::unique_ptr<Node> Element::Clone() {
+std::unique_ptr<Node> Element::Clone(const ElementCloneFunc& el_cloner) {
auto el = util::make_unique<Element>();
el->comment = comment;
el->line_number = line_number;
el->column_number = column_number;
el->name = name;
el->namespace_uri = namespace_uri;
-
el->attributes.reserve(attributes.size());
- for (xml::Attribute& attr : attributes) {
- // Don't copy compiled values or attributes.
- el->attributes.push_back(
- xml::Attribute{attr.namespace_uri, attr.name, attr.value});
- }
-
+ el_cloner(*this, el.get());
el->children.reserve(children.size());
for (const std::unique_ptr<xml::Node>& child : children) {
- el->AppendChild(child->Clone());
+ el->AppendChild(child->Clone(el_cloner));
}
return std::move(el);
}
-std::unique_ptr<Node> Text::Clone() {
+std::unique_ptr<Node> Text::Clone(const ElementCloneFunc&) {
auto t = util::make_unique<Text>();
t->comment = comment;
t->line_number = line_number;
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index 6950c30..2dc99d6 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -35,6 +35,8 @@
class RawVisitor;
+class Element;
+
/**
* Base class for all XML nodes.
*/
@@ -51,7 +53,11 @@
void AppendChild(std::unique_ptr<Node> child);
void InsertChild(size_t index, std::unique_ptr<Node> child);
virtual void Accept(RawVisitor* visitor) = 0;
- virtual std::unique_ptr<Node> Clone() = 0;
+
+ using ElementCloneFunc = std::function<void(const Element&, Element*)>;
+
+ // Clones the Node subtree, using the given function to decide how to clone an Element.
+ virtual std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) = 0;
};
/**
@@ -72,12 +78,16 @@
std::string namespace_prefix;
std::string namespace_uri;
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
struct AaptAttribute {
- Maybe<ResourceId> id;
+ explicit AaptAttribute(const ::aapt::Attribute& attr, const Maybe<ResourceId>& resid = {})
+ : attribute(attr), id(resid) {
+ }
+
aapt::Attribute attribute;
+ Maybe<ResourceId> id;
};
/**
@@ -102,6 +112,8 @@
std::vector<Attribute> attributes;
Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name);
+ const Attribute* FindAttribute(const android::StringPiece& ns,
+ const android::StringPiece& name) const;
xml::Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name);
xml::Element* FindChildWithAttribute(const android::StringPiece& ns,
const android::StringPiece& name,
@@ -109,7 +121,7 @@
const android::StringPiece& attr_name,
const android::StringPiece& attr_value);
std::vector<xml::Element*> GetChildElements();
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
/**
@@ -119,7 +131,7 @@
public:
std::string text;
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
/**
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 25d61af..0e0a524 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -160,6 +160,8 @@
*
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
+ *
+ * @hide
*/
public static final String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
/**
@@ -167,6 +169,8 @@
* String representation.
*
* Retrieve with {@link android.content.Intent#getLongExtra(String, long)}.
+ *
+ * @hide
*/
public static final String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
/**
@@ -174,12 +178,16 @@
*
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)} and cast into
* {@link android.graphics.drawable.Icon}.
+ *
+ * @hide
*/
public static final String EXTRA_ICON = "android.net.wifi.extra.ICON";
/**
* Name of a file.
*
* Retrieve with {@link android.content.Intent#getStringExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
@@ -195,6 +203,7 @@
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
*
+ * @hide
*/
public static final String ACTION_PASSPOINT_OSU_PROVIDERS_LIST =
"android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
@@ -202,6 +211,8 @@
* Raw binary data of an ANQP (Access Network Query Protocol) element.
*
* Retrieve with {@link android.content.Intent#getByteArrayExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_ANQP_ELEMENT_DATA =
"android.net.wifi.extra.ANQP_ELEMENT_DATA";
@@ -220,6 +231,7 @@
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
*
+ * @hide
*/
public static final String ACTION_PASSPOINT_DEAUTH_IMMINENT =
"android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
@@ -228,18 +240,24 @@
* {@code true} for ESS.
*
* Retrieve with {@link android.content.Intent#getBooleanExtra(String, boolean)}.
+ *
+ * @hide
*/
public static final String EXTRA_ESS = "android.net.wifi.extra.ESS";
/**
* Delay in seconds.
*
* Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
+ *
+ * @hide
*/
public static final String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
/**
* String representation of an URL.
*
* Retrieve with {@link android.content.Intent#getStringExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_URL = "android.net.wifi.extra.URL";
@@ -254,8 +272,10 @@
*
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
*
- ** <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
+ *
+ * @hide
*/
public static final String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION =
"android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
@@ -265,6 +285,8 @@
* 1 - SOAP XML SPP
*
* Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
+ *
+ * @hide
*/
public static final String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD =
"android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
@@ -383,6 +405,21 @@
@SystemApi
public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
/**
+ * The interface used for the softap.
+ *
+ * @hide
+ */
+ public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "wifi_ap_interface_name";
+ /**
+ * The intended ip mode for this softap.
+ * @see #IFACE_IP_MODE_TETHERED
+ * @see #IFACE_IP_MODE_LOCAL_ONLY
+ *
+ * @hide
+ */
+ public static final String EXTRA_WIFI_AP_MODE = "wifi_ap_mode";
+
+ /**
* Wi-Fi AP is currently being disabled. The state will change to
* {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
*
@@ -1107,6 +1144,8 @@
*
* @param bssid The BSSID of the AP
* @param fileName Name of the icon file (remote file) to query from the AP
+ *
+ * @hide
*/
public void queryPasspointIcon(long bssid, String fileName) {
try {