Merge "Add ADPF owners to performance hint files" into main
diff --git a/core/api/current.txt b/core/api/current.txt
index abf3a2f0..379db7c 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -31970,7 +31970,7 @@
method public boolean isInteractive();
method public boolean isLowPowerStandbyEnabled();
method public boolean isPowerSaveMode();
- method public boolean isRebootingUserspaceSupported();
+ method @Deprecated public boolean isRebootingUserspaceSupported();
method @Deprecated public boolean isScreenOn();
method public boolean isSustainedPerformanceModeSupported();
method public boolean isWakeLockLevelSupported(int);
@@ -41314,6 +41314,8 @@
field public static final String KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY = "5g_nr_ssrsrq_thresholds_int_array";
field public static final String KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY = "5g_nr_sssinr_thresholds_int_array";
field public static final String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
+ field public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL = "additional_settings_caller_id_visibility_bool";
+ field public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL = "additional_settings_call_waiting_visibility_bool";
field public static final String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
field public static final String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
@@ -42930,9 +42932,9 @@
field public static final int BAND_UNKNOWN = 0; // 0x0
field public static final int CELL_BANDWIDTH_UNKNOWN = 0; // 0x0
field public static final int CHANNEL_NUMBER_UNKNOWN = 2147483647; // 0x7fffffff
- field public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
- field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
- field public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
+ field @Deprecated public static final int CONNECTION_PRIMARY_SERVING = 1; // 0x1
+ field @Deprecated public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
+ field @Deprecated public static final int CONNECTION_UNKNOWN = -1; // 0xffffffff
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhysicalChannelConfig> CREATOR;
field public static final int FREQUENCY_UNKNOWN = -1; // 0xffffffff
field public static final int PHYSICAL_CELL_ID_MAXIMUM_VALUE = 1007; // 0x3ef
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 13a4899..5d59969 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -13,6 +13,7 @@
@UiContext public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
method public final boolean addDumpable(@NonNull android.util.Dumpable);
+ method public final boolean isResumed();
}
public class ActivityManager {
@@ -90,6 +91,7 @@
public abstract class Context {
method @NonNull public android.os.UserHandle getUser();
field public static final String PAC_PROXY_SERVICE = "pac_proxy";
+ field public static final String REMOTE_AUTH_SERVICE = "remote_auth";
field public static final String TEST_NETWORK_SERVICE = "test_network";
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 821944f..c893b54 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -9627,7 +9627,7 @@
method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.USER_ACTIVITY}) public void userActivity(long, int, int);
field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1
field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0
- field public static final String REBOOT_USERSPACE = "userspace";
+ field @Deprecated public static final String REBOOT_USERSPACE = "userspace";
field public static final int SOUND_TRIGGER_MODE_ALL_DISABLED = 2; // 0x2
field public static final int SOUND_TRIGGER_MODE_ALL_ENABLED = 0; // 0x0
field public static final int SOUND_TRIGGER_MODE_CRITICAL_ONLY = 1; // 0x1
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index f5fa139..a24007e 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1996,7 +1996,7 @@
* indicator that the activity became active and ready to receive input. This sometimes could
* also be a transit state toward another resting state. For instance, an activity may be
* relaunched to {@link #onPause} due to configuration changes and the activity was visible,
- * but wasn’t the top-most activity of an activity task. {@link #onResume} is guaranteed to be
+ * but wasn't the top-most activity of an activity task. {@link #onResume} is guaranteed to be
* called before {@link #onPause} in this case which honors the activity lifecycle policy and
* the activity eventually rests in {@link #onPause}.
*
@@ -8637,6 +8637,7 @@
* @hide
*/
@UnsupportedAppUsage
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final boolean isResumed() {
return mResumed;
}
diff --git a/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS b/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
index 38fee89..9aab167 100644
--- a/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
+++ b/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
@@ -1,5 +1,3 @@
+file:EnterprisePlatform_OWNERS
rubinxu@google.com
-pgrafov@google.com
-ayushsha@google.com
-acjohnston@google.com #{LAST_RESORT_SUGGESTION}
-alexkershaw@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
+pgrafov@google.com
\ No newline at end of file
diff --git a/core/java/android/app/admin/EnterprisePlatformTest_OWNERS b/core/java/android/app/admin/EnterprisePlatformTest_OWNERS
new file mode 100644
index 0000000..eb23a03
--- /dev/null
+++ b/core/java/android/app/admin/EnterprisePlatformTest_OWNERS
@@ -0,0 +1,5 @@
+# Bug template url: https://b.corp.google.com/issues/new?component=1337891&template=1814288
+# Assign bugs to aep-automated-tests@google.com
+
+file:EnterprisePlatform_OWNERS
+scottjonathan@google.com
\ No newline at end of file
diff --git a/core/java/android/app/admin/EnterprisePlatform_OWNERS b/core/java/android/app/admin/EnterprisePlatform_OWNERS
index 6ce25cc..4d1ed590 100644
--- a/core/java/android/app/admin/EnterprisePlatform_OWNERS
+++ b/core/java/android/app/admin/EnterprisePlatform_OWNERS
@@ -1,5 +1,2 @@
-# Assign bugs to android-enterprise-triage@google.com
-file:WorkDeviceExperience_OWNERS
-file:Provisioning_OWNERS
-file:WorkProfile_OWNERS
-file:EnterprisePlatformSecurity_OWNERS
\ No newline at end of file
+sandness@google.com #{LAST_RESORT_SUGGESTION}
+scottjonathan@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
diff --git a/core/java/android/app/admin/OWNERS b/core/java/android/app/admin/OWNERS
index 10a5f14..308f1d6 100644
--- a/core/java/android/app/admin/OWNERS
+++ b/core/java/android/app/admin/OWNERS
@@ -1,5 +1,7 @@
# Bug component: 142675
+# Assign bugs to device-policy-manager-triage@google.com
-file:EnterprisePlatform_OWNERS
+file:WorkDeviceExperience_OWNERS
+file:EnterprisePlatformSecurity_OWNERS
yamasani@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
diff --git a/core/java/android/app/admin/Provisioning_OWNERS b/core/java/android/app/admin/Provisioning_OWNERS
index 2e5c2df..fa0a1f0 100644
--- a/core/java/android/app/admin/Provisioning_OWNERS
+++ b/core/java/android/app/admin/Provisioning_OWNERS
@@ -1,5 +1,4 @@
# Assign bugs to android-enterprise-triage@google.com
mdb.ae-provisioning-reviews@google.com
-petuska@google.com #{LAST_RESORT_SUGGESTION}
-nupursn@google.com #{LAST_RESORT_SUGGESTION}
-shreyacsingh@google.com #{LAST_RESORT_SUGGESTION}
+file:EnterprisePlatform_OWNERS
+petuska@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
diff --git a/core/java/android/app/admin/WorkDeviceExperience_OWNERS b/core/java/android/app/admin/WorkDeviceExperience_OWNERS
index b881de0..5e02016 100644
--- a/core/java/android/app/admin/WorkDeviceExperience_OWNERS
+++ b/core/java/android/app/admin/WorkDeviceExperience_OWNERS
@@ -1,7 +1,5 @@
# Assign bugs to android-enterprise-triage@google.com
work-device-experience+reviews@google.com
-scottjonathan@google.com #{LAST_RESORT_SUGGESTION}
-eliselliott@google.com #{LAST_RESORT_SUGGESTION}
+file:EnterprisePlatform_OWNERS
kholoudm@google.com #{LAST_RESORT_SUGGESTION}
-acjohnston@google.com #{LAST_RESORT_SUGGESTION}
-alexkershaw@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
+acjohnston@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
diff --git a/core/java/android/app/admin/WorkProfile_OWNERS b/core/java/android/app/admin/WorkProfile_OWNERS
index 260b672..e9bcce2 100644
--- a/core/java/android/app/admin/WorkProfile_OWNERS
+++ b/core/java/android/app/admin/WorkProfile_OWNERS
@@ -1,5 +1,3 @@
# Assign bugs to android-enterprise-triage@google.com
-liahav@google.com
-olit@google.com
-scottjonathan@google.com #{LAST_RESORT_SUGGESTION}
-alexkershaw@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file
+file:EnterprisePlatform_OWNERS
+liahav@google.com
\ No newline at end of file
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 7de7c67..21d4b64 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -6059,6 +6059,18 @@
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.remoteauth.RemoteAuthManager} to discover,
+ * register and authenticate via remote authenticator devices.
+ *
+ * @see #getSystemService(String)
+ * @see android.remoteauth.RemoteAuthManager
+ * @hide
+ */
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public static final String REMOTE_AUTH_SERVICE = "remote_auth";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a
* {@link android.app.ambientcontext.AmbientContextManager}.
*
* @see #getSystemService(String)
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 809dc3c4..4549c30 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4479,8 +4479,8 @@
* @see #EXTRA_SIM_LOCKED_REASON
* @see #EXTRA_REBROADCAST_ON_UNLOCK
*
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} or
- * {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} or
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*
* @hide
*/
@@ -4503,42 +4503,42 @@
* @see #SIM_STATE_IMSI
* @see #SIM_STATE_LOADED
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String EXTRA_SIM_STATE = "ss";
/**
* The intent value UNKNOWN represents the SIM state unknown
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_UNKNOWN = "UNKNOWN";
/**
* The intent value NOT_READY means that the SIM is not ready eg. radio is off or powering on
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_NOT_READY = "NOT_READY";
/**
* The intent value ABSENT means the SIM card is missing
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_ABSENT = "ABSENT";
/**
* The intent value PRESENT means the device has a SIM card inserted
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_PRESENT = "PRESENT";
/**
* The intent value CARD_IO_ERROR means for three consecutive times there was SIM IO error
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
static public final String SIM_STATE_CARD_IO_ERROR = "CARD_IO_ERROR";
@@ -4546,35 +4546,35 @@
* The intent value CARD_RESTRICTED means card is present but not usable due to carrier
* restrictions
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
static public final String SIM_STATE_CARD_RESTRICTED = "CARD_RESTRICTED";
/**
* The intent value LOCKED means the SIM is locked by PIN or by network
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_LOCKED = "LOCKED";
/**
* The intent value READY means the SIM is ready to be accessed
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_READY = "READY";
/**
* The intent value IMSI means the SIM IMSI is ready in property
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_IMSI = "IMSI";
/**
* The intent value LOADED means all SIM records, including IMSI, are loaded
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED}
*/
public static final String SIM_STATE_LOADED = "LOADED";
@@ -4588,21 +4588,24 @@
* @see #SIM_ABSENT_ON_PERM_DISABLED
*
* @hide
- * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
public static final String EXTRA_SIM_LOCKED_REASON = "reason";
/**
* The intent value PIN means the SIM is locked on PIN1
* @hide
- * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
public static final String SIM_LOCKED_ON_PIN = "PIN";
/**
* The intent value PUK means the SIM is locked on PUK1
* @hide
- * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
/* PUK means ICC is locked on PUK1 */
public static final String SIM_LOCKED_ON_PUK = "PUK";
@@ -4610,14 +4613,16 @@
/**
* The intent value NETWORK means the SIM is locked on NETWORK PERSONALIZATION
* @hide
- * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
public static final String SIM_LOCKED_NETWORK = "NETWORK";
/**
* The intent value PERM_DISABLED means SIM is permanently disabled due to puk fails
* @hide
- * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
public static final String SIM_ABSENT_ON_PERM_DISABLED = "PERM_DISABLED";
@@ -4626,8 +4631,8 @@
* is a rebroadcast on unlock. Defaults to {@code false} if not specified.
*
* @hide
- * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} or
- * {@link #ACTION_SIM_APPLICATION_STATE_CHANGED}
+ * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} or
+ * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED}
*/
public static final String EXTRA_REBROADCAST_ON_UNLOCK = "rebroadcastOnUnlock";
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index d738d9e..db4a684 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1561,6 +1561,14 @@
*/
public static final int INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK = 0x01000000;
+ /**
+ * Flag parameter for {@link #installPackage} to force a non-staged update of an APEX. This is
+ * a development-only feature and should not be used on end user devices.
+ *
+ * @hide
+ */
+ public static final int INSTALL_FORCE_NON_STAGED_APEX_UPDATE = 0x02000000;
+
/** @hide */
@IntDef(flag = true, value = {
DONT_KILL_APP,
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 9b16949..c8dbfc9 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -53,6 +53,7 @@
import android.graphics.drawable.DrawableInflater;
import android.os.Build;
import android.os.Bundle;
+import android.os.SystemClock;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AttributeSet;
@@ -132,6 +133,11 @@
private static final Object sSync = new Object();
private final Object mUpdateLock = new Object();
+ /**
+ * Controls whether we should preload resources during zygote init.
+ */
+ private static final boolean PRELOAD_RESOURCES = true;
+
// Used by BridgeResources in layoutlib
@UnsupportedAppUsage
static Resources mSystem = null;
@@ -2666,6 +2672,98 @@
}
}
+ /**
+ * Load in commonly used resources, so they can be shared across processes.
+ *
+ * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even
+ * larger.
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public static void preloadResources() {
+ try {
+ final Resources sysRes = Resources.getSystem();
+ sysRes.startPreloading();
+ if (PRELOAD_RESOURCES) {
+ Log.i(TAG, "Preloading resources...");
+
+ long startTime = SystemClock.uptimeMillis();
+ TypedArray ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_drawables);
+ int numberOfEntries = preloadDrawables(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resources in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+
+ startTime = SystemClock.uptimeMillis();
+ ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_color_state_lists);
+ numberOfEntries = preloadColorStateLists(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resources in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+
+ if (sysRes.getBoolean(
+ com.android.internal.R.bool.config_freeformWindowManagement)) {
+ startTime = SystemClock.uptimeMillis();
+ ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_freeform_multi_window_drawables);
+ numberOfEntries = preloadDrawables(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resource in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+ }
+ }
+ sysRes.finishPreloading();
+ } catch (RuntimeException e) {
+ Log.w(TAG, "Failure preloading resources", e);
+ }
+ }
+
+ private static int preloadColorStateLists(Resources resources, TypedArray ar) {
+ final int numberOfEntries = ar.length();
+ for (int i = 0; i < numberOfEntries; i++) {
+ int id = ar.getResourceId(i, 0);
+
+ if (id != 0) {
+ if (resources.getColorStateList(id, null) == null) {
+ throw new IllegalArgumentException(
+ "Unable to find preloaded color resource #0x"
+ + Integer.toHexString(id)
+ + " (" + ar.getString(i) + ")");
+ }
+ }
+ }
+ return numberOfEntries;
+ }
+
+ private static int preloadDrawables(Resources resources, TypedArray ar) {
+ final int numberOfEntries = ar.length();
+ for (int i = 0; i < numberOfEntries; i++) {
+ int id = ar.getResourceId(i, 0);
+
+ if (id != 0) {
+ if (resources.getDrawable(id, null) == null) {
+ throw new IllegalArgumentException(
+ "Unable to find preloaded drawable resource #0x"
+ + Integer.toHexString(id)
+ + " (" + ar.getString(i) + ")");
+ }
+ }
+ }
+ return numberOfEntries;
+ }
+
+ /**
+ * Clear the cache when the framework resources packages is changed.
+ * @hide
+ */
+ @VisibleForTesting
+ public static void resetPreloadDrawableStateCache() {
+ ResourcesImpl.resetDrawableStateCache();
+ preloadResources();
+ }
+
/** @hide */
public void dump(PrintWriter pw, String prefix) {
pw.println(prefix + "class=" + getClass());
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 3bb237a..480e43e 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -52,6 +52,7 @@
import android.util.Xml;
import android.view.DisplayAdjustments;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.GrowingArrayUtils;
import libcore.util.NativeAllocationRegistry;
@@ -159,6 +160,23 @@
}
/**
+ * Clear the cache when the framework resources packages is changed.
+ *
+ * It's only used in the test initial function instead of regular app behaviors. It doesn't
+ * guarantee the thread-safety so mark this with @VisibleForTesting.
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ static void resetDrawableStateCache() {
+ synchronized (sSync) {
+ sPreloadedDrawables[0].clear();
+ sPreloadedDrawables[1].clear();
+ sPreloadedColorDrawables.clear();
+ sPreloadedComplexColors.clear();
+ sPreloaded = false;
+ }
+ }
+
+ /**
* Creates a new ResourcesImpl object with CompatibilityInfo.
*
* @param assets Previously created AssetManager.
diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
index 02e7f60..c8e2ccc 100644
--- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
@@ -221,7 +221,7 @@
List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs;
ArrayList<OutputConfiguration> outputList = new ArrayList<>();
for (CameraOutputConfig output : outputConfigs) {
- Surface outputSurface = initializeSurfrace(output);
+ Surface outputSurface = initializeSurface(output);
if (outputSurface == null) {
continue;
}
@@ -234,7 +234,7 @@
if ((output.sharedSurfaceConfigs != null) && !output.sharedSurfaceConfigs.isEmpty()) {
cameraOutput.enableSurfaceSharing();
for (CameraOutputConfig sharedOutputConfig : output.sharedSurfaceConfigs) {
- Surface sharedSurface = initializeSurfrace(sharedOutputConfig);
+ Surface sharedSurface = initializeSurface(sharedOutputConfig);
if (sharedSurface == null) {
continue;
}
@@ -989,7 +989,7 @@
return ret;
}
- private Surface initializeSurfrace(CameraOutputConfig output) {
+ private Surface initializeSurface(CameraOutputConfig output) {
switch(output.type) {
case CameraOutputConfig.TYPE_SURFACE:
if (output.surface == null) {
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
index 2156c12..efb3510 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
@@ -1942,10 +1942,10 @@
HashMap<Integer, Pair<Image, TotalCaptureResult>> captureMap, Integer jpegOrientation,
Byte jpegQuality) {
ArrayList<CaptureBundle> ret = new ArrayList<>();
- for (Integer stagetId : captureMap.keySet()) {
- Pair<Image, TotalCaptureResult> entry = captureMap.get(stagetId);
+ for (Integer stageId : captureMap.keySet()) {
+ Pair<Image, TotalCaptureResult> entry = captureMap.get(stageId);
CaptureBundle bundle = new CaptureBundle();
- bundle.stage = stagetId;
+ bundle.stage = stageId;
bundle.captureImage = initializeParcelImage(entry.first);
bundle.sequenceId = entry.second.getSequenceId();
bundle.captureResult = entry.second.getNativeMetadata();
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index 1ae1b05..37bd67a 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -537,8 +537,15 @@
}
/**
- * Sets an HTTP proxy for the VPN network. This proxy is only a recommendation
- * and it is possible that some apps will ignore it. PAC proxies are not supported.
+ * Sets an HTTP proxy for the VPN network.
+ * <p class="note">This proxy is only a recommendation and it is possible that some apps
+ * will ignore it.
+ * <p class="note">PAC proxies are not supported over VPNs.
+ * <p class="note">Apps that do use the proxy cannot distinguish between routes handled
+ * and not handled by the VPN and will try to access HTTP resources over the proxy
+ * regardless of the destination. In practice this means using a proxy with a split
+ * tunnel generally won't work as expected, because HTTP accesses on routes not handled by
+ * the VPN will not reach as the proxy won't be available outside of the VPN network.
*/
@NonNull
public Builder setHttpProxy(@NonNull ProxyInfo proxyInfo) {
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index aa733b5..bd040b2 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -33,7 +33,6 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.service.dreams.Sandman;
-import android.sysprop.InitProperties;
import android.util.ArrayMap;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
@@ -873,6 +872,8 @@
/**
* The 'reason' value used for rebooting userspace.
+ *
+ * @deprecated userspace reboot is not supported
* @hide
*/
@SystemApi
@@ -1805,16 +1806,18 @@
* <p>This method exists solely for the sake of re-using same logic between {@code PowerManager}
* and {@code PowerManagerService}.
*
+ * @deprecated TODO(b/292469129): remove this method.
* @hide
*/
public static boolean isRebootingUserspaceSupportedImpl() {
- return InitProperties.is_userspace_reboot_supported().orElse(false);
+ return false;
}
/**
* Returns {@code true} if this device supports rebooting userspace.
+ *
+ * @deprecated userspace reboot is deprecated, this method always returns {@code false}.
*/
- // TODO(b/138605180): add link to documentation once it's ready.
public boolean isRebootingUserspaceSupported() {
return isRebootingUserspaceSupportedImpl();
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 0786d6f..26c5b87 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -196,7 +196,8 @@
public static final int PROFILEABLE = 1 << 24;
/**
- * Enable ptrace. This is enabled on eng or userdebug builds, or if the app is debuggable.
+ * Enable ptrace. This is enabled on eng, if the app is debuggable, or if
+ * the persist.debug.ptrace.enabled property is set.
*/
public static final int DEBUG_ENABLE_PTRACE = 1 << 25;
@@ -1020,20 +1021,35 @@
"persist.debug.dalvik.vm.jdwp.enabled").equals("1");
/**
+ * This will enable ptrace by default for all apps. It is OK to cache this property
+ * because we expect to reboot the system whenever this property changes
+ */
+ private static final boolean ENABLE_PTRACE = SystemProperties.get(
+ "persist.debug.ptrace.enabled").equals("1");
+
+ /**
* Applies debugger system properties to the zygote arguments.
*
- * For eng builds all apps are debuggable. On userdebug and user builds
- * if persist.debug.dalvik.vm.jdwp.enabled is 1 all apps are
- * debuggable. Otherwise, the debugger state is specified via the
- * "--enable-jdwp" flag in the spawn request.
+ * For eng builds all apps are debuggable with JDWP and ptrace.
+ *
+ * On userdebug builds if persist.debug.dalvik.vm.jdwp.enabled
+ * is 1 all apps are debuggable with JDWP and ptrace. Otherwise, the
+ * debugger state is specified via the "--enable-jdwp" flag in the
+ * spawn request.
+ *
+ * On userdebug builds if persist.debug.ptrace.enabled is 1 all
+ * apps are debuggable with ptrace.
*
* @param args non-null; zygote spawner args
*/
static void applyDebuggerSystemProperty(ZygoteArguments args) {
- if (Build.IS_ENG || ENABLE_JDWP) {
+ if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_JDWP)) {
args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_JDWP;
+ // Also enable ptrace when JDWP is enabled for consistency with
+ // before persist.debug.ptrace.enabled existed.
+ args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE;
}
- if (RoSystemProperties.DEBUGGABLE) {
+ if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_PTRACE)) {
args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE;
}
}
@@ -1057,7 +1073,8 @@
int peerUid = peer.getUid();
if (args.mInvokeWith != null && peerUid != 0
- && (args.mRuntimeFlags & Zygote.DEBUG_ENABLE_JDWP) == 0) {
+ && (args.mRuntimeFlags
+ & (Zygote.DEBUG_ENABLE_JDWP | Zygote.DEBUG_ENABLE_PTRACE)) == 0) {
throw new ZygoteSecurityException("Peer is permitted to specify an "
+ "explicit invoke-with wrapper command only for debuggable "
+ "applications.");
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 85cb15b..b3938b4 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -26,7 +26,6 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.SharedLibraryInfo;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.os.Build;
import android.os.Environment;
import android.os.IInstalld;
@@ -102,21 +101,10 @@
private static final String SOCKET_NAME_ARG = "--socket-name=";
/**
- * Used to pre-load resources.
- */
- @UnsupportedAppUsage
- private static Resources mResources;
-
- /**
* The path of a file that contains classes to preload.
*/
private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes";
- /**
- * Controls whether we should preload resources during zygote init.
- */
- private static final boolean PRELOAD_RESOURCES = true;
-
private static final int UNPRIVILEGED_UID = 9999;
private static final int UNPRIVILEGED_GID = 9999;
@@ -143,7 +131,7 @@
cacheNonBootClasspathClassLoaders();
bootTimingsTraceLog.traceEnd(); // CacheNonBootClasspathClassLoaders
bootTimingsTraceLog.traceBegin("PreloadResources");
- preloadResources();
+ Resources.preloadResources();
bootTimingsTraceLog.traceEnd(); // PreloadResources
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadAppProcessHALs");
nativePreloadAppProcessHALs();
@@ -414,87 +402,6 @@
}
/**
- * Load in commonly used resources, so they can be shared across processes.
- *
- * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even
- * larger.
- */
- private static void preloadResources() {
- try {
- mResources = Resources.getSystem();
- mResources.startPreloading();
- if (PRELOAD_RESOURCES) {
- Log.i(TAG, "Preloading resources...");
-
- long startTime = SystemClock.uptimeMillis();
- TypedArray ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_drawables);
- int N = preloadDrawables(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resources in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
-
- startTime = SystemClock.uptimeMillis();
- ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_color_state_lists);
- N = preloadColorStateLists(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resources in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
-
- if (mResources.getBoolean(
- com.android.internal.R.bool.config_freeformWindowManagement)) {
- startTime = SystemClock.uptimeMillis();
- ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_freeform_multi_window_drawables);
- N = preloadDrawables(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resource in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
- }
- }
- mResources.finishPreloading();
- } catch (RuntimeException e) {
- Log.w(TAG, "Failure preloading resources", e);
- }
- }
-
- private static int preloadColorStateLists(TypedArray ar) {
- int N = ar.length();
- for (int i = 0; i < N; i++) {
- int id = ar.getResourceId(i, 0);
-
- if (id != 0) {
- if (mResources.getColorStateList(id, null) == null) {
- throw new IllegalArgumentException(
- "Unable to find preloaded color resource #0x"
- + Integer.toHexString(id)
- + " (" + ar.getString(i) + ")");
- }
- }
- }
- return N;
- }
-
-
- private static int preloadDrawables(TypedArray ar) {
- int N = ar.length();
- for (int i = 0; i < N; i++) {
- int id = ar.getResourceId(i, 0);
-
- if (id != 0) {
- if (mResources.getDrawable(id, null) == null) {
- throw new IllegalArgumentException(
- "Unable to find preloaded drawable resource #0x"
- + Integer.toHexString(id)
- + " (" + ar.getString(i) + ")");
- }
- }
- }
- return N;
- }
-
- /**
* Runs several special GCs to try to clean up a few generations of softly- and final-reachable
* objects, along with any other garbage. This is only useful just before a fork().
*/
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index c198797..9dce5e3 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -40,7 +40,6 @@
#include <binder/Stability.h>
#include <binderthreadstate/CallerUtils.h>
#include <cutils/atomic.h>
-#include <cutils/threads.h>
#include <log/log.h>
#include <utils/KeyedVector.h>
#include <utils/List.h>
diff --git a/core/tests/coretests/src/com/android/internal/content/OWNERS b/core/tests/coretests/src/com/android/internal/content/OWNERS
index dd9ede5..4bb8343 100644
--- a/core/tests/coretests/src/com/android/internal/content/OWNERS
+++ b/core/tests/coretests/src/com/android/internal/content/OWNERS
@@ -1,4 +1,2 @@
-per-file PackageMonitorTest.java = file:/core/java/android/content/pm/OWNERS
-
per-file Overlay* = file:/core/java/android/content/res/OWNERS
diff --git a/core/tests/packagemonitortests/OWNERS b/core/tests/packagemonitortests/OWNERS
new file mode 100644
index 0000000..d825dfd
--- /dev/null
+++ b/core/tests/packagemonitortests/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/pm/OWNERS
diff --git a/libs/hwui/OWNERS b/libs/hwui/OWNERS
index bb93e66..6ca991d 100644
--- a/libs/hwui/OWNERS
+++ b/libs/hwui/OWNERS
@@ -1,3 +1,5 @@
+# Bug component: 1075005
+
alecmouri@google.com
djsollen@google.com
jreck@google.com
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index eb30ad9..71bd639 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -134,6 +134,7 @@
"res-keyguard",
"res",
],
+ use_resource_processor: true,
static_libs: [
"WifiTrackerLib",
"WindowManager-Shell",
@@ -452,6 +453,7 @@
],
resource_dirs: [],
+ use_resource_processor: true,
platform_apis: true,
system_ext_specific: true,
certificate: "platform",
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 3b9060a..d2e4640 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -30,7 +30,7 @@
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.systemui.R
+import com.android.systemui.customization.R
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 0326b6d..bc45e31 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -52,7 +52,9 @@
int largeClockTopMargin = parent.getResources()
.getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin);
int targetHeight = parent.getResources()
- .getDimensionPixelSize(R.dimen.large_clock_text_size) * 2;
+ .getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.large_clock_text_size)
+ * 2;
int top = parent.getHeight() / 2 - targetHeight / 2
+ largeClockTopMargin / 2;
return new Rect(
@@ -152,7 +154,8 @@
if (mClock != null) {
if (mSmallClockFrame.isLaidOut()) {
int targetHeight = getResources()
- .getDimensionPixelSize(R.dimen.small_clock_text_size);
+ .getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_text_size);
mClock.getSmallClock().getEvents().onTargetRegionChanged(new Rect(
mSmallClockFrame.getLeft(),
mSmallClockFrame.getTop(),
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index ba5a8c9..ccc1e45 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -1150,7 +1150,8 @@
}
drawable.setTint(iconColor);
- Drawable bg = context.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = context.getDrawable(
+ com.android.settingslib.R.drawable.user_avatar_bg);
bg.setTintBlendMode(BlendMode.DST);
bg.setTint(Utils.getColorAttrDefaultColor(context,
com.android.internal.R.attr.colorSurfaceVariant));
diff --git a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
index fa9a83e..7a6b1c3 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
@@ -64,12 +64,15 @@
}
String contentText;
if (userInfo.isEphemeral()) {
- contentText = mContext.getString(R.string.guest_notification_ephemeral);
+ contentText = mContext.getString(
+ com.android.settingslib.R.string.guest_notification_ephemeral);
} else if (isGuestFirstLogin) {
- contentText = mContext.getString(R.string.guest_notification_non_ephemeral);
+ contentText = mContext.getString(
+ com.android.settingslib.R.string.guest_notification_non_ephemeral);
} else {
contentText = mContext.getString(
- R.string.guest_notification_non_ephemeral_non_first_login);
+ com.android.settingslib.R.string
+ .guest_notification_non_ephemeral_non_first_login);
}
final Intent guestExitIntent = new Intent(
@@ -89,7 +92,7 @@
Notification.Builder builder = new Notification.Builder(mContext,
NotificationChannels.ALERTS)
- .setSmallIcon(R.drawable.ic_account_circle)
+ .setSmallIcon(com.android.settingslib.R.drawable.ic_account_circle)
.setContentTitle(mContext.getString(R.string.guest_notification_session_active))
.setContentText(contentText)
.setPriority(Notification.PRIORITY_DEFAULT)
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
index 370628c..eb004fb 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
@@ -106,7 +106,7 @@
TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
defStyle, 0);
final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,
- context.getColor(R.color.meter_background_color));
+ context.getColor(com.android.settingslib.R.color.meter_background_color));
mPercentageStyleId = atts.getResourceId(R.styleable.BatteryMeterView_textAppearance, 0);
mDrawable = new AccessorizedBatteryDrawable(context, frameColor);
atts.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
index c98a62f..2bf8050 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
@@ -460,7 +460,7 @@
for (key in listOf(".blue600", ".blue400")) {
addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(
- context.getColor(R.color.settingslib_color_blue400),
+ context.getColor(com.android.settingslib.R.color.settingslib_color_blue400),
PorterDuff.Mode.SRC_ATOP
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
index 2b42604..14d4b68 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
@@ -119,7 +119,7 @@
::AnimatingColorTransition
)
- val bgColor = context.getColor(com.android.systemui.R.color.material_dynamic_secondary95)
+ val bgColor = context.getColor(com.google.android.material.R.color.material_dynamic_secondary95)
val surfaceColor =
animatingColorTransitionFactory(bgColor, ::surfaceFromScheme) { surfaceColor ->
val colorList = ColorStateList.valueOf(surfaceColor)
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
index 58e700f..25965fc 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
@@ -33,7 +33,6 @@
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import com.android.settingslib.Utils;
-import com.android.systemui.R;
class PeopleStoryIconFactory implements AutoCloseable {
@@ -59,7 +58,8 @@
mIconSize = mDensity * iconSizeDp;
mPackageManager = pm;
mIconDrawableFactory = iconDrawableFactory;
- mImportantConversationColor = mContext.getColor(R.color.important_conversation);
+ mImportantConversationColor = mContext.getColor(
+ com.android.launcher3.icons.R.color.important_conversation);
mAccentColor = Utils.getColorAttr(mContext,
com.android.internal.R.attr.colorAccentPrimaryVariant).getDefaultColor();
}
@@ -224,4 +224,4 @@
@Override
public void close() {
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 6bf8b76..30bfd6d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -178,7 +178,8 @@
private String getSecondaryLabel(boolean isActive, boolean isTransient,
boolean isDataSaverEnabled, int numConnectedDevices, boolean isWifiTetheringAllowed) {
if (!isWifiTetheringAllowed) {
- return mContext.getString(R.string.wifitrackerlib_admin_restricted_network);
+ return mContext.getString(
+ com.android.wifitrackerlib.R.string.wifitrackerlib_admin_restricted_network);
} else if (isTransient) {
return mContext.getString(R.string.quick_settings_hotspot_secondary_label_transient);
} else if (isDataSaverEnabled) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
index 4ebf337..ad22c61 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt
@@ -51,7 +51,7 @@
object NotifPipelineChoreographerModule
@Module
-private interface PrivateModule {
+interface PrivateModule {
@Binds
fun bindChoreographer(impl: NotifPipelineChoreographerImpl): NotifPipelineChoreographer
}
@@ -59,7 +59,7 @@
private const val TIMEOUT_MS: Long = 100
@SysUISingleton
-private class NotifPipelineChoreographerImpl @Inject constructor(
+class NotifPipelineChoreographerImpl @Inject constructor(
private val viewChoreographer: Choreographer,
@Main private val executor: DelayableExecutor
) : NotifPipelineChoreographer {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
index aeeeb4f..9ba1f7a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
@@ -38,7 +38,7 @@
interface SensitiveContentCoordinatorModule
@Module
-private interface PrivateSensitiveContentCoordinatorModule {
+interface PrivateSensitiveContentCoordinatorModule {
@Binds
fun bindCoordinator(impl: SensitiveContentCoordinatorImpl): SensitiveContentCoordinator
}
@@ -47,7 +47,7 @@
interface SensitiveContentCoordinator : Coordinator
@CoordinatorScope
-private class SensitiveContentCoordinatorImpl @Inject constructor(
+class SensitiveContentCoordinatorImpl @Inject constructor(
private val dynamicPrivacyController: DynamicPrivacyController,
private val lockscreenUserManager: NotificationLockscreenUserManager,
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt
index 357c5b2..c00bb93 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt
@@ -50,7 +50,7 @@
@Module(includes = [
SensitiveContentCoordinatorModule::class,
])
-private abstract class InternalCoordinatorsModule {
+abstract class InternalCoordinatorsModule {
@Binds
@Internal
abstract fun bindNotifCoordinators(impl: NotifCoordinatorsImpl): NotifCoordinators
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
index 7b59266..49990d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
@@ -38,7 +38,7 @@
}
@SectionHeaderScope
-internal class SectionHeaderNodeControllerImpl @Inject constructor(
+class SectionHeaderNodeControllerImpl @Inject constructor(
@NodeLabel override val nodeLabel: String,
private val layoutInflater: LayoutInflater,
@HeaderText @StringRes private val headerTextResId: Int,
@@ -103,4 +103,4 @@
override fun offerToKeepInParentForAnimation(): Boolean = false
override fun removeFromParentIfKeptForAnimation(): Boolean = false
override fun resetKeepInParentForAnimation() {}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt
index 2a9cfd0..75801a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt
@@ -145,7 +145,7 @@
}
@Module
-private abstract class SectionHeaderBindingModule {
+abstract class SectionHeaderBindingModule {
@Binds abstract fun bindsNodeController(impl: SectionHeaderNodeControllerImpl): NodeController
@Binds abstract fun bindsSectionHeaderController(
impl: SectionHeaderNodeControllerImpl
@@ -182,4 +182,4 @@
@Scope
@Retention(AnnotationRetention.BINARY)
-annotation class SectionHeaderScope
\ No newline at end of file
+annotation class SectionHeaderScope
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt
index 7b65454..55ca0ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt
@@ -57,7 +57,7 @@
object KeyguardNotificationVisibilityProviderModule
@Module
-private interface KeyguardNotificationVisibilityProviderImplModule {
+interface KeyguardNotificationVisibilityProviderImplModule {
@Binds
fun bindImpl(impl: KeyguardNotificationVisibilityProviderImpl):
KeyguardNotificationVisibilityProvider
@@ -69,7 +69,7 @@
}
@SysUISingleton
-private class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
+class KeyguardNotificationVisibilityProviderImpl @Inject constructor(
@Main private val handler: Handler,
private val keyguardStateController: KeyguardStateController,
private val lockscreenUserManager: NotificationLockscreenUserManager,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 87d54a4..3130f7f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -1394,8 +1394,8 @@
if (shouldShowBubbleButton(entry)) {
// explicitly resolve drawable resource using SystemUI's theme
Drawable d = mContext.getDrawable(entry.isBubble()
- ? R.drawable.bubble_ic_stop_bubble
- : R.drawable.bubble_ic_create_bubble);
+ ? com.android.wm.shell.R.drawable.bubble_ic_stop_bubble
+ : com.android.wm.shell.R.drawable.bubble_ic_create_bubble);
String contentDescription = mContext.getResources().getString(entry.isBubble()
? R.string.notification_conversation_unbubble
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
index 2677c3f2..bb64beb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
@@ -23,7 +23,6 @@
import android.util.ArrayMap;
import android.widget.ImageView;
-import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
@@ -54,8 +53,10 @@
Context context,
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
DumpManager dumpManager) {
- mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
- mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
+ mDarkModeIconColorSingleTone = context.getColor(
+ com.android.settingslib.R.color.dark_mode_icon_color_single_tone);
+ mLightModeIconColorSingleTone = context.getColor(
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone);
mTransitionsController = lightBarTransitionsControllerFactory.create(this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 13566ef..feace12 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -458,8 +458,9 @@
@ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext,
R.attr.wallpaperTextColor);
@ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext,
- Color.luminance(textColor) < 0.5 ? R.color.dark_mode_icon_color_single_tone :
- R.color.light_mode_icon_color_single_tone);
+ Color.luminance(textColor) < 0.5
+ ? com.android.settingslib.R.color.dark_mode_icon_color_single_tone
+ : com.android.settingslib.R.color.light_mode_icon_color_single_tone);
float intensity = textColor == Color.WHITE ? 0 : 1;
mCarrierLabel.setTextColor(iconColor);
@@ -467,7 +468,7 @@
if (userSwitcherName != null) {
userSwitcherName.setTextColor(Utils.getColorStateListDefaultColor(
mContext,
- R.color.light_mode_icon_color_single_tone));
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone));
}
if (iconManager != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index fe2a913..9a7be10 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -32,7 +32,6 @@
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Dumpable;
-import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.navigationbar.NavigationModeController;
@@ -96,8 +95,10 @@
NavigationModeController navModeController,
DumpManager dumpManager,
DisplayTracker displayTracker) {
- mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
- mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
+ mDarkIconColor = ctx.getColor(
+ com.android.settingslib.R.color.dark_mode_icon_color_single_tone);
+ mLightIconColor = ctx.getColor(
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone);
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
mBatteryController = batteryController;
mBatteryController.addCallback(this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 924ae4a..92e1e4b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -415,7 +415,8 @@
// We first look for the background on the dialogContentWithBackground added by
// DialogLaunchAnimator. If it's not there, we use the background of the DecorView.
View viewWithBackground = decorView.findViewByPredicate(
- view -> view.getTag(R.id.tag_dialog_background) != null);
+ view -> view.getTag(
+ com.android.systemui.animation.R.id.tag_dialog_background) != null);
Drawable background = viewWithBackground != null ? viewWithBackground.getBackground()
: decorView.getBackground();
Insets insets = background != null ? background.getOpticalInsets() : Insets.NONE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
index c8ee647..880e0d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
@@ -319,7 +319,7 @@
drawable = new CircleFramedDrawable(mCurrentUser.picture, avatarSize);
}
- Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg);
drawable = new LayerDrawable(new Drawable[]{bg, drawable});
return drawable;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
index e9f0dcb..9a6e71c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
@@ -533,7 +533,7 @@
}
drawable.setTint(mResources.getColor(iconColorRes, mContext.getTheme()));
- Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg);
drawable = new LayerDrawable(new Drawable[]{bg, drawable});
return drawable;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt
index d4abc40..d31c001 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt
@@ -41,7 +41,7 @@
}
@Module
-private interface InternalRemoteInputViewModule {
+interface InternalRemoteInputViewModule {
@Binds
fun bindController(impl: RemoteInputViewControllerImpl): RemoteInputViewController
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index 32ecb67..ecaf792 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -61,7 +61,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setTheme(R.style.Theme_AppCompat_DayNight);
+ setTheme(androidx.appcompat.R.style.Theme_AppCompat_DayNight);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
requestWindowFeature(Window.FEATURE_NO_TITLE);
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
index 667a3ca..83b272e 100644
--- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
@@ -747,7 +747,9 @@
userId: Int,
): Drawable {
if (isGuest) {
- return checkNotNull(applicationContext.getDrawable(R.drawable.ic_account_circle))
+ return checkNotNull(
+ applicationContext.getDrawable(com.android.settingslib.R.drawable.ic_account_circle)
+ )
}
// TODO(b/246631653): cache the bitmaps to avoid the background work to fetch them.
diff --git a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
index e74232d..00ca92d 100644
--- a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
@@ -42,13 +42,13 @@
isManageUsers: Boolean,
): Int {
return if (isAddUser && isTablet) {
- R.drawable.ic_account_circle_filled
+ com.android.settingslib.R.drawable.ic_account_circle_filled
} else if (isAddUser) {
R.drawable.ic_add
} else if (isGuest) {
- R.drawable.ic_account_circle
+ com.android.settingslib.R.drawable.ic_account_circle
} else if (isAddSupervisedUser) {
- R.drawable.ic_add_supervised_user
+ com.android.settingslib.R.drawable.ic_add_supervised_user
} else if (isManageUsers) {
R.drawable.ic_manage_users
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
index afd72e7..aeed5fc 100644
--- a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
@@ -128,7 +128,7 @@
viewKey = model.id,
name =
if (model.isGuest && model.isSelected) {
- Text.Resource(R.string.guest_exit_quick_settings_button)
+ Text.Resource(com.android.settingslib.R.string.guest_exit_quick_settings_button)
} else {
model.name
},
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index 2efeda9..904a98b 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -112,7 +112,7 @@
// priority, so it can be shown in all times.
nm.createNotificationChannel(new NotificationChannel(
TVPIP,
- context.getString(R.string.notification_channel_tv_pip),
+ context.getString(com.android.wm.shell.R.string.notification_channel_tv_pip),
NotificationManager.IMPORTANCE_MAX));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 35cb834..cd0fc79 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -1747,8 +1747,10 @@
if (!ss.dynamic) continue;
mDynamic.put(stream, true);
if (findRow(stream) == null) {
- addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true,
- false, true);
+ addRow(stream,
+ com.android.settingslib.R.drawable.ic_volume_remote,
+ com.android.settingslib.R.drawable.ic_volume_remote_mute,
+ true, false, true);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
index d2142dc..e5c55b0 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
@@ -48,8 +48,10 @@
R.dimen.card_carousel_dot_selected_radius);
mDotMargin = context.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_margin);
- mUnselectedColor = context.getColor(R.color.material_dynamic_neutral70);
- mSelectedColor = context.getColor(R.color.material_dynamic_neutral100);
+ mUnselectedColor = context.getColor(
+ com.google.android.material.R.color.material_dynamic_neutral70);
+ mSelectedColor = context.getColor(
+ com.google.android.material.R.color.material_dynamic_neutral100);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
index d03148c..2491e2b 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
@@ -278,7 +278,7 @@
private Drawable getHomeIndicatorDrawable() {
Drawable drawable = getDrawable(R.drawable.ic_close);
- drawable.setTint(getColor(R.color.material_dynamic_neutral70));
+ drawable.setTint(getColor(com.google.android.material.R.color.material_dynamic_neutral70));
return drawable;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
index e3b8649..9737759 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
@@ -633,6 +633,7 @@
val userInfos = createUserInfos(count = 2, includeGuest = false)
userRepository.setUserInfos(userInfos)
userRepository.setSelectedUserInfo(userInfos[0])
+ runCurrent()
val refreshUsersCallCount = userRepository.refreshUsersCallCount
fakeBroadcastDispatcher.registeredReceivers.forEach {
@@ -653,6 +654,7 @@
val userInfos = createUserInfos(count = 2, includeGuest = false)
userRepository.setUserInfos(userInfos)
userRepository.setSelectedUserInfo(userInfos[0])
+ runCurrent()
val refreshUsersCallCount = userRepository.refreshUsersCallCount
fakeBroadcastDispatcher.registeredReceivers.forEach {
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
index 2cf0e3e..c80bed2 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
@@ -634,7 +634,7 @@
MotionEvent event, MotionEvent rawEvent, int policyFlags) {
switch (event.getActionMasked()) {
case ACTION_DOWN:
- // We should have already received ACTION_DOWN. Ignore.
+ handleActionDownStateTouchExploring(event, rawEvent, policyFlags);
break;
case ACTION_POINTER_DOWN:
handleActionPointerDown(event, rawEvent, policyFlags);
@@ -840,6 +840,15 @@
}
}
+ private void handleActionDownStateTouchExploring(
+ MotionEvent event, MotionEvent rawEvent, int policyFlags) {
+ // This is an interrupted and continued touch exploration. Maintain the consistency of the
+ // event stream.
+ mSendTouchExplorationEndDelayed.cancel();
+ mSendTouchInteractionEndDelayed.cancel();
+ sendTouchExplorationGestureStartAndHoverEnterIfNeeded(policyFlags);
+ }
+
/**
* Handles move events while touch exploring. this is also where we drag or delegate based on
* the number of fingers moving on the screen.
@@ -1097,12 +1106,15 @@
}
/**
- * Sends the enter events if needed. Such events are hover enter and touch explore
- * gesture start.
+ * Sends the enter events if needed. Such events are hover enter and touch explore gesture
+ * start.
*
* @param policyFlags The policy flags associated with the event.
*/
private void sendTouchExplorationGestureStartAndHoverEnterIfNeeded(int policyFlags) {
+ if (!mState.isTouchExploring()) {
+ mDispatcher.sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_START);
+ }
MotionEvent event = mState.getLastInjectedHoverEvent();
if (event != null && event.getActionMasked() == ACTION_HOVER_EXIT) {
final int pointerIdBits = event.getPointerIdBits();
@@ -1115,7 +1127,6 @@
}
}
-
/**
* Determines whether a two pointer gesture is a dragging one.
*
@@ -1341,6 +1352,8 @@
Slog.e(LOG_TAG, "Unable to find a valid pointer for touch exploration.");
return;
}
+ // Send hover exit if we haven't closed a previous touch exploration event stream.
+ sendHoverExitAndTouchExplorationGestureEndIfNeeded(pointerId);
final int pointerIdBits = (1 << pointerId);
final int policyFlags = mState.getLastReceivedPolicyFlags();
mSendHoverEnterAndMoveDelayed.setPointerIdBits(pointerIdBits);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 3d0f487..c17d2c8 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -395,6 +395,20 @@
mBtHelper.stopBluetoothSco(eventSource);
}
+ // In BT classic for communication, the device changes from a2dp to sco device, but for
+ // LE Audio it stays the same and we must trigger the proper stream volume alignment, if
+ // LE Audio communication device is activated after the audio system has already switched to
+ // MODE_IN_CALL mode.
+ if (isBluetoothLeAudioRequested()) {
+ final int streamType = mAudioService.getBluetoothContextualVolumeStream();
+ final int leAudioVolIndex = getVssVolumeForDevice(streamType, device.getInternalType());
+ final int leAudioMaxVolIndex = getMaxVssVolumeForStream(streamType);
+ if (AudioService.DEBUG_COMM_RTE) {
+ Log.v(TAG, "setCommunicationRouteForClient restoring LE Audio device volume lvl.");
+ }
+ postSetLeAudioVolumeIndex(leAudioVolIndex, leAudioMaxVolIndex, streamType);
+ }
+
sendLMsgNoDelay(MSG_L_UPDATE_COMMUNICATION_ROUTE, SENDMSG_QUEUE, eventSource);
}
@@ -608,6 +622,16 @@
}
/**
+ * Helper method on top of isDeviceRequestedForCommunication() indicating if
+ * Bluetooth LE Audio communication device is currently requested or not.
+ * @return true if Bluetooth LE Audio device is requested, false otherwise.
+ */
+ /*package*/ boolean isBluetoothLeAudioRequested() {
+ return isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BLE_HEADSET)
+ || isDeviceRequestedForCommunication(AudioDeviceInfo.TYPE_BLE_SPEAKER);
+ }
+
+ /**
* Indicates if preferred route selection for communication is Bluetooth SCO.
* @return true if Bluetooth SCO is preferred , false otherwise.
*/
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index b83ab38..4c234a0 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3449,8 +3449,14 @@
hdmiClient = mHdmiTvClient;
}
- if (((mHdmiPlaybackClient != null && isFullVolumeDevice(device))
- || (mHdmiTvClient != null && mHdmiSystemAudioSupported))
+ boolean playbackDeviceConditions = mHdmiPlaybackClient != null
+ && isFullVolumeDevice(device);
+ boolean tvConditions = mHdmiTvClient != null
+ && mHdmiSystemAudioSupported
+ && !isAbsoluteVolumeDevice(device)
+ && !isA2dpAbsoluteVolumeDevice(device);
+
+ if ((playbackDeviceConditions || tvConditions)
&& mHdmiCecVolumeControlEnabled
&& streamTypeAlias == AudioSystem.STREAM_MUSIC) {
int keyCode = KeyEvent.KEYCODE_UNKNOWN;
diff --git a/services/core/java/com/android/server/logcat/LogcatManagerService.java b/services/core/java/com/android/server/logcat/LogcatManagerService.java
index 43732d4..25c939e 100644
--- a/services/core/java/com/android/server/logcat/LogcatManagerService.java
+++ b/services/core/java/com/android/server/logcat/LogcatManagerService.java
@@ -27,6 +27,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
+import android.os.DeadObjectException;
import android.os.Handler;
import android.os.ILogd;
import android.os.Looper;
@@ -514,7 +515,15 @@
Slog.d(TAG, "Approving log access: " + request);
}
try {
- getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd);
+ try {
+ getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd);
+ } catch (DeadObjectException e) {
+ // This can happen if logd restarts, so force getting a new connection
+ // to logd and try once more.
+ Slog.w(TAG, "Logd connection no longer valid while approving, trying once more.");
+ mLogdService = null;
+ getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd);
+ }
Integer activeCount = mActiveLogAccessCount.getOrDefault(client, 0);
mActiveLogAccessCount.put(client, activeCount + 1);
} catch (RemoteException e) {
@@ -527,7 +536,15 @@
Slog.d(TAG, "Declining log access: " + request);
}
try {
- getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd);
+ try {
+ getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd);
+ } catch (DeadObjectException e) {
+ // This can happen if logd restarts, so force getting a new connection
+ // to logd and try once more.
+ Slog.w(TAG, "Logd connection no longer valid while declining, trying once more.");
+ mLogdService = null;
+ getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd);
+ }
} catch (RemoteException e) {
Slog.e(TAG, "Fails to call remote functions", e);
}
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 1a6155b..a085b95 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -424,7 +424,7 @@
/**
* Performs a non-staged install of the given {@code apexFile}.
*/
- abstract void installPackage(File apexFile, PackageParser2 packageParser)
+ abstract void installPackage(File apexFile, PackageParser2 packageParser, boolean force)
throws PackageManagerException;
/**
@@ -1136,7 +1136,7 @@
}
@Override
- void installPackage(File apexFile, PackageParser2 packageParser)
+ void installPackage(File apexFile, PackageParser2 packageParser, boolean force)
throws PackageManagerException {
try {
final int flags = PackageManager.GET_META_DATA
@@ -1159,7 +1159,7 @@
}
checkApexSignature(existingApexPkg, newApexPkg);
ApexInfo apexInfo = waitForApexService().installAndActivatePackage(
- apexFile.getAbsolutePath());
+ apexFile.getAbsolutePath(), force);
final ParsedPackage parsedPackage2 = packageParser.parsePackage(
new File(apexInfo.modulePath), flags, /* useCaches= */ false);
final PackageInfo finalApexPkg = PackageInfoWithoutStateUtils.generate(
@@ -1505,7 +1505,7 @@
}
@Override
- void installPackage(File apexFile, PackageParser2 packageParser) {
+ void installPackage(File apexFile, PackageParser2 packageParser, boolean force) {
throw new UnsupportedOperationException("APEX updates are not supported");
}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 293f7e9..703ae11 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -872,8 +872,10 @@
"Expected exactly one .apex file under " + dir.getAbsolutePath()
+ " got: " + apexes.length);
}
+ boolean force = (request.mArgs.mInstallFlags
+ & PackageManager.INSTALL_FORCE_NON_STAGED_APEX_UPDATE) != 0;
try (PackageParser2 packageParser = mPm.mInjector.getScanningPackageParser()) {
- mApexManager.installPackage(apexes[0], packageParser);
+ mApexManager.installPackage(apexes[0], packageParser, force);
}
} catch (PackageManagerException e) {
request.mInstallResult.setError("APEX installation failed", e);
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index be842b9..38b79e5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -86,7 +86,6 @@
import android.os.ServiceSpecificException;
import android.os.ShellCommand;
import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
@@ -3053,6 +3052,13 @@
// Set package source to other by default
sessionParams.setPackageSource(PackageInstaller.PACKAGE_SOURCE_OTHER);
+ // Encodes one of the states:
+ // 1. Install request explicitly specified --staged, then value will be true.
+ // 2. Install request explicitly specified --non-staged, then value will be false.
+ // 3. Install request did not specify either --staged or --non-staged, then for APEX
+ // installs the value will be true, and for apk installs it will be false.
+ Boolean staged = null;
+
String opt;
boolean replaceExisting = true;
boolean forceNonStaged = false;
@@ -3151,7 +3157,6 @@
break;
case "--apex":
sessionParams.setInstallAsApex();
- sessionParams.setStaged();
break;
case "--force-non-staged":
forceNonStaged = true;
@@ -3160,7 +3165,10 @@
sessionParams.setMultiPackage();
break;
case "--staged":
- sessionParams.setStaged();
+ staged = true;
+ break;
+ case "--non-staged":
+ staged = false;
break;
case "--force-queryable":
sessionParams.setForceQueryable();
@@ -3192,11 +3200,17 @@
throw new IllegalArgumentException("Unknown option " + opt);
}
}
+ if (staged == null) {
+ staged = (sessionParams.installFlags & PackageManager.INSTALL_APEX) != 0;
+ }
if (replaceExisting) {
sessionParams.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
if (forceNonStaged) {
sessionParams.isStaged = false;
+ sessionParams.installFlags |= PackageManager.INSTALL_FORCE_NON_STAGED_APEX_UPDATE;
+ } else if (staged) {
+ sessionParams.setStaged();
}
return params;
}
@@ -3978,7 +3992,8 @@
pw.println(" [--preload] [--instant] [--full] [--dont-kill]");
pw.println(" [--enable-rollback]");
pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]");
- pw.println(" [--apex] [--force-non-staged] [--staged-ready-timeout TIMEOUT]");
+ pw.println(" [--apex] [--non-staged] [--force-non-staged]");
+ pw.println(" [--staged-ready-timeout TIMEOUT]");
pw.println(" [PATH [SPLIT...]|-]");
pw.println(" Install an application. Must provide the apk data to install, either as");
pw.println(" file path(s) or '-' to read from stdin. Options are:");
@@ -4006,6 +4021,9 @@
pw.println(" 3=device setup, 4=user request");
pw.println(" --force-uuid: force install on to disk volume with given UUID");
pw.println(" --apex: install an .apex file, not an .apk");
+ pw.println(" --non-staged: explicitly set this installation to be non-staged.");
+ pw.println(" This flag is only useful for APEX installs that are implicitly");
+ pw.println(" assumed to be staged.");
pw.println(" --force-non-staged: force the installation to run under a non-staged");
pw.println(" session, which may complete without requiring a reboot");
pw.println(" --staged-ready-timeout: By default, staged sessions wait "
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index c0e191f..5a941fe 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -80,6 +80,8 @@
// Append targetSdkVersion=n to existing seinfo label where n is the app's targetSdkVersion
private static final String TARGETSDKVERSION_STR = ":targetSdkVersion=";
+ private static final String PARTITION_STR = ":partition=";
+
/**
* Allows opt-in to the latest targetSdkVersion enforced changes without changing target SDK.
* Turning this change on for an app targeting the latest SDK or higher is a no-op.
@@ -370,6 +372,23 @@
return pkg.getTargetSdkVersion();
}
+ private static String getPartition(AndroidPackage pkg) {
+ if (pkg.isSystemExt()) {
+ return "system_ext";
+ } else if (pkg.isProduct()) {
+ return "product";
+ } else if (pkg.isVendor()) {
+ return "vendor";
+ } else if (pkg.isOem()) {
+ return "oem";
+ } else if (pkg.isOdm()) {
+ return "odm";
+ } else if (pkg.isSystem()) {
+ return "system";
+ }
+ return "";
+ }
+
/**
* Selects a security label to a package based on input parameters and the seinfo tag taken
* from a matched policy. All signature based policy stanzas are consulted and, if no match
@@ -433,6 +452,11 @@
seInfo += TARGETSDKVERSION_STR + targetSdkVersion;
+ String partition = getPartition(pkg);
+ if (!partition.isEmpty()) {
+ seInfo += PARTITION_STR + partition;
+ }
+
if (DEBUG_POLICY_INSTALL) {
Slog.i(TAG, "package (" + pkg.getPackageName() + ") labeled with "
+ "seinfo=" + seInfo);
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index 9ed5aa7..5221cfa 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -2116,6 +2116,12 @@
if (!isStorageOrMedia) {
continue;
}
+ boolean isSystemOrPolicyFixed = (getPermissionFlags(newPackage.getPackageName(),
+ permInfo.name, userId) & (FLAG_PERMISSION_SYSTEM_FIXED
+ | FLAG_PERMISSION_POLICY_FIXED)) != 0;
+ if (isSystemOrPolicyFixed) {
+ continue;
+ }
EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(),
"Revoking permission " + permInfo.name + " from package "
diff --git a/services/core/java/com/android/server/recoverysystem/OWNERS b/services/core/java/com/android/server/recoverysystem/OWNERS
index e3e7fdf..e098053 100644
--- a/services/core/java/com/android/server/recoverysystem/OWNERS
+++ b/services/core/java/com/android/server/recoverysystem/OWNERS
@@ -1,3 +1,2 @@
+aveena@google.com
ejyzhang@google.com
-rvrolyk@google.com
-xunchang@google.com
diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
index ca4a32f..099c9ae 100644
--- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
+++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
@@ -16,9 +16,6 @@
package com.android.server.vcn;
-import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
-import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
-import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED;
@@ -48,7 +45,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.vcn.util.PersistableBundleUtils;
import com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper;
import java.util.ArrayList;
@@ -109,6 +105,12 @@
@NonNull private TelephonySubscriptionSnapshot mCurrentSnapshot;
+ @NonNull
+ private final CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener =
+ (int logicalSlotIndex, int subscriptionId, int carrierId, int specificCarrierId) ->
+ handleActionCarrierConfigChanged(logicalSlotIndex, subscriptionId);
+
+
public TelephonySubscriptionTracker(
@NonNull Context context,
@NonNull Handler handler,
@@ -149,13 +151,14 @@
public void register() {
final HandlerExecutor executor = new HandlerExecutor(mHandler);
final IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
filter.addAction(ACTION_MULTI_SIM_CONFIG_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
mSubscriptionManager.addOnSubscriptionsChangedListener(
executor, mSubscriptionChangedListener);
mTelephonyManager.registerTelephonyCallback(executor, mActiveDataSubIdListener);
+ mCarrierConfigManager.registerCarrierConfigChangeListener(executor,
+ mCarrierConfigChangeListener);
registerCarrierPrivilegesCallbacks();
}
@@ -197,6 +200,7 @@
mContext.unregisterReceiver(this);
mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionChangedListener);
mTelephonyManager.unregisterTelephonyCallback(mActiveDataSubIdListener);
+ mCarrierConfigManager.unregisterCarrierConfigChangeListener(mCarrierConfigChangeListener);
unregisterCarrierPrivilegesCallbacks();
}
@@ -273,7 +277,7 @@
}
/**
- * Broadcast receiver for ACTION_CARRIER_CONFIG_CHANGED
+ * Broadcast receiver for ACTION_MULTI_SIM_CONFIG_CHANGED
*
* <p>The broadcast receiver is registered with mHandler, so callbacks & broadcasts are all
* serialized on mHandler, avoiding the need for locking.
@@ -281,9 +285,6 @@
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
- case ACTION_CARRIER_CONFIG_CHANGED:
- handleActionCarrierConfigChanged(context, intent);
- break;
case ACTION_MULTI_SIM_CONFIG_CHANGED:
handleActionMultiSimConfigChanged(context, intent);
break;
@@ -310,26 +311,21 @@
handleSubscriptionsChanged();
}
- private void handleActionCarrierConfigChanged(Context context, Intent intent) {
- // Accept sticky broadcasts; if CARRIER_CONFIG_CHANGED was previously broadcast and it
- // already was for an identified carrier, we can stop waiting for initial load to complete
- final int subId = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID);
- final int slotId = intent.getIntExtra(EXTRA_SLOT_INDEX, INVALID_SIM_SLOT_INDEX);
-
+ private void handleActionCarrierConfigChanged(int slotId, int subId) {
if (slotId == INVALID_SIM_SLOT_INDEX) {
return;
}
if (SubscriptionManager.isValidSubscriptionId(subId)) {
- final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
+ // Get only configs as needed to save memory.
+ final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId,
+ VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS);
if (mDeps.isConfigForIdentifiedCarrier(carrierConfig)) {
mReadySubIdsBySlotId.put(slotId, subId);
- final PersistableBundle minimized =
- PersistableBundleUtils.minimizeBundle(
- carrierConfig, VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS);
- if (minimized != null) {
- mSubIdToCarrierConfigMap.put(subId, new PersistableBundleWrapper(minimized));
+ if (!carrierConfig.isEmpty()) {
+ mSubIdToCarrierConfigMap.put(subId,
+ new PersistableBundleWrapper(carrierConfig));
}
handleSubscriptionsChanged();
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index d947168..15bc60c 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -1089,21 +1089,13 @@
}
final int otherWindowingMode = other.getWindowingMode();
- if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN) {
- if (isTranslucent(other, starting)) {
- // Can be visible behind a translucent fullscreen TaskFragment.
- gotTranslucentFullscreen = true;
- continue;
- }
- return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
- } else if (otherWindowingMode == WINDOWING_MODE_MULTI_WINDOW
- && other.matchParentBounds()) {
+ if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN
+ || (otherWindowingMode != WINDOWING_MODE_PINNED && other.matchParentBounds())) {
if (isTranslucent(other, starting)) {
// Can be visible behind a translucent TaskFragment.
gotTranslucentFullscreen = true;
continue;
}
- // Multi-window TaskFragment that matches parent bounds would occlude other children
return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index ab292ab..872e438 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -19,6 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
@@ -362,7 +363,7 @@
File apex = extractResource("test.apex_rebootless_v1", "test.rebootless_apex_v1.apex");
PackageManagerException e = expectThrows(PackageManagerException.class,
- () -> mApexManager.installPackage(apex, mPackageParser2));
+ () -> mApexManager.installPackage(apex, mPackageParser2, /* force= */ false));
assertThat(e).hasMessageThat().contains("It is forbidden to install new APEX packages");
}
@@ -378,10 +379,11 @@
File finalApex = extractResource("test.rebootles_apex_v2", "test.rebootless_apex_v2.apex");
ApexInfo newApexInfo = createApexInfo("test.apex_rebootless", 2, /* isActive= */ true,
/* isFactory= */ false, finalApex);
- when(mApexService.installAndActivatePackage(anyString())).thenReturn(newApexInfo);
+ when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenReturn(
+ newApexInfo);
File installedApex = extractResource("installed", "test.rebootless_apex_v2.apex");
- mApexManager.installPackage(installedApex, mPackageParser2);
+ mApexManager.installPackage(installedApex, mPackageParser2, /* force= */ false);
PackageInfo newInfo = mApexManager.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_ACTIVE_PACKAGE);
@@ -416,10 +418,11 @@
File finalApex = extractResource("test.rebootles_apex_v2", "test.rebootless_apex_v2.apex");
ApexInfo newApexInfo = createApexInfo("test.apex_rebootless", 2, /* isActive= */ true,
/* isFactory= */ false, finalApex);
- when(mApexService.installAndActivatePackage(anyString())).thenReturn(newApexInfo);
+ when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenReturn(
+ newApexInfo);
File installedApex = extractResource("installed", "test.rebootless_apex_v2.apex");
- mApexManager.installPackage(installedApex, mPackageParser2);
+ mApexManager.installPackage(installedApex, mPackageParser2, /* force= */ false);
PackageInfo newInfo = mApexManager.getPackageInfo("test.apex.rebootless",
ApexManager.MATCH_ACTIVE_PACKAGE);
@@ -447,13 +450,14 @@
mApexManager.scanApexPackagesTraced(mPackageParser2,
ParallelPackageParser.makeExecutorService());
- when(mApexService.installAndActivatePackage(anyString())).thenThrow(
+ when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenThrow(
new RuntimeException("install failed :("));
File installedApex = extractResource("test.apex_rebootless_v1",
"test.rebootless_apex_v1.apex");
assertThrows(PackageManagerException.class,
- () -> mApexManager.installPackage(installedApex, mPackageParser2));
+ () -> mApexManager.installPackage(installedApex, mPackageParser2, /* force= */
+ false));
}
@Test
@@ -468,7 +472,8 @@
File installedApex = extractResource("shim_different_certificate",
"com.android.apex.cts.shim.v2_different_certificate.apex");
PackageManagerException e = expectThrows(PackageManagerException.class,
- () -> mApexManager.installPackage(installedApex, mPackageParser2));
+ () -> mApexManager.installPackage(installedApex, mPackageParser2, /* force= */
+ false));
assertThat(e).hasMessageThat().contains("APK container signature of ");
assertThat(e).hasMessageThat().contains(
"is not compatible with currently installed on device");
@@ -486,7 +491,8 @@
File installedApex = extractResource("shim_unsigned_apk_container",
"com.android.apex.cts.shim.v2_unsigned_apk_container.apex");
PackageManagerException e = expectThrows(PackageManagerException.class,
- () -> mApexManager.installPackage(installedApex, mPackageParser2));
+ () -> mApexManager.installPackage(installedApex, mPackageParser2, /* force= */
+ false));
assertThat(e).hasMessageThat().contains("Failed to collect certificates from ");
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 63dbeeb..34a901c 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -244,7 +244,8 @@
/**
* Boolean indicating if the "Caller ID" item is visible in the Additional Settings menu.
* true means visible. false means gone.
- * @hide
+ *
+ * The default value is true.
*/
public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL =
"additional_settings_caller_id_visibility_bool";
@@ -252,7 +253,8 @@
/**
* Boolean indicating if the "Call Waiting" item is visible in the Additional Settings menu.
* true means visible. false means gone.
- * @hide
+ *
+ * The default value is true.
*/
public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL =
"additional_settings_call_waiting_visibility_bool";
@@ -9899,4 +9901,38 @@
}
trm.removeCarrierConfigChangedListener(listener);
}
+
+ /**
+ * Get subset of specified carrier configuration if available or empty bundle, without throwing
+ * {@link RuntimeException} to caller.
+ *
+ * <p>This is a system internally used only utility to reduce the repetitive logic.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}, or the calling app
+ * has carrier privileges on the specified subscription (see
+ * {@link TelephonyManager#hasCarrierPrivileges()}).
+ *
+ * @param context Context used to get the CarrierConfigManager service.
+ * @param subId The subscription ID to get the config from.
+ * @param keys The config keys the client is interested in.
+ * @return Config bundle with key/value for the specified keys or empty bundle when failed
+ * @hide
+ */
+ @RequiresPermission(anyOf = {
+ Manifest.permission.READ_PHONE_STATE,
+ "carrier privileges",
+ })
+ @NonNull
+ public static PersistableBundle getCarrierConfigSubset(
+ @NonNull Context context, int subId, @NonNull String... keys) {
+ PersistableBundle configs = null;
+ CarrierConfigManager ccm = context.getSystemService(CarrierConfigManager.class);
+ try {
+ configs = ccm.getConfigForSubId(subId, keys);
+ } catch (RuntimeException exception) {
+ Rlog.w(TAG, "CarrierConfigLoader is not available.");
+ }
+ return configs != null ? configs : new PersistableBundle();
+ }
}
diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java
index 212aaae..2c6d457 100644
--- a/telephony/java/android/telephony/PhysicalChannelConfig.java
+++ b/telephony/java/android/telephony/PhysicalChannelConfig.java
@@ -37,15 +37,26 @@
/**
* UE has connection to cell for signalling and possibly data (3GPP 36.331, 25.331).
+ *
+ * @deprecated Use {@link CellInfo#CONNECTION_PRIMARY_SERVING} instead.
*/
+ @Deprecated
public static final int CONNECTION_PRIMARY_SERVING = 1;
/**
* UE has connection to cell for data (3GPP 36.331, 25.331).
+ *
+ * @deprecated Use {@link CellInfo#CONNECTION_SECONDARY_SERVING} instead.
*/
+ @Deprecated
public static final int CONNECTION_SECONDARY_SERVING = 2;
- /** Connection status is unknown. */
+ /**
+ * Connection status is unknown.
+ *
+ * @deprecated Use {@link CellInfo#CONNECTION_UNKNOWN} instead.
+ */
+ @Deprecated
public static final int CONNECTION_UNKNOWN = -1;
/** Channel number is unknown. */
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 45c092e..96dc44a 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -174,7 +174,7 @@
/**
* Key to the backup & restore data byte array in the Bundle that is returned by {@link
* #getAllSimSpecificSettingsForBackup()} or to be pass in to {@link
- * #restoreAllSimSpecificSettings()}.
+ * #restoreAllSimSpecificSettingsFromBackup(byte[])}.
*
* @hide
*/
@@ -2218,46 +2218,46 @@
}
/**
- * Get an array of subscription ids for specified logical SIM slot Index.
+ * Get an array of subscription ids for the specified logical SIM slot Index. The maximum size
+ * of the array is 1. This API was mistakenly designed to return multiple subscription ids,
+ * which is not possible in the current Android telephony architecture.
*
* @param slotIndex The logical SIM slot index.
*
- * @return subscription Ids or {@code null} if the given slot index is not valid or there are
- * no active subscription in the slot. In the implementation today, there will be no more
- * than one subscriptions per logical SIM slot.
+ * @return Subscription id of the active subscription on the specified logical SIM slot index.
+ * If SIM is absent on the slot, a single element array of {@link #INVALID_SUBSCRIPTION_ID} will
+ * be returned. {@code null} if the provided {@code slotIndex} is not valid.
*
* @deprecated Use {@link #getSubscriptionId(int)} instead.
*/
@Deprecated
@Nullable
public int[] getSubscriptionIds(int slotIndex) {
- int subId = getSubscriptionId(slotIndex);
- if (!isValidSubscriptionId(subId)) {
+ if (!isValidSlotIndex(slotIndex)) {
return null;
}
return new int[]{getSubscriptionId(slotIndex)};
}
- /** @hide */
- @UnsupportedAppUsage
+ /**
+ * Get an array of subscription ids for the specified logical SIM slot Index. The maximum size
+ * of the array is 1. This API was mistakenly designed to return multiple subscription ids,
+ * which is not possible in the current Android telephony architecture.
+ *
+ * @param slotIndex The logical SIM slot index.
+ *
+ * @return Subscription id of the active subscription on the specified logical SIM slot index.
+ * If SIM is absent on the slot, a single element array of {@link #INVALID_SUBSCRIPTION_ID} will
+ * be returned. {@code null} if the provided {@code slotIndex} is not valid.
+ *
+ * @deprecated Use {@link #getSubscriptionId(int)} instead.
+ * @hide
+ */
public static int[] getSubId(int slotIndex) {
if (!isValidSlotIndex(slotIndex)) {
- logd("[getSubId]- fail");
return null;
}
-
- int[] subId = null;
-
- try {
- ISub iSub = TelephonyManager.getSubscriptionService();
- if (iSub != null) {
- subId = iSub.getSubIds(slotIndex);
- }
- } catch (RemoteException ex) {
- // ignore it
- }
-
- return subId;
+ return new int[]{getSubscriptionId(slotIndex)};
}
/**
@@ -3628,17 +3628,10 @@
}
/**
- * Enables or disables a subscription. This is currently used in the settings page. It will
- * fail and return false if operation is not supported or failed.
+ * Enable or disable a subscription. This method is same as
+ * {@link #setUiccApplicationsEnabled(int, boolean)}.
*
- * To disable an active subscription on a physical (non-Euicc) SIM,
- * {@link #canDisablePhysicalSubscription} needs to be true.
- *
- * <p>
- * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required
- *
- * @param subscriptionId Subscription to be enabled or disabled. It could be a eSIM or pSIM
- * subscription.
+ * @param subscriptionId Subscription to be enabled or disabled.
* @param enable whether user is turning it on or off.
*
* @return whether the operation is successful.
@@ -3648,19 +3641,15 @@
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public boolean setSubscriptionEnabled(int subscriptionId, boolean enable) {
- if (VDBG) {
- logd("setSubscriptionActivated subId= " + subscriptionId + " enable " + enable);
- }
try {
ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
- return iSub.setSubscriptionEnabled(enable, subscriptionId);
+ iSub.setUiccApplicationsEnabled(enable, subscriptionId);
}
} catch (RemoteException ex) {
- // ignore it
+ return false;
}
-
- return false;
+ return true;
}
/**
@@ -3683,11 +3672,7 @@
logd("setUiccApplicationsEnabled subId= " + subscriptionId + " enable " + enabled);
}
try {
- ISub iSub = ISub.Stub.asInterface(
- TelephonyFrameworkInitializer
- .getTelephonyServiceManager()
- .getSubscriptionServiceRegisterer()
- .get());
+ ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
iSub.setUiccApplicationsEnabled(enabled, subscriptionId);
}
@@ -3715,11 +3700,7 @@
logd("canDisablePhysicalSubscription");
}
try {
- ISub iSub = ISub.Stub.asInterface(
- TelephonyFrameworkInitializer
- .getTelephonyServiceManager()
- .getSubscriptionServiceRegisterer()
- .get());
+ ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
return iSub.canDisablePhysicalSubscription();
}
@@ -3843,10 +3824,15 @@
}
/**
- * DO NOT USE.
- * This API is designed for features that are not finished at this point. Do not call this API.
+ * Get the active subscription id by logical SIM slot index.
+ *
+ * @param slotIndex The logical SIM slot index.
+ * @return The active subscription id.
+ *
+ * @throws IllegalArgumentException if the provided slot index is invalid.
+ * @throws SecurityException if callers do not hold the required permission.
+ *
* @hide
- * TODO b/135547512: further clean up
*/
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
@@ -4027,39 +4013,16 @@
}
/**
- * Called to attempt to restore the backed up sim-specific configs to device for specific sim.
- * This will try to restore the data that was stored internally when {@link
- * #restoreAllSimSpecificSettingsFromBackup(byte[] data)} was called during setup wizard.
- * End result is SimInfoDB is modified to match any backed up configs for the requested
- * inserted sim.
- *
- * <p>
- * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB
- * entry is updated as the result of this method call.
- *
- * @param iccId of the sim that a restore is requested for.
- *
- * @hide
- */
- @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
- public void restoreSimSpecificSettingsForIccIdFromBackup(@NonNull String iccId) {
- mContext.getContentResolver().call(
- SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
- RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
- iccId, null);
- }
-
- /**
* Called during setup wizard restore flow to attempt to restore the backed up sim-specific
- * configs to device for all existing SIMs in SimInfoDB. Internally, it will store the backup
- * data in an internal file. This file will persist on device for device's lifetime and will be
- * used later on when a SIM is inserted to restore that specific SIM's settings by calling
- * {@link #restoreSimSpecificSettingsForIccIdFromBackup(String iccId)}. End result is
- * SimInfoDB is modified to match any backed up configs for the appropriate inserted SIMs.
+ * configs to device for all existing SIMs in the subscription database {@link SimInfo}.
+ * Internally, it will store the backup data in an internal file. This file will persist on
+ * device for device's lifetime and will be used later on when a SIM is inserted to restore that
+ * specific SIM's settings. End result is subscription database is modified to match any backed
+ * up configs for the appropriate inserted SIMs.
*
* <p>
- * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any SimInfoDB
- * entry is updated as the result of this method call.
+ * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any
+ * {@link SimInfo} entry is updated as the result of this method call.
*
* @param data with the sim specific configs to be backed up.
*
@@ -4068,12 +4031,18 @@
@SystemApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void restoreAllSimSpecificSettingsFromBackup(@NonNull byte[] data) {
- Bundle bundle = new Bundle();
- bundle.putByteArray(KEY_SIM_SPECIFIC_SETTINGS_DATA, data);
- mContext.getContentResolver().call(
- SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI,
- RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
- null, bundle);
+ try {
+ ISub iSub = TelephonyManager.getSubscriptionService();
+ if (iSub != null) {
+ iSub.restoreAllSimSpecificSettingsFromBackup(data);
+ } else {
+ throw new IllegalStateException("subscription service unavailable.");
+ }
+ } catch (RemoteException ex) {
+ if (!isSystemProcess()) {
+ ex.rethrowAsRuntimeException();
+ }
+ }
}
/**
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index defa046..6a5380d 100644
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -236,8 +236,6 @@
int getSlotIndex(int subId);
- int[] getSubIds(int slotIndex);
-
int getSubId(int slotIndex);
int getDefaultSubId();
@@ -267,8 +265,6 @@
String getSubscriptionProperty(int subId, String propKey, String callingPackage,
String callingFeatureId);
- boolean setSubscriptionEnabled(boolean enable, int subId);
-
boolean isSubscriptionEnabled(int subId);
int getEnabledSubscriptionId(int slotIndex);
@@ -279,7 +275,7 @@
boolean canDisablePhysicalSubscription();
- int setUiccApplicationsEnabled(boolean enabled, int subscriptionId);
+ void setUiccApplicationsEnabled(boolean enabled, int subscriptionId);
int setDeviceToDeviceStatusSharing(int sharing, int subId);
@@ -363,4 +359,20 @@
*/
//TODO: Removed before U AOSP public release.
boolean isSubscriptionManagerServiceEnabled();
+
+ /**
+ * Called during setup wizard restore flow to attempt to restore the backed up sim-specific
+ * configs to device for all existing SIMs in the subscription database
+ * {@link Telephony.SimInfo}. Internally, it will store the backup data in an internal file.
+ * This file will persist on device for device's lifetime and will be used later on when a SIM
+ * is inserted to restore that specific SIM's settings. End result is subscription database is
+ * modified to match any backed up configs for the appropriate inserted SIMs.
+ *
+ * <p>
+ * The {@link Uri} {@link #SIM_INFO_BACKUP_AND_RESTORE_CONTENT_URI} is notified if any
+ * {@link Telephony.SimInfo} entry is updated as the result of this method call.
+ *
+ * @param data with the sim specific configs to be backed up.
+ */
+ void restoreAllSimSpecificSettingsFromBackup(in byte[] data);
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index ecafe70..9d05517 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1791,6 +1791,22 @@
String gid2, String plmn, String spn, String carrierPrivilegeRules, String apn);
/**
+ * Forcibly sets a package as a carrier provisioning package.
+ *
+ * This override is ephemeral, and will disappear upon phone process restart (including
+ * device reboot).
+ *
+ * WARNING: This API is meant for testing purposes only. This enables automated testing for
+ * cases where the carrier service package is used as a permissioning gate for features such as
+ * restricted carrier network access (restricted APNs and Merged Carrier Wifi)
+ *
+ * @param carrierServicePackage The package that should be marked as the carrier service
+ * package, or {@code null} to disable the override.
+ */
+ void setCarrierServicePackageOverride(int subId, String carrierServicePackage,
+ String callingPackage);
+
+ /**
* A test API to return installed carrier id list version.
*/
int getCarrierIdListVersion(int subId);
diff --git a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
index 965b073..34f884b 100644
--- a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
@@ -19,9 +19,6 @@
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.vcn.VcnManager.VCN_RESTRICTED_TRANSPORTS_INT_ARRAY_KEY;
-import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
-import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
-import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener;
@@ -143,6 +140,8 @@
@NonNull private TelephonySubscriptionTrackerCallback mCallback;
@NonNull private TelephonySubscriptionTracker mTelephonySubscriptionTracker;
+ @NonNull private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;
+
public TelephonySubscriptionTrackerTest() {
mContext = mock(Context.class);
mTestLooper = new TestLooper();
@@ -173,7 +172,7 @@
.getSystemService(Context.CARRIER_CONFIG_SERVICE);
doReturn(TEST_CARRIER_CONFIG)
.when(mCarrierConfigManager)
- .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1));
+ .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1), any());
// subId 1, 2 are in same subGrp, only subId 1 is active
doReturn(TEST_PARCEL_UUID).when(TEST_SUBINFO_1).getGroupUuid();
@@ -189,9 +188,15 @@
doReturn(2).when(mTelephonyManager).getActiveModemCount();
mCallback = mock(TelephonySubscriptionTrackerCallback.class);
+ // Capture CarrierConfigChangeListener to emulate the carrier config change notification
+ ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
+ ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
mTelephonySubscriptionTracker =
new TelephonySubscriptionTracker(mContext, mHandler, mCallback, mDeps);
mTelephonySubscriptionTracker.register();
+ verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
+ listenerArgumentCaptor.capture());
+ mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);
doReturn(true).when(mDeps).isConfigForIdentifiedCarrier(any());
doReturn(Arrays.asList(TEST_SUBINFO_1, TEST_SUBINFO_2))
@@ -239,14 +244,11 @@
return intent;
}
- private Intent buildTestBroadcastIntent(boolean hasValidSubscription) {
- Intent intent = new Intent(ACTION_CARRIER_CONFIG_CHANGED);
- intent.putExtra(EXTRA_SLOT_INDEX, TEST_SIM_SLOT_INDEX);
- intent.putExtra(
- EXTRA_SUBSCRIPTION_INDEX,
- hasValidSubscription ? TEST_SUBSCRIPTION_ID_1 : INVALID_SUBSCRIPTION_ID);
-
- return intent;
+ private void sendCarrierConfigChange(boolean hasValidSubscription) {
+ mCarrierConfigChangeListener.onCarrierConfigChanged(
+ TEST_SIM_SLOT_INDEX,
+ hasValidSubscription ? TEST_SUBSCRIPTION_ID_1 : INVALID_SUBSCRIPTION_ID,
+ TelephonyManager.UNKNOWN_CARRIER_ID, TelephonyManager.UNKNOWN_CARRIER_ID);
}
private TelephonySubscriptionSnapshot buildExpectedSnapshot(
@@ -302,14 +304,15 @@
any(),
eq(mHandler));
final IntentFilter filter = getIntentFilter();
- assertEquals(2, filter.countActions());
- assertTrue(filter.hasAction(ACTION_CARRIER_CONFIG_CHANGED));
+ assertEquals(1, filter.countActions());
assertTrue(filter.hasAction(ACTION_MULTI_SIM_CONFIG_CHANGED));
verify(mSubscriptionManager)
.addOnSubscriptionsChangedListener(any(HandlerExecutor.class), any());
assertNotNull(getOnSubscriptionsChangedListener());
+ verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(), any());
+
verify(mTelephonyManager, times(2))
.registerCarrierPrivilegesCallback(anyInt(), any(HandlerExecutor.class), any());
verify(mTelephonyManager)
@@ -442,7 +445,7 @@
@Test
public void testReceiveBroadcast_ConfigReadyWithSubscriptions() throws Exception {
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
@@ -454,7 +457,7 @@
.when(mSubscriptionManager)
.getAllSubscriptionInfoList();
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
// Expect an empty snapshot
@@ -465,7 +468,7 @@
public void testReceiveBroadcast_SlotCleared() throws Exception {
setupReadySubIds();
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(false));
+ sendCarrierConfigChange(false /* hasValidSubscription */);
mTestLooper.dispatchAll();
verifyNoActiveSubscriptions();
@@ -476,7 +479,7 @@
public void testReceiveBroadcast_ConfigNotReady() throws Exception {
doReturn(false).when(mDeps).isConfigForIdentifiedCarrier(any());
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
// No interactions expected; config was not loaded
@@ -485,21 +488,21 @@
@Test
public void testSubscriptionsClearedAfterValidTriggersCallbacks() throws Exception {
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
assertNotNull(
mTelephonySubscriptionTracker.getReadySubIdsBySlotId().get(TEST_SIM_SLOT_INDEX));
doReturn(Collections.emptyList()).when(mSubscriptionManager).getAllSubscriptionInfoList();
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(emptyMap(), emptyMap())));
}
@Test
public void testCarrierConfigUpdatedAfterValidTriggersCallbacks() throws Exception {
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
reset(mCallback);
@@ -510,12 +513,12 @@
new int[] {TRANSPORT_WIFI, TRANSPORT_CELLULAR});
doReturn(updatedConfig)
.when(mCarrierConfigManager)
- .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1));
+ .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1), any());
Map<Integer, PersistableBundleWrapper> subIdToCarrierConfigMap = new HashMap<>();
subIdToCarrierConfigMap.put(
TEST_SUBSCRIPTION_ID_1, new PersistableBundleWrapper(updatedConfig));
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback)
@@ -530,13 +533,13 @@
@Test
public void testSlotClearedAfterValidTriggersCallbacks() throws Exception {
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ sendCarrierConfigChange(true /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
assertNotNull(
mTelephonySubscriptionTracker.getReadySubIdsBySlotId().get(TEST_SIM_SLOT_INDEX));
- mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(false));
+ sendCarrierConfigChange(false /* hasValidSubscription */);
mTestLooper.dispatchAll();
verify(mCallback)
.onNewSnapshot(
diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp
index 5402657..ec9d42a 100644
--- a/tools/split-select/Android.bp
+++ b/tools/split-select/Android.bp
@@ -57,9 +57,6 @@
// This tool is prebuilt if we're doing an app-only build.
product_variables: {
- pdk: {
- enabled: false,
- },
unbundled_build: {
enabled: false,
},