Merge "Add dialog for recommended controls" into rvc-dev
diff --git a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
index cdcd6598..e2e1180 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
+++ b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
@@ -1,6 +1,13 @@
{
"presubmit": [
{
+ "name": "CtsJobSchedulerTestCases",
+ "options": [
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "androidx.test.filters.LargeTest"}
+ ]
+ },
+ {
"name": "FrameworksMockingServicesTests",
"options": [
{"include-filter": "com.android.server.job"},
diff --git a/apex/statsd/aidl/android/os/IStatsManagerService.aidl b/apex/statsd/aidl/android/os/IStatsManagerService.aidl
index 4a259f5..b59a97e 100644
--- a/apex/statsd/aidl/android/os/IStatsManagerService.aidl
+++ b/apex/statsd/aidl/android/os/IStatsManagerService.aidl
@@ -128,7 +128,7 @@
void removeConfiguration(in long configId, in String packageName);
/** Tell StatsManagerService to register a puller for the given atom tag with statsd. */
- oneway void registerPullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
+ oneway void registerPullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis,
in int[] additiveFields, IPullAtomCallback pullerCallback);
/** Tell StatsManagerService to unregister the pulller for the given atom tag from statsd. */
diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl
index 10b1e5b..c8aec53 100644
--- a/apex/statsd/aidl/android/os/IStatsd.aidl
+++ b/apex/statsd/aidl/android/os/IStatsd.aidl
@@ -186,8 +186,9 @@
* Registers a puller callback function that, when invoked, pulls the data
* for the specified atom tag.
*/
- oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownNs, long timeoutNs,
- in int[] additiveFields, IPullAtomCallback pullerCallback);
+ oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownMillis,
+ long timeoutMillis,in int[] additiveFields,
+ IPullAtomCallback pullerCallback);
/**
* Registers a puller callback function that, when invoked, pulls the data
diff --git a/apex/statsd/framework/java/android/app/StatsManager.java b/apex/statsd/framework/java/android/app/StatsManager.java
index e637187..f021dcf 100644
--- a/apex/statsd/framework/java/android/app/StatsManager.java
+++ b/apex/statsd/framework/java/android/app/StatsManager.java
@@ -119,14 +119,12 @@
/**
* @hide
**/
- @VisibleForTesting
- public static final long DEFAULT_COOL_DOWN_NS = 1_000_000_000L; // 1 second.
+ @VisibleForTesting public static final long DEFAULT_COOL_DOWN_MILLIS = 1_000L; // 1 second.
/**
* @hide
**/
- @VisibleForTesting
- public static final long DEFAULT_TIMEOUT_NS = 10_000_000_000L; // 10 seconds.
+ @VisibleForTesting public static final long DEFAULT_TIMEOUT_MILLIS = 10_000L; // 10 seconds.
/**
* Constructor for StatsManagerClient.
@@ -489,23 +487,24 @@
}
/**
- * Registers a callback for an atom when that atom is to be pulled. The stats service will
+ * Sets a callback for an atom when that atom is to be pulled. The stats service will
* invoke pullData in the callback when the stats service determines that this atom needs to be
* pulled. This method should not be called by third-party apps.
*
* @param atomTag The tag of the atom for this puller callback.
* @param metadata Optional metadata specifying the timeout, cool down time, and
* additive fields for mapping isolated to host uids.
- * @param callback The callback to be invoked when the stats service pulls the atom.
* @param executor The executor in which to run the callback.
+ * @param callback The callback to be invoked when the stats service pulls the atom.
*
*/
@RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM)
- public void registerPullAtomCallback(int atomTag, @Nullable PullAtomMetadata metadata,
+ public void setPullAtomCallback(int atomTag, @Nullable PullAtomMetadata metadata,
@NonNull @CallbackExecutor Executor executor,
@NonNull StatsPullAtomCallback callback) {
- long coolDownNs = metadata == null ? DEFAULT_COOL_DOWN_NS : metadata.mCoolDownNs;
- long timeoutNs = metadata == null ? DEFAULT_TIMEOUT_NS : metadata.mTimeoutNs;
+ long coolDownMillis =
+ metadata == null ? DEFAULT_COOL_DOWN_MILLIS : metadata.mCoolDownMillis;
+ long timeoutMillis = metadata == null ? DEFAULT_TIMEOUT_MILLIS : metadata.mTimeoutMillis;
int[] additiveFields = metadata == null ? new int[0] : metadata.mAdditiveFields;
if (additiveFields == null) {
additiveFields = new int[0];
@@ -516,8 +515,8 @@
IStatsManagerService service = getIStatsManagerServiceLocked();
PullAtomCallbackInternal rec =
new PullAtomCallbackInternal(atomTag, callback, executor);
- service.registerPullAtomCallback(atomTag, coolDownNs, timeoutNs, additiveFields,
- rec);
+ service.registerPullAtomCallback(
+ atomTag, coolDownMillis, timeoutMillis, additiveFields, rec);
} catch (RemoteException e) {
throw new RuntimeException("Unable to register pull callback", e);
}
@@ -525,14 +524,14 @@
}
/**
- * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing
+ * Clears a callback for an atom when that atom is to be pulled. Note that any ongoing
* pulls will still occur. This method should not be called by third-party apps.
*
* @param atomTag The tag of the atom of which to unregister
*
*/
@RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM)
- public void unregisterPullAtomCallback(int atomTag) {
+ public void clearPullAtomCallback(int atomTag) {
synchronized (sLock) {
try {
IStatsManagerService service = getIStatsManagerServiceLocked();
@@ -585,14 +584,14 @@
*
*/
public static class PullAtomMetadata {
- private final long mCoolDownNs;
- private final long mTimeoutNs;
+ private final long mCoolDownMillis;
+ private final long mTimeoutMillis;
private final int[] mAdditiveFields;
// Private Constructor for builder
- private PullAtomMetadata(long coolDownNs, long timeoutNs, int[] additiveFields) {
- mCoolDownNs = coolDownNs;
- mTimeoutNs = timeoutNs;
+ private PullAtomMetadata(long coolDownMillis, long timeoutMillis, int[] additiveFields) {
+ mCoolDownMillis = coolDownMillis;
+ mTimeoutMillis = timeoutMillis;
mAdditiveFields = additiveFields;
}
@@ -600,8 +599,8 @@
* Builder for PullAtomMetadata.
*/
public static class Builder {
- private long mCoolDownNs;
- private long mTimeoutNs;
+ private long mCoolDownMillis;
+ private long mTimeoutMillis;
private int[] mAdditiveFields;
/**
@@ -609,27 +608,28 @@
* StatsManager#registerPullAtomCallback
*/
public Builder() {
- mCoolDownNs = DEFAULT_COOL_DOWN_NS;
- mTimeoutNs = DEFAULT_TIMEOUT_NS;
+ mCoolDownMillis = DEFAULT_COOL_DOWN_MILLIS;
+ mTimeoutMillis = DEFAULT_TIMEOUT_MILLIS;
mAdditiveFields = null;
}
/**
- * Set the cool down time of the pull in nanoseconds. If two successive pulls are issued
- * within the cool down, a cached version of the first will be used for the second.
+ * Set the cool down time of the pull in milliseconds. If two successive pulls are
+ * issued within the cool down, a cached version of the first pull will be used for the
+ * second pull.
*/
@NonNull
- public Builder setCoolDownNs(long coolDownNs) {
- mCoolDownNs = coolDownNs;
+ public Builder setCoolDownMillis(long coolDownMillis) {
+ mCoolDownMillis = coolDownMillis;
return this;
}
/**
- * Set the maximum time the pull can take in nanoseconds.
+ * Set the maximum time the pull can take in milliseconds.
*/
@NonNull
- public Builder setTimeoutNs(long timeoutNs) {
- mTimeoutNs = timeoutNs;
+ public Builder setTimeoutMillis(long timeoutMillis) {
+ mTimeoutMillis = timeoutMillis;
return this;
}
@@ -652,30 +652,32 @@
*/
@NonNull
public PullAtomMetadata build() {
- return new PullAtomMetadata(mCoolDownNs, mTimeoutNs, mAdditiveFields);
+ return new PullAtomMetadata(mCoolDownMillis, mTimeoutMillis, mAdditiveFields);
}
}
/**
- * @hide
+ * Return the cool down time of this pull in milliseconds.
*/
- @VisibleForTesting
- public long getCoolDownNs() {
- return mCoolDownNs;
+ public long getCoolDownMillis() {
+ return mCoolDownMillis;
}
/**
- * @hide
+ * Return the maximum amount of time this pull can take in milliseconds.
*/
- @VisibleForTesting
- public long getTimeoutNs() {
- return mTimeoutNs;
+ public long getTimeoutMillis() {
+ return mTimeoutMillis;
}
/**
- * @hide
+ * Return the additive fields of this pulled atom.
+ *
+ * This is only applicable for atoms that have a uid field. When tasks are run in
+ * isolated processes, the data will be attributed to the host uid. Additive fields
+ * will be combined when the non-additive fields are the same.
*/
- @VisibleForTesting
+ @Nullable
public int[] getAdditiveFields() {
return mAdditiveFields;
}
diff --git a/apex/statsd/framework/test/src/android/app/PullAtomMetadataTest.java b/apex/statsd/framework/test/src/android/app/PullAtomMetadataTest.java
index 0ae6134..fd386bd 100644
--- a/apex/statsd/framework/test/src/android/app/PullAtomMetadataTest.java
+++ b/apex/statsd/framework/test/src/android/app/PullAtomMetadataTest.java
@@ -33,28 +33,28 @@
@Test
public void testEmpty() {
PullAtomMetadata metadata = new PullAtomMetadata.Builder().build();
- assertThat(metadata.getTimeoutNs()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_NS);
- assertThat(metadata.getCoolDownNs()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_NS);
+ assertThat(metadata.getTimeoutMillis()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_MILLIS);
+ assertThat(metadata.getCoolDownMillis()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_MILLIS);
assertThat(metadata.getAdditiveFields()).isNull();
}
@Test
- public void testSetTimeoutNs() {
- long timeoutNs = 500_000_000L;
+ public void testSetTimeoutMillis() {
+ long timeoutMillis = 500L;
PullAtomMetadata metadata =
- new PullAtomMetadata.Builder().setTimeoutNs(timeoutNs).build();
- assertThat(metadata.getTimeoutNs()).isEqualTo(timeoutNs);
- assertThat(metadata.getCoolDownNs()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_NS);
+ new PullAtomMetadata.Builder().setTimeoutMillis(timeoutMillis).build();
+ assertThat(metadata.getTimeoutMillis()).isEqualTo(timeoutMillis);
+ assertThat(metadata.getCoolDownMillis()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_MILLIS);
assertThat(metadata.getAdditiveFields()).isNull();
}
@Test
- public void testSetCoolDownNs() {
- long coolDownNs = 10_000_000_000L;
+ public void testSetCoolDownMillis() {
+ long coolDownMillis = 10_000L;
PullAtomMetadata metadata =
- new PullAtomMetadata.Builder().setCoolDownNs(coolDownNs).build();
- assertThat(metadata.getTimeoutNs()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_NS);
- assertThat(metadata.getCoolDownNs()).isEqualTo(coolDownNs);
+ new PullAtomMetadata.Builder().setCoolDownMillis(coolDownMillis).build();
+ assertThat(metadata.getTimeoutMillis()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_MILLIS);
+ assertThat(metadata.getCoolDownMillis()).isEqualTo(coolDownMillis);
assertThat(metadata.getAdditiveFields()).isNull();
}
@@ -63,23 +63,23 @@
int[] fields = {2, 4, 6};
PullAtomMetadata metadata =
new PullAtomMetadata.Builder().setAdditiveFields(fields).build();
- assertThat(metadata.getTimeoutNs()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_NS);
- assertThat(metadata.getCoolDownNs()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_NS);
+ assertThat(metadata.getTimeoutMillis()).isEqualTo(StatsManager.DEFAULT_TIMEOUT_MILLIS);
+ assertThat(metadata.getCoolDownMillis()).isEqualTo(StatsManager.DEFAULT_COOL_DOWN_MILLIS);
assertThat(metadata.getAdditiveFields()).isEqualTo(fields);
}
@Test
public void testSetAllElements() {
- long timeoutNs = 300L;
- long coolDownNs = 9572L;
+ long timeoutMillis = 300L;
+ long coolDownMillis = 9572L;
int[] fields = {3, 2};
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setTimeoutNs(timeoutNs)
- .setCoolDownNs(coolDownNs)
+ .setTimeoutMillis(timeoutMillis)
+ .setCoolDownMillis(coolDownMillis)
.setAdditiveFields(fields)
.build();
- assertThat(metadata.getTimeoutNs()).isEqualTo(timeoutNs);
- assertThat(metadata.getCoolDownNs()).isEqualTo(coolDownNs);
+ assertThat(metadata.getTimeoutMillis()).isEqualTo(timeoutMillis);
+ assertThat(metadata.getCoolDownMillis()).isEqualTo(coolDownMillis);
assertThat(metadata.getAdditiveFields()).isEqualTo(fields);
}
}
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
index 4e4bc40..58c78da 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java
@@ -136,25 +136,25 @@
}
private static class PullerValue {
- private final long mCoolDownNs;
- private final long mTimeoutNs;
+ private final long mCoolDownMillis;
+ private final long mTimeoutMillis;
private final int[] mAdditiveFields;
private final IPullAtomCallback mCallback;
- PullerValue(long coolDownNs, long timeoutNs, int[] additiveFields,
+ PullerValue(long coolDownMillis, long timeoutMillis, int[] additiveFields,
IPullAtomCallback callback) {
- mCoolDownNs = coolDownNs;
- mTimeoutNs = timeoutNs;
+ mCoolDownMillis = coolDownMillis;
+ mTimeoutMillis = timeoutMillis;
mAdditiveFields = additiveFields;
mCallback = callback;
}
- public long getCoolDownNs() {
- return mCoolDownNs;
+ public long getCoolDownMillis() {
+ return mCoolDownMillis;
}
- public long getTimeoutNs() {
- return mTimeoutNs;
+ public long getTimeoutMillis() {
+ return mTimeoutMillis;
}
public int[] getAdditiveFields() {
@@ -169,12 +169,13 @@
private final ArrayMap<PullerKey, PullerValue> mPullers = new ArrayMap<>();
@Override
- public void registerPullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
+ public void registerPullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis,
int[] additiveFields, IPullAtomCallback pullerCallback) {
enforceRegisterStatsPullAtomPermission();
int callingUid = Binder.getCallingUid();
PullerKey key = new PullerKey(callingUid, atomTag);
- PullerValue val = new PullerValue(coolDownNs, timeoutNs, additiveFields, pullerCallback);
+ PullerValue val =
+ new PullerValue(coolDownMillis, timeoutMillis, additiveFields, pullerCallback);
// Always cache the puller in StatsManagerService. If statsd is down, we will register the
// puller when statsd comes back up.
@@ -189,8 +190,8 @@
final long token = Binder.clearCallingIdentity();
try {
- statsd.registerPullAtomCallback(
- callingUid, atomTag, coolDownNs, timeoutNs, additiveFields, pullerCallback);
+ statsd.registerPullAtomCallback(callingUid, atomTag, coolDownMillis, timeoutMillis,
+ additiveFields, pullerCallback);
} catch (RemoteException e) {
Log.e(TAG, "Failed to access statsd to register puller for atom " + atomTag);
} finally {
@@ -596,8 +597,8 @@
for (Map.Entry<PullerKey, PullerValue> entry : pullersCopy.entrySet()) {
PullerKey key = entry.getKey();
PullerValue value = entry.getValue();
- statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownNs(),
- value.getTimeoutNs(), value.getAdditiveFields(), value.getCallback());
+ statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownMillis(),
+ value.getTimeoutMillis(), value.getAdditiveFields(), value.getCallback());
}
}
diff --git a/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp b/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
index eb97f65..9e5aa95 100644
--- a/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
+++ b/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include <android/binder_process.h>
#include <jni.h>
#include <log/log.h>
#include <stats_event.h>
@@ -32,17 +31,6 @@
static int32_t sAtomsPerPull;
static int32_t sNumPulls = 0;
-static bool initialized = false;
-
-static void init() {
- if (!initialized) {
- initialized = true;
- // Set up the binder
- ABinderProcess_setThreadPoolMaxThreadCount(9);
- ABinderProcess_startThreadPool();
- }
-}
-
static AStatsManager_PullAtomCallbackReturn pullAtomCallback(int32_t atomTag, AStatsEventList* data,
void* /*cookie*/) {
sNumPulls++;
@@ -62,7 +50,6 @@
JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutNs, jlong coolDownNs,
jint pullRetVal, jlong latencyMillis, int atomsPerPull)
{
- init();
sAtomTag = atomTag;
sPullReturnVal = pullRetVal;
sLatencyMillis = latencyMillis;
diff --git a/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java b/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
index e119b4c..d4e51e0 100644
--- a/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
+++ b/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
@@ -229,7 +229,7 @@
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- statsManager.unregisterPullAtomCallback(PULL_ATOM_TAG);
+ unregisterStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(sAtomsPerPull);
for (int i = 0; i < data.size(); i++) {
diff --git a/api/current.txt b/api/current.txt
index d4cbe6d..4b2b8d3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -43552,9 +43552,9 @@
public abstract class ControlAction {
method public abstract int getActionType();
method @Nullable public String getChallengeValue();
+ method @NonNull public static android.service.controls.actions.ControlAction getErrorAction();
method @NonNull public String getTemplateId();
method public static final boolean isValidResponse(int);
- field @NonNull public static final android.service.controls.actions.ControlAction ERROR_ACTION;
field public static final int RESPONSE_CHALLENGE_ACK = 3; // 0x3
field public static final int RESPONSE_CHALLENGE_PASSPHRASE = 5; // 0x5
field public static final int RESPONSE_CHALLENGE_PIN = 4; // 0x4
@@ -43566,7 +43566,6 @@
field public static final int TYPE_ERROR = -1; // 0xffffffff
field public static final int TYPE_FLOAT = 2; // 0x2
field public static final int TYPE_MODE = 4; // 0x4
- field public static final int TYPE_MULTI_FLOAT = 3; // 0x3
}
public final class FloatAction extends android.service.controls.actions.ControlAction {
@@ -43583,13 +43582,6 @@
method public int getNewMode();
}
- public final class MultiFloatAction extends android.service.controls.actions.ControlAction {
- ctor public MultiFloatAction(@NonNull String, @NonNull float[], @Nullable String);
- ctor public MultiFloatAction(@NonNull String, @NonNull float[]);
- method public int getActionType();
- method @NonNull public float[] getNewValues();
- }
-
}
package android.service.controls.templates {
@@ -43604,16 +43596,15 @@
}
public abstract class ControlTemplate {
+ method @NonNull public static android.service.controls.templates.ControlTemplate getErrorTemplate();
+ method @NonNull public static android.service.controls.templates.ControlTemplate getNoTemplateObject();
method @NonNull public String getTemplateId();
method public abstract int getTemplateType();
- field @NonNull public static final android.service.controls.templates.ControlTemplate ERROR_TEMPLATE;
- field @NonNull public static final android.service.controls.templates.ControlTemplate NO_TEMPLATE;
field public static final int TYPE_ERROR = -1; // 0xffffffff
- field public static final int TYPE_NONE = 0; // 0x0
+ field public static final int TYPE_NO_TEMPLATE = 0; // 0x0
field public static final int TYPE_RANGE = 2; // 0x2
field public static final int TYPE_STATELESS = 8; // 0x8
field public static final int TYPE_TEMPERATURE = 7; // 0x7
- field public static final int TYPE_THUMBNAIL = 3; // 0x3
field public static final int TYPE_TOGGLE = 1; // 0x1
field public static final int TYPE_TOGGLE_RANGE = 6; // 0x6
}
@@ -43653,13 +43644,6 @@
field public static final int MODE_UNKNOWN = 0; // 0x0
}
- public final class ThumbnailTemplate extends android.service.controls.templates.ControlTemplate {
- ctor public ThumbnailTemplate(@NonNull String, @NonNull android.graphics.drawable.Icon, @NonNull CharSequence);
- method @NonNull public CharSequence getContentDescription();
- method public int getTemplateType();
- method @NonNull public android.graphics.drawable.Icon getThumbnail();
- }
-
public final class ToggleRangeTemplate extends android.service.controls.templates.ControlTemplate {
ctor public ToggleRangeTemplate(@NonNull String, @NonNull android.service.controls.templates.ControlButton, @NonNull android.service.controls.templates.RangeTemplate);
ctor public ToggleRangeTemplate(@NonNull String, boolean, @NonNull CharSequence, @NonNull android.service.controls.templates.RangeTemplate);
diff --git a/api/system-current.txt b/api/system-current.txt
index e81af5a..f062112 100755
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -702,12 +702,12 @@
public final class StatsManager {
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]);
+ method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void clearPullAtomCallback(int);
method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long);
method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata();
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException;
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
- method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void registerPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long);
method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException;
@@ -715,7 +715,7 @@
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent);
method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
- method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void unregisterPullAtomCallback(int);
+ method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void setPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback);
field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS";
field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
@@ -729,14 +729,17 @@
}
public static class StatsManager.PullAtomMetadata {
+ method @Nullable public int[] getAdditiveFields();
+ method public long getCoolDownMillis();
+ method public long getTimeoutMillis();
}
public static class StatsManager.PullAtomMetadata.Builder {
ctor public StatsManager.PullAtomMetadata.Builder();
method @NonNull public android.app.StatsManager.PullAtomMetadata build();
method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setAdditiveFields(@NonNull int[]);
- method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownNs(long);
- method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutNs(long);
+ method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownMillis(long);
+ method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutMillis(long);
}
public static interface StatsManager.StatsPullAtomCallback {
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 7ab6c71..f18aaa5 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -1196,13 +1196,14 @@
return Status::ok();
}
-Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownNs,
- int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
- const shared_ptr<IPullAtomCallback>& pullerCallback) {
+Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownMillis,
+ int64_t timeoutMillis,
+ const std::vector<int32_t>& additiveFields,
+ const shared_ptr<IPullAtomCallback>& pullerCallback) {
ENFORCE_UID(AID_SYSTEM);
-
VLOG("StatsService::registerPullAtomCallback called.");
- mPullerManager->RegisterPullAtomCallback(uid, atomTag, coolDownNs, timeoutNs, additiveFields,
+ mPullerManager->RegisterPullAtomCallback(uid, atomTag, MillisToNano(coolDownMillis),
+ MillisToNano(timeoutMillis), additiveFields,
pullerCallback);
return Status::ok();
}
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index e6723c8..c256e1f 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -167,8 +167,9 @@
/**
* Binder call to register a callback function for a pulled atom.
*/
- virtual Status registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownNs,
- int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
+ virtual Status registerPullAtomCallback(
+ int32_t uid, int32_t atomTag, int64_t coolDownMillis, int64_t timeoutMillis,
+ const std::vector<int32_t>& additiveFields,
const shared_ptr<IPullAtomCallback>& pullerCallback) override;
/**
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index e58e7bc..9645a46 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -3600,9 +3600,10 @@
// See NotificationSectionsManager.PriorityBucket.
enum NotificationSection {
SECTION_UNKNOWN = 0;
- SECTION_PEOPLE = 1;
- SECTION_ALERTING = 2;
- SECTION_SILENT = 3;
+ SECTION_HEADS_UP = 1;
+ SECTION_PEOPLE = 2;
+ SECTION_ALERTING = 3;
+ SECTION_SILENT = 4;
}
optional NotificationSection section = 6;
}
diff --git a/core/java/android/service/controls/Control.java b/core/java/android/service/controls/Control.java
index dabd977..d01bc25 100644
--- a/core/java/android/service/controls/Control.java
+++ b/core/java/android/service/controls/Control.java
@@ -395,7 +395,7 @@
* {@link ControlsProviderService#createPublisherForAllAvailable}:
* <ul>
* <li> Status: {@link Status#STATUS_UNKNOWN}
- * <li> Control template: {@link ControlTemplate#NO_TEMPLATE}
+ * <li> Control template: {@link ControlTemplate#getNoTemplateObject}
* <li> Status text: {@code ""}
* </ul>
*/
@@ -593,7 +593,7 @@
* <li> Title: {@code ""}
* <li> Subtitle: {@code ""}
* <li> Status: {@link Status#STATUS_UNKNOWN}
- * <li> Control template: {@link ControlTemplate#NO_TEMPLATE}
+ * <li> Control template: {@link ControlTemplate#getNoTemplateObject}
* <li> Status text: {@code ""}
* </ul>
*/
diff --git a/core/java/android/service/controls/ControlsProviderService.java b/core/java/android/service/controls/ControlsProviderService.java
index 9debb37..9accf5b 100644
--- a/core/java/android/service/controls/ControlsProviderService.java
+++ b/core/java/android/service/controls/ControlsProviderService.java
@@ -239,7 +239,8 @@
private static boolean isStatelessControl(Control control) {
return (control.getStatus() == Control.STATUS_UNKNOWN
- && control.getControlTemplate().getTemplateType() == ControlTemplate.TYPE_NONE
+ && control.getControlTemplate().getTemplateType()
+ == ControlTemplate.TYPE_NO_TEMPLATE
&& TextUtils.isEmpty(control.getStatusText()));
}
diff --git a/core/java/android/service/controls/DeviceTypes.java b/core/java/android/service/controls/DeviceTypes.java
index ac3b36c..f973610 100644
--- a/core/java/android/service/controls/DeviceTypes.java
+++ b/core/java/android/service/controls/DeviceTypes.java
@@ -23,6 +23,18 @@
/**
* Device types for {@link Control}.
+ *
+ * Each {@link Control} declares a type for the device they represent. This type will be used to
+ * determine icons and colors.
+ * <p>
+ * The type of the device may change on status updates of the {@link Control}. For example, a
+ * device of {@link #TYPE_OUTLET} could be determined by the {@link ControlsProviderService} to be
+ * a {@link #TYPE_COFFEE_MAKER} and change the type for that {@link Control}, therefore possibly
+ * changing icon and color.
+ * <p>
+ * In case the device type is not know by the application but the basic function is, or there is no
+ * provided type, one of the generic types (those starting with {@code TYPE_GENERIC}) can be used.
+ * These will provide an identifiable icon based on the basic function of the device.
*/
public class DeviceTypes {
diff --git a/core/java/android/service/controls/actions/ControlAction.java b/core/java/android/service/controls/actions/ControlAction.java
index 45e63d7..37a75f0 100644
--- a/core/java/android/service/controls/actions/ControlAction.java
+++ b/core/java/android/service/controls/actions/ControlAction.java
@@ -22,7 +22,7 @@
import android.annotation.Nullable;
import android.os.Bundle;
import android.service.controls.Control;
-import android.service.controls.IControlsActionCallback;
+import android.service.controls.ControlsProviderService;
import android.service.controls.templates.ControlTemplate;
import android.util.Log;
@@ -34,8 +34,15 @@
/**
* An abstract action indicating a user interaction with a {@link Control}.
*
- * The action may have a value to authenticate the input, when the provider has requested it to
- * complete the action.
+ * In some cases, an action needs to be validated by the user, using a password, PIN or simple
+ * acknowledgment. For those cases, an optional (nullable) parameter can be passed to send the user
+ * input. This <b>challenge value</b> will be requested from the user and sent as part
+ * of a {@link ControlAction} only if the service has responded to an action with one of:
+ * <ul>
+ * <li> {@link #RESPONSE_CHALLENGE_ACK}
+ * <li> {@link #RESPONSE_CHALLENGE_PIN}
+ * <li> {@link #RESPONSE_CHALLENGE_PASSPHRASE}
+ * </ul>
*/
public abstract class ControlAction {
@@ -53,7 +60,6 @@
TYPE_ERROR,
TYPE_BOOLEAN,
TYPE_FLOAT,
- TYPE_MULTI_FLOAT,
TYPE_MODE,
TYPE_COMMAND
})
@@ -61,6 +67,7 @@
/**
* Object returned when there is an unparcelling error.
+ * @hide
*/
public static final @NonNull ControlAction ERROR_ACTION = new ControlAction() {
@Override
@@ -70,7 +77,7 @@
};
/**
- * The identifier of {@link #ERROR_ACTION}
+ * The identifier of the action returned by {@link #getErrorAction}.
*/
public static final @ActionType int TYPE_ERROR = -1;
@@ -85,11 +92,6 @@
public static final @ActionType int TYPE_FLOAT = 2;
/**
- * The identifier of {@link MultiFloatAction}.
- */
- public static final @ActionType int TYPE_MULTI_FLOAT = 3;
-
- /**
* The identifier of {@link ModeAction}.
*/
public static final @ActionType int TYPE_MODE = 4;
@@ -121,28 +123,32 @@
public static final @ResponseResult int RESPONSE_UNKNOWN = 0;
/**
- * Response code for {@link IControlsActionCallback#accept} indicating that
- * the action has been performed. The action may still fail later and the state may not change.
+ * Response code for the {@code consumer} in
+ * {@link ControlsProviderService#performControlAction} indicating that the action has been
+ * performed. The action may still fail later and the state may not change.
*/
public static final @ResponseResult int RESPONSE_OK = 1;
/**
- * Response code for {@link IControlsActionCallback#accept} indicating that
- * the action has failed.
+ * Response code for the {@code consumer} in
+ * {@link ControlsProviderService#performControlAction} indicating that the action has failed.
*/
public static final @ResponseResult int RESPONSE_FAIL = 2;
/**
- * Response code for {@link IControlsActionCallback#accept} indicating that
- * in order for the action to be performed, acknowledgment from the user is required.
+ * Response code for the {@code consumer} in
+ * {@link ControlsProviderService#performControlAction} indicating that in order for the action
+ * to be performed, acknowledgment from the user is required.
*/
public static final @ResponseResult int RESPONSE_CHALLENGE_ACK = 3;
/**
- * Response code for {@link IControlsActionCallback#accept} indicating that
- * in order for the action to be performed, a PIN is required.
+ * Response code for the {@code consumer} in
+ * {@link ControlsProviderService#performControlAction} indicating that in order for the action
+ * to be performed, a PIN is required.
*/
public static final @ResponseResult int RESPONSE_CHALLENGE_PIN = 4;
/**
- * Response code for {@link IControlsActionCallback#accept} indicating that
- * in order for the action to be performed, an alphanumeric passphrase is required.
+ * Response code for the {@code consumer} in
+ * {@link ControlsProviderService#performControlAction} indicating that in order for the action
+ * to be performed, an alphanumeric passphrase is required.
*/
public static final @ResponseResult int RESPONSE_CHALLENGE_PASSPHRASE = 5;
@@ -228,8 +234,6 @@
return new BooleanAction(bundle);
case TYPE_FLOAT:
return new FloatAction(bundle);
- case TYPE_MULTI_FLOAT:
- return new MultiFloatAction(bundle);
case TYPE_MODE:
return new ModeAction(bundle);
case TYPE_COMMAND:
@@ -243,4 +247,12 @@
return ERROR_ACTION;
}
}
+
+ /**
+ * Returns a singleton {@link ControlAction} used for indicating an error in unparceling.
+ */
+ @NonNull
+ public static ControlAction getErrorAction() {
+ return ERROR_ACTION;
+ }
}
diff --git a/core/java/android/service/controls/actions/MultiFloatAction.java b/core/java/android/service/controls/actions/MultiFloatAction.java
deleted file mode 100644
index e574079..0000000
--- a/core/java/android/service/controls/actions/MultiFloatAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.service.controls.actions;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.internal.util.Preconditions;
-
-public final class MultiFloatAction extends ControlAction {
-
- private static final String TAG = "MultiFloatAction";
- private static final @ActionType int TYPE = TYPE_MULTI_FLOAT;
- private static final String KEY_VALUES = "key_values";
-
- private final @NonNull float[] mNewValues;
-
- @Override
- public int getActionType() {
- return TYPE;
- }
-
- public MultiFloatAction(@NonNull String templateId,
- @NonNull float[] newValues,
- @Nullable String challengeValue) {
- super(templateId, challengeValue);
- Preconditions.checkNotNull(newValues);
- if (newValues.length == 0) {
- throw new IllegalArgumentException("newValues array length 0");
- }
- if (newValues.length == 1) {
- Log.w(TAG, "newValues array length 1");
- }
- mNewValues = newValues.clone();
- }
-
- public MultiFloatAction(@NonNull String templateId, @NonNull float[] newValues) {
- this(templateId, newValues, null);
- }
-
- /**
- * @param b
- * @hide
- */
- MultiFloatAction(Bundle b) {
- super(b);
- mNewValues = b.getFloatArray(KEY_VALUES);
- }
-
- @NonNull
- public float[] getNewValues() {
- return mNewValues.clone();
- }
-
- /**
- * @return
- * @hide
- */
- @Override
- @NonNull
- Bundle getDataBundle() {
- Bundle b = super.getDataBundle();
- b.putFloatArray(KEY_VALUES, mNewValues);
- return b;
- }
-}
diff --git a/core/java/android/service/controls/templates/ControlTemplate.java b/core/java/android/service/controls/templates/ControlTemplate.java
index 30efd80..1e16273 100644
--- a/core/java/android/service/controls/templates/ControlTemplate.java
+++ b/core/java/android/service/controls/templates/ControlTemplate.java
@@ -49,18 +49,20 @@
/**
* Singleton representing a {@link Control} with no input.
+ * @hide
*/
public static final @NonNull ControlTemplate NO_TEMPLATE = new ControlTemplate("") {
@Override
public int getTemplateType() {
- return TYPE_NONE;
+ return TYPE_NO_TEMPLATE;
}
};
/**
* Object returned when there is an unparcelling error.
+ * @hide
*/
- public static final @NonNull ControlTemplate ERROR_TEMPLATE = new ControlTemplate("") {
+ private static final @NonNull ControlTemplate ERROR_TEMPLATE = new ControlTemplate("") {
@Override
public int getTemplateType() {
return TYPE_ERROR;
@@ -73,10 +75,9 @@
@Retention(RetentionPolicy.SOURCE)
@IntDef({
TYPE_ERROR,
- TYPE_NONE,
+ TYPE_NO_TEMPLATE,
TYPE_TOGGLE,
TYPE_RANGE,
- TYPE_THUMBNAIL,
TYPE_TOGGLE_RANGE,
TYPE_TEMPERATURE,
TYPE_STATELESS
@@ -84,14 +85,14 @@
public @interface TemplateType {}
/**
- * Type identifier of {@link #ERROR_TEMPLATE}.
+ * Type identifier of the template returned by {@link #getErrorTemplate()}.
*/
public static final @TemplateType int TYPE_ERROR = -1;
/**
- * Type identifier of {@link ControlTemplate#NO_TEMPLATE}.
+ * Type identifier of {@link ControlTemplate#getNoTemplateObject}.
*/
- public static final @TemplateType int TYPE_NONE = 0;
+ public static final @TemplateType int TYPE_NO_TEMPLATE = 0;
/**
* Type identifier of {@link ToggleTemplate}.
@@ -104,11 +105,6 @@
public static final @TemplateType int TYPE_RANGE = 2;
/**
- * Type identifier of {@link ThumbnailTemplate}.
- */
- public static final @TemplateType int TYPE_THUMBNAIL = 3;
-
- /**
* Type identifier of {@link ToggleRangeTemplate}.
*/
public static final @TemplateType int TYPE_TOGGLE_RANGE = 6;
@@ -191,15 +187,13 @@
return new ToggleTemplate(bundle);
case TYPE_RANGE:
return new RangeTemplate(bundle);
- case TYPE_THUMBNAIL:
- return new ThumbnailTemplate(bundle);
case TYPE_TOGGLE_RANGE:
return new ToggleRangeTemplate(bundle);
case TYPE_TEMPERATURE:
return new TemperatureControlTemplate(bundle);
case TYPE_STATELESS:
return new StatelessTemplate(bundle);
- case TYPE_NONE:
+ case TYPE_NO_TEMPLATE:
return NO_TEMPLATE;
case TYPE_ERROR:
default:
@@ -210,4 +204,27 @@
return ERROR_TEMPLATE;
}
}
+
+ /**
+ * @return a singleton {@link ControlTemplate} used for indicating an error in unparceling.
+ */
+ @NonNull
+ public static ControlTemplate getErrorTemplate() {
+ return ERROR_TEMPLATE;
+ }
+
+ /**
+ * Get a singleton {@link ControlTemplate} that has no features.
+ *
+ * This template has no distinctive field, not even an identifier. Used for a {@link Control}
+ * that accepts no type of input, or when there is no known state.
+ *
+ * @return a singleton {@link ControlTemplate} to indicate no specific template is used by
+ * this {@link Control}
+ */
+ @NonNull
+ public static ControlTemplate getNoTemplateObject() {
+ return NO_TEMPLATE;
+ }
+
}
diff --git a/core/java/android/service/controls/templates/TemperatureControlTemplate.java b/core/java/android/service/controls/templates/TemperatureControlTemplate.java
index 0818c7e..96be97a 100644
--- a/core/java/android/service/controls/templates/TemperatureControlTemplate.java
+++ b/core/java/android/service/controls/templates/TemperatureControlTemplate.java
@@ -60,16 +60,34 @@
private static final int NUM_MODES = 6;
+ /**
+ * Use when the current or active mode of the device is not known
+ */
public static final @Mode int MODE_UNKNOWN = 0;
+ /**
+ * Indicates that the current or active mode of the device is off.
+ */
public static final @Mode int MODE_OFF = 1;
+ /**
+ * Indicates that the current or active mode of the device is set to heat.
+ */
public static final @Mode int MODE_HEAT = 2;
+ /**
+ * Indicates that the current or active mode of the device is set to cool.
+ */
public static final @Mode int MODE_COOL = 3;
+ /**
+ * Indicates that the current or active mode of the device is set to heat-cool.
+ */
public static final @Mode int MODE_HEAT_COOL = 4;
+ /**
+ * Indicates that the current or active mode of the device is set to eco.
+ */
public static final @Mode int MODE_ECO = 5;
/**
@@ -85,10 +103,29 @@
})
public @interface ModeFlag {}
+ /**
+ * Flag to indicate that the device supports off mode.
+ */
public static final int FLAG_MODE_OFF = 1 << MODE_OFF;
+
+ /**
+ * Flag to indicate that the device supports heat mode.
+ */
public static final int FLAG_MODE_HEAT = 1 << MODE_HEAT;
+
+ /**
+ * Flag to indicate that the device supports cool mode.
+ */
public static final int FLAG_MODE_COOL = 1 << MODE_COOL;
+
+ /**
+ * Flag to indicate that the device supports heat-cool mode.
+ */
public static final int FLAG_MODE_HEAT_COOL = 1 << MODE_HEAT_COOL;
+
+ /**
+ * Flag to indicate that the device supports eco mode.
+ */
public static final int FLAG_MODE_ECO = 1 << MODE_ECO;
private static final int ALL_FLAGS =
FLAG_MODE_OFF |
diff --git a/core/java/android/service/controls/templates/ThumbnailTemplate.java b/core/java/android/service/controls/templates/ThumbnailTemplate.java
deleted file mode 100644
index 72179f4..0000000
--- a/core/java/android/service/controls/templates/ThumbnailTemplate.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.service.controls.templates;
-
-import android.annotation.NonNull;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-import android.service.controls.Control;
-
-import com.android.internal.util.Preconditions;
-
-/**
- * A template for a {@link Control} that displays an image.
- */
-public final class ThumbnailTemplate extends ControlTemplate {
-
- private static final @TemplateType int TYPE = TYPE_THUMBNAIL;
- private static final String KEY_ICON = "key_icon";
- private static final String KEY_CONTENT_DESCRIPTION = "key_content_description";
-
- private final @NonNull Icon mThumbnail;
- private final @NonNull CharSequence mContentDescription;
-
- /**
- * @param templateId the identifier for this template object
- * @param thumbnail an image to display on the {@link Control}
- * @param contentDescription a description of the image for accessibility.
- */
- public ThumbnailTemplate(@NonNull String templateId, @NonNull Icon thumbnail,
- @NonNull CharSequence contentDescription) {
- super(templateId);
- Preconditions.checkNotNull(thumbnail);
- Preconditions.checkNotNull(contentDescription);
- mThumbnail = thumbnail;
- mContentDescription = contentDescription;
- }
-
- /**
- * @param b
- * @hide
- */
- ThumbnailTemplate(Bundle b) {
- super(b);
- mThumbnail = b.getParcelable(KEY_ICON);
- mContentDescription = b.getCharSequence(KEY_CONTENT_DESCRIPTION, "");
- }
-
- /**
- * The {@link Icon} (image) displayed by this template.
- */
- @NonNull
- public Icon getThumbnail() {
- return mThumbnail;
- }
-
- /**
- * The description of the image returned by {@link ThumbnailTemplate#getThumbnail()}
- */
- @NonNull
- public CharSequence getContentDescription() {
- return mContentDescription;
- }
-
- /**
- * @return {@link ControlTemplate#TYPE_THUMBNAIL}
- */
- @Override
- public int getTemplateType() {
- return TYPE;
- }
-
- /**
- * @return
- * @hide
- */
- @Override
- @NonNull
- Bundle getDataBundle() {
- Bundle b = super.getDataBundle();
- b.putObject(KEY_ICON, mThumbnail);
- b.putObject(KEY_CONTENT_DESCRIPTION, mContentDescription);
- return b;
- }
-}
diff --git a/core/java/android/view/WindowContainerTransaction.java b/core/java/android/view/WindowContainerTransaction.java
index f406be9..e05c374 100644
--- a/core/java/android/view/WindowContainerTransaction.java
+++ b/core/java/android/view/WindowContainerTransaction.java
@@ -72,6 +72,33 @@
}
/**
+ * Resize a container's app bounds. This is the bounds used to report appWidth/Height to an
+ * app's DisplayInfo. It is derived by subtracting the overlapping portion of the navbar from
+ * the full bounds.
+ */
+ public WindowContainerTransaction setAppBounds(IWindowContainer container, Rect appBounds) {
+ Change chg = getOrCreateChange(container.asBinder());
+ chg.mConfiguration.windowConfiguration.setAppBounds(appBounds);
+ chg.mConfigSetMask |= ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+ chg.mWindowSetMask |= WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS;
+ return this;
+ }
+
+ /**
+ * Resize a container's configuration size. The configuration size is what gets reported to the
+ * app via screenWidth/HeightDp and influences which resources get loaded. This size is
+ * derived by subtracting the overlapping portions of both the statusbar and the navbar from
+ * the full bounds.
+ */
+ public WindowContainerTransaction setScreenSizeDp(IWindowContainer container, int w, int h) {
+ Change chg = getOrCreateChange(container.asBinder());
+ chg.mConfiguration.screenWidthDp = w;
+ chg.mConfiguration.screenHeightDp = h;
+ chg.mConfigSetMask |= ActivityInfo.CONFIG_SCREEN_SIZE;
+ return this;
+ }
+
+ /**
* Notify activies within the hiearchy of a container that they have entered picture-in-picture
* mode with the given bounds.
*/
@@ -161,7 +188,8 @@
@Override
public String toString() {
- return "WindowContainerTransaction { changes = " + mChanges + " }";
+ return "WindowContainerTransaction { changes = " + mChanges + " hops = " + mHierarchyOps
+ + " }";
}
@Override
@@ -269,6 +297,11 @@
(mConfigSetMask & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
&& ((mWindowSetMask & WindowConfiguration.WINDOW_CONFIG_BOUNDS)
!= 0);
+ final boolean changesAppBounds =
+ (mConfigSetMask & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
+ && ((mWindowSetMask & WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS)
+ != 0);
+ final boolean changesSs = (mConfigSetMask & ActivityInfo.CONFIG_SCREEN_SIZE) != 0;
final boolean changesSss =
(mConfigSetMask & ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) != 0;
StringBuilder sb = new StringBuilder();
@@ -276,9 +309,16 @@
if (changesBounds) {
sb.append("bounds:" + mConfiguration.windowConfiguration.getBounds() + ",");
}
+ if (changesAppBounds) {
+ sb.append("appbounds:" + mConfiguration.windowConfiguration.getAppBounds() + ",");
+ }
if (changesSss) {
sb.append("ssw:" + mConfiguration.smallestScreenWidthDp + ",");
}
+ if (changesSs) {
+ sb.append("sw/h:" + mConfiguration.screenWidthDp + "x"
+ + mConfiguration.screenHeightDp + ",");
+ }
if ((mChangeMask & CHANGE_FOCUSABLE) != 0) {
sb.append("focusable:" + mFocusable + ",");
}
diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
index 18d7738..d50826f 100644
--- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java
@@ -327,7 +327,6 @@
return false;
}
}
- showListView(activeListAdapter);
return activeListAdapter.rebuildList(doPostProcessing);
}
@@ -389,6 +388,8 @@
Button button = emptyStateView.findViewById(R.id.resolver_empty_state_button);
button.setVisibility(buttonOnClick != null ? View.VISIBLE : View.GONE);
button.setOnClickListener(buttonOnClick);
+
+ activeListAdapter.markTabLoaded();
}
private void showSpinner(View emptyStateView) {
@@ -408,7 +409,7 @@
emptyStateView.findViewById(R.id.resolver_empty_state_progress).setVisibility(View.GONE);
}
- private void showListView(ResolverListAdapter activeListAdapter) {
+ protected void showListView(ResolverListAdapter activeListAdapter) {
ProfileDescriptor descriptor = getItem(
userHandleToPageIndex(activeListAdapter.getUserHandle()));
descriptor.rootView.findViewById(R.id.resolver_list).setVisibility(View.VISIBLE);
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index bd7b47d..ec371d9 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -163,7 +163,7 @@
* TODO(arangelov): Remove a couple of weeks after work/personal tabs are finalized.
*/
@VisibleForTesting
- public static boolean ENABLE_TABBED_VIEW = false;
+ public static boolean ENABLE_TABBED_VIEW = true;
private static final String TAB_TAG_PERSONAL = "personal";
private static final String TAB_TAG_WORK = "work";
@@ -989,6 +989,8 @@
}
if (shouldShowEmptyState(listAdapter)) {
mMultiProfilePagerAdapter.showEmptyState(listAdapter);
+ } else {
+ mMultiProfilePagerAdapter.showListView(listAdapter);
}
if (doPostProcessing) {
if (mMultiProfilePagerAdapter.getCurrentUserHandle().getIdentifier()
@@ -1337,9 +1339,12 @@
+ "cannot be null.");
}
// We partially rebuild the inactive adapter to determine if we should auto launch
- boolean rebuildCompleted = mMultiProfilePagerAdapter.rebuildActiveTab(true);
+ // isTabLoaded will be true here if the empty state screen is shown instead of the list.
+ boolean rebuildCompleted = mMultiProfilePagerAdapter.rebuildActiveTab(true)
+ || mMultiProfilePagerAdapter.getActiveListAdapter().isTabLoaded();
if (shouldShowTabs()) {
- boolean rebuildInactiveCompleted = mMultiProfilePagerAdapter.rebuildInactiveTab(false);
+ boolean rebuildInactiveCompleted = mMultiProfilePagerAdapter.rebuildInactiveTab(false)
+ || mMultiProfilePagerAdapter.getInactiveListAdapter().isTabLoaded();
rebuildCompleted = rebuildCompleted && rebuildInactiveCompleted;
}
@@ -1399,8 +1404,8 @@
if (numberOfProfiles == 1 && maybeAutolaunchIfSingleTarget()) {
return true;
} else if (numberOfProfiles == 2
- && mMultiProfilePagerAdapter.getActiveListAdapter().isListLoaded()
- && mMultiProfilePagerAdapter.getInactiveListAdapter().isListLoaded()
+ && mMultiProfilePagerAdapter.getActiveListAdapter().isTabLoaded()
+ && mMultiProfilePagerAdapter.getInactiveListAdapter().isTabLoaded()
&& (maybeAutolaunchIfNoAppsOnInactiveTab()
|| maybeAutolaunchIfCrossProfileSupported())) {
return true;
diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java
index 54453d0..61a404e 100644
--- a/core/java/com/android/internal/app/ResolverListAdapter.java
+++ b/core/java/com/android/internal/app/ResolverListAdapter.java
@@ -87,7 +87,7 @@
private final ResolverListCommunicator mResolverListCommunicator;
private Runnable mPostListReadyRunnable;
private final boolean mIsAudioCaptureDevice;
- private boolean mIsListLoaded;
+ private boolean mIsTabLoaded;
public ResolverListAdapter(Context context, List<Intent> payloadIntents,
Intent[] initialIntents, List<ResolveInfo> rList,
@@ -192,7 +192,7 @@
mLastChosenPosition = -1;
mAllTargetsAreBrowsers = false;
mDisplayList.clear();
- mIsListLoaded = false;
+ mIsTabLoaded = false;
if (mBaseResolveList != null) {
currentResolveList = mUnfilteredResolveList = new ArrayList<>();
@@ -354,7 +354,7 @@
mResolverListCommunicator.sendVoiceChoicesIfNeeded();
postListReadyRunnable(doPostProcessing);
- mIsListLoaded = true;
+ mIsTabLoaded = true;
}
/**
@@ -614,8 +614,12 @@
return mIntents;
}
- protected boolean isListLoaded() {
- return mIsListLoaded;
+ protected boolean isTabLoaded() {
+ return mIsTabLoaded;
+ }
+
+ protected void markTabLoaded() {
+ mIsTabLoaded = true;
}
/**
diff --git a/core/java/com/android/internal/util/DataClass.java b/core/java/com/android/internal/util/DataClass.java
index 43539c7..ee139d9 100644
--- a/core/java/com/android/internal/util/DataClass.java
+++ b/core/java/com/android/internal/util/DataClass.java
@@ -15,7 +15,13 @@
*/
package com.android.internal.util;
-import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
import android.annotation.IntDef;
import android.annotation.Nullable;
@@ -243,6 +249,13 @@
}
/**
+ * Mark that the field should have a {@link Nullable} argument for its setter.
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @Target({FIELD})
+ @interface MaySetToNull {}
+
+ /**
* Callback used by {@link #genForEachField}.
*
* @param <THIS> The enclosing data class instance.
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
index b117e40..c83cab7 100644
--- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java
+++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
@@ -121,7 +121,8 @@
private final Rect mTempRect = new Rect();
- private AbsListView mNestedScrollingChild;
+ private AbsListView mNestedListChild;
+ private RecyclerView mNestedRecyclerChild;
private final ViewTreeObserver.OnTouchModeChangeListener mTouchModeChangeListener =
new ViewTreeObserver.OnTouchModeChangeListener() {
@@ -347,11 +348,20 @@
return mIsDragging || mOpenOnClick;
}
- private boolean isNestedChildScrolled() {
- return mNestedScrollingChild != null
- && mNestedScrollingChild.getChildCount() > 0
- && (mNestedScrollingChild.getFirstVisiblePosition() > 0
- || mNestedScrollingChild.getChildAt(0).getTop() < 0);
+ private boolean isNestedListChildScrolled() {
+ return mNestedListChild != null
+ && mNestedListChild.getChildCount() > 0
+ && (mNestedListChild.getFirstVisiblePosition() > 0
+ || mNestedListChild.getChildAt(0).getTop() < 0);
+ }
+
+ private boolean isNestedRecyclerChildScrolled() {
+ if (mNestedRecyclerChild != null && mNestedRecyclerChild.getChildCount() > 0) {
+ final RecyclerView.ViewHolder vh =
+ mNestedRecyclerChild.findViewHolderForAdapterPosition(0);
+ return vh == null || vh.itemView.getTop() < 0;
+ }
+ return false;
}
@Override
@@ -396,8 +406,10 @@
}
if (mIsDragging) {
final float dy = y - mLastTouchY;
- if (dy > 0 && isNestedChildScrolled()) {
- mNestedScrollingChild.smoothScrollBy((int) -dy, 0);
+ if (dy > 0 && isNestedListChildScrolled()) {
+ mNestedListChild.smoothScrollBy((int) -dy, 0);
+ } else if (dy > 0 && isNestedRecyclerChildScrolled()) {
+ mNestedRecyclerChild.scrollBy(0, (int) -dy);
} else {
performDrag(dy);
}
@@ -452,8 +464,10 @@
smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, yvel);
mDismissOnScrollerFinished = true;
} else {
- if (isNestedChildScrolled()) {
- mNestedScrollingChild.smoothScrollToPosition(0);
+ if (isNestedListChildScrolled()) {
+ mNestedListChild.smoothScrollToPosition(0);
+ } else if (isNestedRecyclerChildScrolled()) {
+ mNestedRecyclerChild.smoothScrollToPosition(0);
}
smoothScrollTo(yvel < 0 ? 0 : mCollapsibleHeight, yvel);
}
@@ -729,8 +743,11 @@
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
if ((nestedScrollAxes & View.SCROLL_AXIS_VERTICAL) != 0) {
- if (child instanceof AbsListView) {
- mNestedScrollingChild = (AbsListView) child;
+ if (target instanceof AbsListView) {
+ mNestedListChild = (AbsListView) target;
+ }
+ if (target instanceof RecyclerView) {
+ mNestedRecyclerChild = (RecyclerView) target;
}
return true;
}
diff --git a/core/tests/coretests/src/android/service/controls/actions/ControlActionTest.java b/core/tests/coretests/src/android/service/controls/actions/ControlActionTest.java
index 10a7b76..d8088b7 100644
--- a/core/tests/coretests/src/android/service/controls/actions/ControlActionTest.java
+++ b/core/tests/coretests/src/android/service/controls/actions/ControlActionTest.java
@@ -56,16 +56,6 @@
}
@Test
- public void testUnparcelingCorrectClass_multiFloat() {
- ControlAction toParcel = new MultiFloatAction(TEST_ID, new float[] {0f, 1f});
-
- ControlAction fromParcel = parcelAndUnparcel(toParcel);
-
- assertEquals(ControlAction.TYPE_MULTI_FLOAT, fromParcel.getActionType());
- assertTrue(fromParcel instanceof MultiFloatAction);
- }
-
- @Test
public void testUnparcelingCorrectClass_mode() {
ControlAction toParcel = new ModeAction(TEST_ID, 1);
diff --git a/core/tests/coretests/src/android/service/controls/templates/ControlTemplateTest.java b/core/tests/coretests/src/android/service/controls/templates/ControlTemplateTest.java
index 292ac09..87dc1b7 100644
--- a/core/tests/coretests/src/android/service/controls/templates/ControlTemplateTest.java
+++ b/core/tests/coretests/src/android/service/controls/templates/ControlTemplateTest.java
@@ -103,16 +103,6 @@
}
@Test
- public void testUnparcelingCorrectClass_thumbnail() {
- ControlTemplate toParcel = new ThumbnailTemplate(TEST_ID, mIcon, TEST_ACTION_DESCRIPTION);
-
- ControlTemplate fromParcel = parcelAndUnparcel(toParcel);
-
- assertEquals(ControlTemplate.TYPE_THUMBNAIL, fromParcel.getTemplateType());
- assertTrue(fromParcel instanceof ThumbnailTemplate);
- }
-
- @Test
public void testUnparcelingCorrectClass_toggleRange() {
ControlTemplate toParcel = new ToggleRangeTemplate(TEST_ID, mControlButton,
new RangeTemplate(TEST_ID, 0, 2, 1, 1, "%f"));
diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
index 1ac4b4b..323bba3 100644
--- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
+++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
@@ -624,7 +624,7 @@
private void registerGnssStats() {
mPullAtomCallback = new StatsPullAtomCallbackImpl();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
FrameworkStatsLog.GNSS_STATS,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(), mPullAtomCallback);
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 8460612..6a7f9e2 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -121,7 +121,6 @@
android:layout_marginEnd="2dp"
android:ellipsize="end"
android:text="@string/notification_delegate_header"
- android:layout_toEndOf="@id/pkg_divider"
android:maxLines="1" />
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 5d03eee..6ab573b 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -27,51 +27,81 @@
android:paddingStart="@*android:dimen/notification_content_margin_start">
<!-- Package Info -->
- <RelativeLayout
+ <LinearLayout
android:id="@+id/header"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/notification_guts_conversation_header_height"
+ android:gravity="center_vertical"
android:clipChildren="false"
android:clipToPadding="false">
<ImageView
- android:id="@+id/pkgicon"
- android:layout_width="@dimen/notification_guts_header_height"
- android:layout_height="@dimen/notification_guts_header_height"
+ android:id="@+id/pkg_icon"
+ android:layout_width="@dimen/notification_guts_conversation_icon_size"
+ android:layout_height="@dimen/notification_guts_conversation_icon_size"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
- android:layout_marginEnd="3dp" />
- <TextView
- android:id="@+id/pkgname"
- android:layout_width="wrap_content"
+ android:layout_marginEnd="15dp" />
+ <LinearLayout
+ android:id="@+id/names"
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:orientation="vertical"
+
android:layout_height="wrap_content"
+ android:minHeight="@dimen/notification_guts_conversation_icon_size"
android:layout_centerVertical="true"
- style="@style/TextAppearance.NotificationImportanceHeader"
- android:layout_marginStart="3dp"
- android:layout_marginEnd="2dp"
- android:layout_toEndOf="@id/pkgicon"
- android:singleLine="true" />
- <TextView
- android:id="@+id/pkg_divider"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- style="@style/TextAppearance.NotificationImportanceHeader"
- android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"
- android:layout_toEndOf="@id/pkgname"
- android:text="@*android:string/notification_header_divider_symbol" />
- <TextView
- android:id="@+id/delegate_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- style="@style/TextAppearance.NotificationImportanceHeader"
- android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"
- android:ellipsize="end"
- android:text="@string/notification_delegate_header"
- android:layout_toEndOf="@id/pkg_divider"
- android:maxLines="1" />
+ android:gravity="center_vertical"
+ android:layout_alignEnd="@id/pkg_icon"
+ android:layout_toEndOf="@id/pkg_icon"
+ android:layout_alignStart="@id/mute">
+ <TextView
+ android:id="@+id/channel_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/TextAppearance.NotificationImportanceChannel"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="start"
+ android:orientation="horizontal">
+ <TextView
+ android:id="@+id/pkg_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/TextAppearance.NotificationImportanceChannelGroup"
+ android:ellipsize="end"
+ android:maxLines="1"/>
+ <TextView
+ android:id="@+id/group_divider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ style="@style/TextAppearance.NotificationImportanceHeader"
+ android:layout_marginStart="2dp"
+ android:layout_marginEnd="2dp"
+ android:text="@*android:string/notification_header_divider_symbol" />
+ <TextView
+ android:id="@+id/group_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ style="@style/TextAppearance.NotificationImportanceChannel"/>
+ </LinearLayout>
+ <TextView
+ android:id="@+id/delegate_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ style="@style/TextAppearance.NotificationImportanceHeader"
+ android:layout_marginStart="2dp"
+ android:layout_marginEnd="2dp"
+ android:ellipsize="end"
+ android:text="@string/notification_delegate_header"
+ android:maxLines="1" />
+
+ </LinearLayout>
+
+ <!-- end aligned fields -->
<!-- Optional link to app. Only appears if the channel is not disabled and the app
asked for it -->
<ImageButton
@@ -95,91 +125,6 @@
android:src="@drawable/ic_settings"
android:layout_alignParentEnd="true"
android:tint="@color/notification_guts_link_icon_tint"/>
- </RelativeLayout>
-
- <!-- Channel Info Block -->
- <LinearLayout
- android:id="@+id/channel_info"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingEnd="@*android:dimen/notification_content_margin_end"
- android:gravity="center"
- android:orientation="vertical">
- <!-- Channel Name -->
- <TextView
- android:id="@+id/channel_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- style="@style/TextAppearance.NotificationImportanceChannel"/>
- <TextView
- android:id="@+id/group_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="@style/TextAppearance.NotificationImportanceChannelGroup"
- android:ellipsize="end"
- android:maxLines="1"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/blocking_helper"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/notification_guts_button_spacing"
- android:layout_marginBottom="@dimen/notification_guts_button_spacing"
- android:paddingEnd="@*android:dimen/notification_content_margin_end"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical">
- <!-- blocking helper text. no need for non-configurable check b/c controls won't be
- activated in that case -->
- <TextView
- android:id="@+id/blocking_helper_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="2dp"
- android:text="@string/inline_blocking_helper"
- style="@*android:style/TextAppearance.DeviceDefault.Notification" />
- <RelativeLayout
- android:id="@+id/block_buttons"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/notification_guts_button_spacing">
- <TextView
- android:id="@+id/blocking_helper_turn_off_notifications"
- android:text="@string/inline_turn_off_notifications"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"
- android:width="110dp"
- android:paddingEnd="15dp"
- android:breakStrategy="simple"
- style="@style/TextAppearance.NotificationInfo.Button"/>
- <TextView
- android:id="@+id/deliver_silently"
- android:text="@string/inline_deliver_silently_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing"
- android:paddingEnd="15dp"
- android:width="110dp"
- android:breakStrategy="simple"
- android:layout_toStartOf="@+id/keep_showing"
- style="@style/TextAppearance.NotificationInfo.Button"/>
- <TextView
- android:id="@+id/keep_showing"
- android:text="@string/inline_keep_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing"
- android:width="110dp"
- android:breakStrategy="simple"
- android:layout_alignParentEnd="true"
- style="@style/TextAppearance.NotificationInfo.Button"/>
- </RelativeLayout>
</LinearLayout>
@@ -357,34 +302,4 @@
</RelativeLayout>
</LinearLayout>
-
- <com.android.systemui.statusbar.notification.row.NotificationUndoLayout
- android:id="@+id/confirmation"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/confirmation_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="start|center_vertical"
- android:layout_marginStart="@*android:dimen/notification_content_margin_start"
- android:layout_marginEnd="@*android:dimen/notification_content_margin_start"
- android:text="@string/notification_channel_disabled"
- style="@style/TextAppearance.NotificationInfo.Confirmation"/>
- <TextView
- android:id="@+id/undo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minWidth="@dimen/notification_importance_toggle_size"
- android:minHeight="@dimen/notification_importance_toggle_size"
- android:layout_marginTop="@dimen/notification_guts_button_spacing"
- android:layout_marginBottom="@dimen/notification_guts_button_spacing"
- android:layout_marginStart="@dimen/notification_guts_button_side_margin"
- android:layout_marginEnd="@dimen/notification_guts_button_side_margin"
- android:layout_gravity="end|center_vertical"
- android:text="@string/inline_undo"
- style="@style/TextAppearance.NotificationInfo.Button"/>
- </com.android.systemui.statusbar.notification.row.NotificationUndoLayout>
</com.android.systemui.statusbar.notification.row.NotificationInfo>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
index e554dcd..ebed1fc 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
@@ -64,7 +64,7 @@
private final class InputEventReceiver extends BatchedInputEventReceiver {
public InputEventReceiver(InputChannel inputChannel, Looper looper) {
- super(inputChannel, looper, Choreographer.getSfInstance());
+ super(inputChannel, looper, Choreographer.getInstance());
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 1324524..86aa640 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -28,6 +28,9 @@
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
import android.annotation.Dimension;
import android.annotation.NonNull;
import android.app.ActivityManager;
@@ -714,6 +717,8 @@
public static class DisplayCutoutView extends View implements DisplayManager.DisplayListener,
RegionInterceptableView {
+ private static final float HIDDEN_CAMERA_PROTECTION_SCALE = 0.5f;
+
private final DisplayInfo mInfo = new DisplayInfo();
private final Paint mPaint = new Paint();
private final List<Rect> mBounds = new ArrayList();
@@ -732,6 +737,8 @@
private int mRotation;
private int mInitialPosition;
private int mPosition;
+ private float mCameraProtectionProgress = HIDDEN_CAMERA_PROTECTION_SCALE;
+ private ValueAnimator mCameraProtectionAnimator;
public DisplayCutoutView(Context context, @BoundsPosition int pos,
ScreenDecorations decorations) {
@@ -770,17 +777,18 @@
getLocationOnScreen(mLocation);
canvas.translate(-mLocation[0], -mLocation[1]);
- if (mShowProtection && !mProtectionRect.isEmpty()) {
- mPaint.setColor(mColor);
- mPaint.setStyle(Paint.Style.FILL);
- mPaint.setAntiAlias(true);
- canvas.drawPath(mProtectionPath, mPaint);
- } else if (!mBoundingPath.isEmpty()) {
+ if (!mBoundingPath.isEmpty()) {
mPaint.setColor(mColor);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
canvas.drawPath(mBoundingPath, mPaint);
}
+ if (mCameraProtectionProgress > HIDDEN_CAMERA_PROTECTION_SCALE
+ && !mProtectionRect.isEmpty()) {
+ canvas.scale(mCameraProtectionProgress, mCameraProtectionProgress,
+ mProtectionRect.centerX(), mProtectionRect.centerY());
+ canvas.drawPath(mProtectionPath, mPaint);
+ }
}
@Override
@@ -815,8 +823,31 @@
mShowProtection = shouldShow;
updateBoundingPath();
- requestLayout();
- invalidate();
+ // Delay the relayout until the end of the animation when hiding the cutout,
+ // otherwise we'd clip it.
+ if (mShowProtection) {
+ requestLayout();
+ }
+ if (mCameraProtectionAnimator != null) {
+ mCameraProtectionAnimator.cancel();
+ }
+ mCameraProtectionAnimator = ValueAnimator.ofFloat(mCameraProtectionProgress,
+ mShowProtection ? 1.0f : HIDDEN_CAMERA_PROTECTION_SCALE).setDuration(750);
+ mCameraProtectionAnimator.setInterpolator(Interpolators.DECELERATE_QUINT);
+ mCameraProtectionAnimator.addUpdateListener(animation -> {
+ mCameraProtectionProgress = (float) animation.getAnimatedValue();
+ invalidate();
+ });
+ mCameraProtectionAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mCameraProtectionAnimator = null;
+ if (!mShowProtection) {
+ requestLayout();
+ }
+ }
+ });
+ mCameraProtectionAnimator.start();
}
private void update() {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
index f2c8490..d56428d 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -25,9 +25,9 @@
import android.service.controls.actions.ControlAction
import android.service.controls.templates.ControlTemplate
import android.service.controls.templates.TemperatureControlTemplate
-import android.service.controls.templates.ThumbnailTemplate
import android.service.controls.templates.ToggleRangeTemplate
import android.service.controls.templates.ToggleTemplate
+import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
@@ -97,15 +97,8 @@
}
fun actionResponse(@ControlAction.ResponseResult response: Int) {
- val text = when (response) {
- ControlAction.RESPONSE_OK -> "Success"
- ControlAction.RESPONSE_FAIL -> "Error"
- else -> ""
- }
-
- if (!text.isEmpty()) {
- setTransientStatus(text)
- }
+ // TODO: b/150931809 - handle response codes
+ Log.d(ControlsUiController.TAG, "Received response code: $response")
}
fun setTransientStatus(tempStatus: String) {
@@ -131,7 +124,6 @@
template is ToggleTemplate -> ToggleBehavior::class
template is ToggleRangeTemplate -> ToggleRangeBehavior::class
template is TemperatureControlTemplate -> TemperatureControlBehavior::class
- template is ThumbnailTemplate -> StaticBehavior::class
else -> DefaultBehavior::class
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt
deleted file mode 100644
index c006d6f..0000000
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.controls.ui
-
-import android.graphics.drawable.ClipDrawable
-import android.graphics.drawable.LayerDrawable
-import android.service.controls.Control
-import android.service.controls.templates.ThumbnailTemplate
-
-import com.android.systemui.R
-import com.android.systemui.controls.ui.ControlActionCoordinator.MAX_LEVEL
-
-/**
- * Used for controls that cannot be interacted with. Information is presented to the user
- * but no actions can be taken. If using a ThumbnailTemplate, the background image will
- * be changed.
- */
-class StaticBehavior() : Behavior {
- lateinit var control: Control
- lateinit var cvh: ControlViewHolder
-
- override fun initialize(cvh: ControlViewHolder) {
- this.cvh = cvh
- }
-
- override fun bind(cws: ControlWithState) {
- this.control = cws.control!!
-
- cvh.status.setText(control.getStatusText())
-
- val ld = cvh.layout.getBackground() as LayerDrawable
- val clipLayer = ld.findDrawableByLayerId(R.id.clip_layer) as ClipDrawable
-
- clipLayer.setLevel(MAX_LEVEL)
- cvh.setEnabled(true)
- cvh.applyRenderInfo(RenderInfo.lookup(control.getDeviceType(), true))
-
- val template = control.getControlTemplate()
- if (template is ThumbnailTemplate) {
- cvh.bgExecutor.execute {
- // clear the default tinting in favor of only using alpha
- val drawable = template.getThumbnail().loadDrawable(cvh.context)
- drawable.setTintList(null)
- drawable.setAlpha((0.45 * 255).toInt())
- cvh.uiExecutor.execute {
- val radius = cvh.context.getResources()
- .getDimensionPixelSize(R.dimen.control_corner_radius).toFloat()
- clipLayer.setDrawable(CornerDrawable(drawable, radius))
- }
- }
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
index 1fc1fe4..36b5fad 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
@@ -19,11 +19,8 @@
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.annotation.IntDef;
-import android.annotation.MainThread;
import android.content.Context;
import android.graphics.Rect;
-import android.os.RemoteException;
-import android.view.IWindowContainer;
import android.view.SurfaceControl;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
@@ -61,31 +58,30 @@
com.android.internal.R.interpolator.fast_out_slow_in);
}
- @MainThread
- PipTransitionAnimator getAnimator(IWindowContainer wc, boolean scheduleFinishPip,
+ PipTransitionAnimator getAnimator(SurfaceControl leash, boolean scheduleFinishPip,
Rect destinationBounds, float alphaStart, float alphaEnd) {
if (mCurrentAnimator == null) {
mCurrentAnimator = setupPipTransitionAnimator(
- PipTransitionAnimator.ofAlpha(wc, scheduleFinishPip,
- destinationBounds, alphaStart, alphaEnd));
+ PipTransitionAnimator.ofAlpha(leash, scheduleFinishPip, destinationBounds,
+ alphaStart, alphaEnd));
} else if (mCurrentAnimator.getAnimationType() == ANIM_TYPE_ALPHA
&& mCurrentAnimator.isRunning()) {
mCurrentAnimator.updateEndValue(alphaEnd);
} else {
mCurrentAnimator.cancel();
mCurrentAnimator = setupPipTransitionAnimator(
- PipTransitionAnimator.ofAlpha(wc, scheduleFinishPip,
- destinationBounds, alphaStart, alphaEnd));
+ PipTransitionAnimator.ofAlpha(leash, scheduleFinishPip, destinationBounds,
+ alphaStart, alphaEnd));
}
return mCurrentAnimator;
}
- @MainThread
- PipTransitionAnimator getAnimator(IWindowContainer wc, boolean scheduleFinishPip,
+ PipTransitionAnimator getAnimator(SurfaceControl leash, boolean scheduleFinishPip,
Rect startBounds, Rect endBounds) {
if (mCurrentAnimator == null) {
mCurrentAnimator = setupPipTransitionAnimator(
- PipTransitionAnimator.ofBounds(wc, scheduleFinishPip, startBounds, endBounds));
+ PipTransitionAnimator.ofBounds(leash, scheduleFinishPip,
+ startBounds, endBounds));
} else if (mCurrentAnimator.getAnimationType() == ANIM_TYPE_BOUNDS
&& mCurrentAnimator.isRunning()) {
mCurrentAnimator.setDestinationBounds(endBounds);
@@ -94,7 +90,8 @@
} else {
mCurrentAnimator.cancel();
mCurrentAnimator = setupPipTransitionAnimator(
- PipTransitionAnimator.ofBounds(wc, scheduleFinishPip, startBounds, endBounds));
+ PipTransitionAnimator.ofBounds(leash, scheduleFinishPip,
+ startBounds, endBounds));
}
return mCurrentAnimator;
}
@@ -116,18 +113,18 @@
/**
* Called when PiP animation is started.
*/
- public void onPipAnimationStart(IWindowContainer wc, PipTransitionAnimator animator) {}
+ public void onPipAnimationStart(PipTransitionAnimator animator) {}
/**
* Called when PiP animation is ended.
*/
- public void onPipAnimationEnd(IWindowContainer wc, SurfaceControl.Transaction tx,
+ public void onPipAnimationEnd(SurfaceControl.Transaction tx,
PipTransitionAnimator animator) {}
/**
* Called when PiP animation is cancelled.
*/
- public void onPipAnimationCancel(IWindowContainer wc, PipTransitionAnimator animator) {}
+ public void onPipAnimationCancel(PipTransitionAnimator animator) {}
}
/**
@@ -137,7 +134,6 @@
public abstract static class PipTransitionAnimator<T> extends ValueAnimator implements
ValueAnimator.AnimatorUpdateListener,
ValueAnimator.AnimatorListener {
- private final IWindowContainer mWindowContainer;
private final boolean mScheduleFinishPip;
private final SurfaceControl mLeash;
private final @AnimationType int mAnimationType;
@@ -149,23 +145,18 @@
private PipAnimationCallback mPipAnimationCallback;
private SurfaceControlTransactionFactory mSurfaceControlTransactionFactory;
- private PipTransitionAnimator(IWindowContainer wc, boolean scheduleFinishPip,
+ private PipTransitionAnimator(SurfaceControl leash, boolean scheduleFinishPip,
@AnimationType int animationType, Rect destinationBounds,
T startValue, T endValue) {
- mWindowContainer = wc;
mScheduleFinishPip = scheduleFinishPip;
- try {
- mLeash = wc.getLeash();
- mAnimationType = animationType;
- mDestinationBounds.set(destinationBounds);
- mStartValue = startValue;
- mEndValue = endValue;
- addListener(this);
- addUpdateListener(this);
- mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
+ mLeash = leash;
+ mAnimationType = animationType;
+ mDestinationBounds.set(destinationBounds);
+ mStartValue = startValue;
+ mEndValue = endValue;
+ addListener(this);
+ addUpdateListener(this);
+ mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
}
@Override
@@ -173,7 +164,7 @@
mCurrentValue = mStartValue;
applySurfaceControlTransaction(mLeash, newSurfaceControlTransaction(), FRACTION_START);
if (mPipAnimationCallback != null) {
- mPipAnimationCallback.onPipAnimationStart(mWindowContainer, this);
+ mPipAnimationCallback.onPipAnimationStart(this);
}
}
@@ -189,14 +180,14 @@
final SurfaceControl.Transaction tx = newSurfaceControlTransaction();
applySurfaceControlTransaction(mLeash, tx, FRACTION_END);
if (mPipAnimationCallback != null) {
- mPipAnimationCallback.onPipAnimationEnd(mWindowContainer, tx, this);
+ mPipAnimationCallback.onPipAnimationEnd(tx, this);
}
}
@Override
public void onAnimationCancel(Animator animation) {
if (mPipAnimationCallback != null) {
- mPipAnimationCallback.onPipAnimationCancel(mWindowContainer, this);
+ mPipAnimationCallback.onPipAnimationCancel(this);
}
}
@@ -260,9 +251,9 @@
abstract void applySurfaceControlTransaction(SurfaceControl leash,
SurfaceControl.Transaction tx, float fraction);
- static PipTransitionAnimator<Float> ofAlpha(IWindowContainer wc, boolean scheduleFinishPip,
+ static PipTransitionAnimator<Float> ofAlpha(SurfaceControl leash, boolean scheduleFinishPip,
Rect destinationBounds, float startValue, float endValue) {
- return new PipTransitionAnimator<Float>(wc, scheduleFinishPip, ANIM_TYPE_ALPHA,
+ return new PipTransitionAnimator<Float>(leash, scheduleFinishPip, ANIM_TYPE_ALPHA,
destinationBounds, startValue, endValue) {
@Override
void applySurfaceControlTransaction(SurfaceControl leash,
@@ -281,10 +272,10 @@
};
}
- static PipTransitionAnimator<Rect> ofBounds(IWindowContainer wc, boolean scheduleFinishPip,
+ static PipTransitionAnimator<Rect> ofBounds(SurfaceControl leash, boolean scheduleFinishPip,
Rect startValue, Rect endValue) {
// construct new Rect instances in case they are recycled
- return new PipTransitionAnimator<Rect>(wc, scheduleFinishPip, ANIM_TYPE_BOUNDS,
+ return new PipTransitionAnimator<Rect>(leash, scheduleFinishPip, ANIM_TYPE_BOUNDS,
endValue, new Rect(startValue), new Rect(endValue)) {
private final Rect mTmpRect = new Rect();
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index 836485a..4766ebc 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
@@ -30,6 +30,7 @@
import android.graphics.Rect;
import android.os.Handler;
import android.os.Looper;
+import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.DisplayInfo;
@@ -38,9 +39,13 @@
import android.view.SurfaceControl;
import android.view.WindowContainerTransaction;
+import com.android.internal.os.SomeArgs;
+import com.android.systemui.pip.phone.PipUpdateThread;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.function.Consumer;
/**
* Manages PiP tasks such as resize and offset.
@@ -56,7 +61,13 @@
public class PipTaskOrganizer extends ITaskOrganizer.Stub {
private static final String TAG = PipTaskOrganizer.class.getSimpleName();
+ private static final int MSG_RESIZE_IMMEDIATE = 1;
+ private static final int MSG_RESIZE_ANIMATE = 2;
+ private static final int MSG_OFFSET_ANIMATE = 3;
+ private static final int MSG_FINISH_RESIZE = 4;
+
private final Handler mMainHandler;
+ private final Handler mUpdateHandler;
private final ITaskOrganizerController mTaskOrganizerController;
private final PipBoundsHandler mPipBoundsHandler;
private final PipAnimationController mPipAnimationController;
@@ -64,11 +75,11 @@
private final Rect mDisplayBounds = new Rect();
private final Rect mLastReportedBounds = new Rect();
+ // These callbacks are called on the update thread
private final PipAnimationController.PipAnimationCallback mPipAnimationCallback =
new PipAnimationController.PipAnimationCallback() {
@Override
- public void onPipAnimationStart(IWindowContainer wc,
- PipAnimationController.PipTransitionAnimator animator) {
+ public void onPipAnimationStart(PipAnimationController.PipTransitionAnimator animator) {
mMainHandler.post(() -> {
for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) {
final PipTransitionCallback callback = mPipTransitionCallbacks.get(i);
@@ -78,7 +89,7 @@
}
@Override
- public void onPipAnimationEnd(IWindowContainer wc, SurfaceControl.Transaction tx,
+ public void onPipAnimationEnd(SurfaceControl.Transaction tx,
PipAnimationController.PipTransitionAnimator animator) {
mMainHandler.post(() -> {
for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) {
@@ -86,13 +97,11 @@
callback.onPipTransitionFinished();
}
});
- final Rect destinationBounds = animator.getDestinationBounds();
- finishResizeInternal(destinationBounds, wc, tx, animator.shouldScheduleFinishPip());
+ finishResize(animator.getDestinationBounds(), tx, animator.shouldScheduleFinishPip());
}
@Override
- public void onPipAnimationCancel(IWindowContainer wc,
- PipAnimationController.PipTransitionAnimator animator) {
+ public void onPipAnimationCancel(PipAnimationController.PipTransitionAnimator animator) {
mMainHandler.post(() -> {
for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) {
final PipTransitionCallback callback = mPipTransitionCallbacks.get(i);
@@ -102,28 +111,75 @@
}
};
+ private Handler.Callback mUpdateCallbacks = new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ SomeArgs args = (SomeArgs) msg.obj;
+ Consumer<Rect> updateBoundsCallback = (Consumer<Rect>) args.arg1;
+ switch (msg.what) {
+ case MSG_RESIZE_IMMEDIATE: {
+ Rect toBounds = (Rect) args.arg2;
+ resizePip(toBounds);
+ if (updateBoundsCallback != null) {
+ updateBoundsCallback.accept(toBounds);
+ }
+ break;
+ }
+ case MSG_RESIZE_ANIMATE: {
+ Rect currentBounds = (Rect) args.arg2;
+ Rect toBounds = (Rect) args.arg3;
+ boolean scheduleFinishPip = args.argi1 != 0;
+ int duration = args.argi2;
+ animateResizePip(scheduleFinishPip, currentBounds, toBounds, duration);
+ if (updateBoundsCallback != null) {
+ updateBoundsCallback.accept(toBounds);
+ }
+ break;
+ }
+ case MSG_OFFSET_ANIMATE: {
+ Rect originalBounds = (Rect) args.arg2;
+ final int offset = args.argi1;
+ final int duration = args.argi2;
+ offsetPip(originalBounds, 0 /* xOffset */, offset, duration);
+ Rect toBounds = new Rect(originalBounds);
+ toBounds.offset(0, offset);
+ if (updateBoundsCallback != null) {
+ updateBoundsCallback.accept(toBounds);
+ }
+ break;
+ }
+ case MSG_FINISH_RESIZE: {
+ SurfaceControl.Transaction tx = (SurfaceControl.Transaction) args.arg2;
+ Rect toBounds = (Rect) args.arg3;
+ boolean scheduleFinishPip = args.argi1 != 0;
+ finishResize(toBounds, tx, scheduleFinishPip);
+ if (updateBoundsCallback != null) {
+ updateBoundsCallback.accept(toBounds);
+ }
+ break;
+ }
+ }
+ args.recycle();
+ return true;
+ }
+ };
+
private ActivityManager.RunningTaskInfo mTaskInfo;
+ private IWindowContainer mToken;
+ private SurfaceControl mLeash;
+ private boolean mInPip;
private @PipAnimationController.AnimationType int mOneShotAnimationType = ANIM_TYPE_BOUNDS;
public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler) {
mMainHandler = new Handler(Looper.getMainLooper());
+ mUpdateHandler = new Handler(PipUpdateThread.get().getLooper(), mUpdateCallbacks);
mTaskOrganizerController = ActivityTaskManager.getTaskOrganizerController();
mPipBoundsHandler = boundsHandler;
mPipAnimationController = new PipAnimationController(context);
}
- /**
- * Offset the PiP window, animate if the given duration is not {@link #DURATION_NONE}
- */
- public void offsetPinnedStack(Rect originalBounds, int xOffset, int yOffset, int durationMs) {
- if (mTaskInfo == null) {
- Log.w(TAG, "mTaskInfo is not set");
- return;
- }
- final Rect destinationBounds = new Rect(originalBounds);
- destinationBounds.offset(xOffset, yOffset);
- animateResizePipInternal(mTaskInfo.token, false /* scheduleFinishPip*/,
- originalBounds, destinationBounds, durationMs);
+ public Handler getUpdateHandler() {
+ return mUpdateHandler;
}
/**
@@ -171,7 +227,7 @@
try {
mLastReportedBounds.set(destinationBounds);
final WindowContainerTransaction wct = new WindowContainerTransaction();
- wct.setBounds(mTaskInfo.token, destinationBounds);
+ wct.setBounds(mToken, destinationBounds);
mTaskOrganizerController.applyContainerTransaction(wct, null /* ITaskOrganizer */);
} catch (RemoteException e) {
Log.w(TAG, "Failed to apply window container transaction", e);
@@ -185,13 +241,20 @@
getAspectRatioOrDefault(info.pictureInPictureParams), null /* bounds */);
Objects.requireNonNull(destinationBounds, "Missing destination bounds");
mTaskInfo = info;
+ mToken = mTaskInfo.token;
+ mInPip = true;
+ try {
+ mLeash = mToken.getLeash();
+ } catch (RemoteException e) {
+ throw new RuntimeException("Unable to get leash", e);
+ }
if (mOneShotAnimationType == ANIM_TYPE_BOUNDS) {
final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
- animateResizePipInternal(mTaskInfo.token, true /* scheduleFinishPip */,
- currentBounds, destinationBounds, DURATION_DEFAULT_MS);
+ scheduleAnimateResizePip(true /* scheduleFinishPip */,
+ currentBounds, destinationBounds, DURATION_DEFAULT_MS, null);
} else if (mOneShotAnimationType == ANIM_TYPE_ALPHA) {
- mMainHandler.post(() -> mPipAnimationController
- .getAnimator(mTaskInfo.token, true /* scheduleFinishPip */,
+ mUpdateHandler.post(() -> mPipAnimationController
+ .getAnimator(mLeash, true /* scheduleFinishPip */,
destinationBounds, 0f, 1f)
.setPipAnimationCallback(mPipAnimationCallback)
.setDuration(DURATION_DEFAULT_MS)
@@ -205,12 +268,12 @@
@Override
public void taskVanished(IWindowContainer token) {
Objects.requireNonNull(token, "Requires valid IWindowContainer");
- if (token.asBinder() != mTaskInfo.token.asBinder()) {
+ if (token.asBinder() != mToken.asBinder()) {
Log.wtf(TAG, "Unrecognized token: " + token);
return;
}
- animateResizePipInternal(token, false /* scheduleFinishPip */,
- mLastReportedBounds, mDisplayBounds, DURATION_DEFAULT_MS);
+ scheduleAnimateResizePip(mDisplayBounds, DURATION_DEFAULT_MS, null);
+ mInPip = false;
}
@Override
@@ -227,7 +290,7 @@
final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds(
getAspectRatioOrDefault(newParams), null /* bounds */);
Objects.requireNonNull(destinationBounds, "Missing destination bounds");
- animateResizePip(destinationBounds, DURATION_DEFAULT_MS);
+ scheduleAnimateResizePip(destinationBounds, DURATION_DEFAULT_MS, null);
}
/**
@@ -243,102 +306,158 @@
}
/**
- * Directly perform manipulation/resize on the leash. This will not perform any
- * {@link WindowContainerTransaction} until {@link #finishResize} is called.
+ * Animates resizing of the pinned stack given the duration.
*/
- public void resizePip(Rect destinationBounds) {
- Objects.requireNonNull(mTaskInfo, "Requires valid IWindowContainer");
- resizePipInternal(mTaskInfo.token, destinationBounds);
+ public void scheduleAnimateResizePip(Rect toBounds, int duration,
+ Consumer<Rect> updateBoundsCallback) {
+ scheduleAnimateResizePip(false /* scheduleFinishPip */,
+ mLastReportedBounds, toBounds, duration, updateBoundsCallback);
}
- private void resizePipInternal(IWindowContainer wc,
- Rect destinationBounds) {
- Objects.requireNonNull(mTaskInfo, "Requires valid IWindowContainer");
- try {
- // Could happen when dismissPip
- if (wc == null || wc.getLeash() == null) {
- Log.w(TAG, "Abort animation, invalid leash");
- return;
- }
- final SurfaceControl leash = wc.getLeash();
- new SurfaceControl.Transaction()
- .setPosition(leash, destinationBounds.left, destinationBounds.top)
- .setWindowCrop(leash, destinationBounds.width(), destinationBounds.height())
- .apply();
- } catch (RemoteException e) {
- Log.w(TAG, "Abort animation, invalid window container", e);
- } catch (Exception e) {
- Log.e(TAG, "Should not reach here, terrible thing happened", e);
+ private void scheduleAnimateResizePip(boolean scheduleFinishPip,
+ Rect currentBounds, Rect destinationBounds, int durationMs,
+ Consumer<Rect> updateBoundsCallback) {
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ if (!mInPip) {
+ // Ignore animation when we are no longer in PIP
+ return;
}
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = updateBoundsCallback;
+ args.arg2 = currentBounds;
+ args.arg3 = destinationBounds;
+ args.argi1 = scheduleFinishPip ? 1 : 0;
+ args.argi2 = durationMs;
+ mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_RESIZE_ANIMATE, args));
+ }
+
+ /**
+ * Directly perform manipulation/resize on the leash. This will not perform any
+ * {@link WindowContainerTransaction} until {@link #scheduleFinishResizePip} is called.
+ */
+ public void scheduleResizePip(Rect toBounds, Consumer<Rect> updateBoundsCallback) {
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = updateBoundsCallback;
+ args.arg2 = toBounds;
+ mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_RESIZE_IMMEDIATE, args));
}
/**
* Finish a intermediate resize operation. This is expected to be called after
- * {@link #resizePip}.
+ * {@link #scheduleResizePip}.
*/
- public void finishResize(Rect destinationBounds) {
- try {
- final IWindowContainer wc = mTaskInfo.token;
- SurfaceControl.Transaction tx = new SurfaceControl.Transaction()
- .setPosition(wc.getLeash(), destinationBounds.left,
- destinationBounds.top)
- .setWindowCrop(wc.getLeash(), destinationBounds.width(),
- destinationBounds.height());
- finishResizeInternal(destinationBounds, wc, tx, false);
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to obtain leash");
- }
+ public void scheduleFinishResizePip(Rect destinationBounds) {
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ SurfaceControl.Transaction tx = new SurfaceControl.Transaction()
+ .setPosition(mLeash, destinationBounds.left, destinationBounds.top)
+ .setWindowCrop(mLeash, destinationBounds.width(), destinationBounds.height());
+ scheduleFinishResizePip(tx, destinationBounds, false /* scheduleFinishPip */,
+ null);
}
- private void finishResizeInternal(Rect destinationBounds, IWindowContainer wc,
- SurfaceControl.Transaction tx, boolean shouldScheduleFinishPip) {
+ private void scheduleFinishResizePip(SurfaceControl.Transaction tx,
+ Rect destinationBounds, boolean scheduleFinishPip,
+ Consumer<Rect> updateBoundsCallback) {
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = updateBoundsCallback;
+ args.arg2 = tx;
+ args.arg3 = destinationBounds;
+ args.argi1 = scheduleFinishPip ? 1 : 0;
+ mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_FINISH_RESIZE, args));
+ }
+
+ /**
+ * Offset the PiP window, animate if the given duration is not {@link #DURATION_NONE}
+ */
+ public void scheduleOffsetPip(Rect originalBounds, int offset, int duration,
+ Consumer<Rect> updateBoundsCallback) {
+ if (!mInPip) {
+ // Ignore offsets when we are no longer in PIP
+ return;
+ }
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = updateBoundsCallback;
+ args.arg2 = originalBounds;
+ // offset would be zero if triggered from screen rotation.
+ args.argi1 = offset;
+ args.argi2 = duration;
+ mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_OFFSET_ANIMATE, args));
+ }
+
+ private void offsetPip(Rect originalBounds, int xOffset, int yOffset, int durationMs) {
+ if (Looper.myLooper() != mUpdateHandler.getLooper()) {
+ throw new RuntimeException("Callers should call scheduleOffsetPip() instead of this "
+ + "directly");
+ }
+ if (mTaskInfo == null) {
+ Log.w(TAG, "mTaskInfo is not set");
+ return;
+ }
+ final Rect destinationBounds = new Rect(originalBounds);
+ destinationBounds.offset(xOffset, yOffset);
+ animateResizePip(false /* scheduleFinishPip*/, originalBounds, destinationBounds,
+ durationMs);
+ }
+
+ private void resizePip(Rect destinationBounds) {
+ if (Looper.myLooper() != mUpdateHandler.getLooper()) {
+ throw new RuntimeException("Callers should call scheduleResizePip() instead of this "
+ + "directly");
+ }
+ Objects.requireNonNull(mToken, "Requires valid IWindowContainer");
+ // Could happen when dismissPip
+ if (mToken == null || mLeash == null) {
+ Log.w(TAG, "Abort animation, invalid leash");
+ return;
+ }
+ new SurfaceControl.Transaction()
+ .setPosition(mLeash, destinationBounds.left, destinationBounds.top)
+ .setWindowCrop(mLeash, destinationBounds.width(), destinationBounds.height())
+ .apply();
+ }
+
+ private void finishResize(Rect destinationBounds, SurfaceControl.Transaction tx,
+ boolean shouldScheduleFinishPip) {
+ if (Looper.myLooper() != mUpdateHandler.getLooper()) {
+ throw new RuntimeException("Callers should call scheduleResizePip() instead of this "
+ + "directly");
+ }
mLastReportedBounds.set(destinationBounds);
try {
final WindowContainerTransaction wct = new WindowContainerTransaction();
if (shouldScheduleFinishPip) {
- wct.scheduleFinishEnterPip(wc, destinationBounds);
+ wct.scheduleFinishEnterPip(mToken, destinationBounds);
} else {
- wct.setBounds(wc, destinationBounds);
+ wct.setBounds(mToken, destinationBounds);
}
- wct.setBoundsChangeTransaction(mTaskInfo.token, tx);
+ wct.setBoundsChangeTransaction(mToken, tx);
mTaskOrganizerController.applyContainerTransaction(wct, null /* ITaskOrganizer */);
} catch (RemoteException e) {
Log.e(TAG, "Failed to apply container transaction", e);
}
}
- /**
- * Animates resizing of the pinned stack given the duration.
- */
- public void animateResizePip(Rect destinationBounds, int durationMs) {
- Objects.requireNonNull(mTaskInfo, "Requires valid IWindowContainer");
- animateResizePipInternal(mTaskInfo.token, false, mLastReportedBounds,
- destinationBounds, durationMs);
- }
-
- private void animateResizePipInternal(IWindowContainer wc, boolean scheduleFinishPip,
- Rect currentBounds, Rect destinationBounds, int durationMs) {
- try {
- // Could happen when dismissPip
- if (wc == null || wc.getLeash() == null) {
- Log.w(TAG, "Abort animation, invalid leash");
- return;
- }
- final SurfaceControl leash = wc.getLeash();
-
- mMainHandler.post(() -> mPipAnimationController
- .getAnimator(wc, scheduleFinishPip, currentBounds, destinationBounds)
- .setPipAnimationCallback(mPipAnimationCallback)
- .setDuration(durationMs)
- .start());
- } catch (RemoteException e) {
- Log.w(TAG, "Abort animation, invalid window container", e);
- } catch (Exception e) {
- Log.e(TAG, "Should not reach here, terrible thing happened", e);
+ private void animateResizePip(boolean scheduleFinishPip, Rect currentBounds,
+ Rect destinationBounds, int durationMs) {
+ if (Looper.myLooper() != mUpdateHandler.getLooper()) {
+ throw new RuntimeException("Callers should call scheduleAnimateResizePip() instead of "
+ + "this directly");
}
+ // Could happen when dismissPip
+ if (mToken == null || mLeash == null) {
+ Log.w(TAG, "Abort animation, invalid leash");
+ return;
+ }
+ mUpdateHandler.post(() -> mPipAnimationController
+ .getAnimator(mLeash, scheduleFinishPip, currentBounds, destinationBounds)
+ .setPipAnimationCallback(mPipAnimationCallback)
+ .setDuration(durationMs)
+ .start());
}
-
private float getAspectRatioOrDefault(@Nullable PictureInPictureParams params) {
return params == null
? mPipBoundsHandler.getDefaultAspectRatio()
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index fdaf66a..33760be 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -28,16 +28,11 @@
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Debug;
-import android.os.Handler;
-import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
-import android.view.Choreographer;
import androidx.dynamicanimation.animation.SpringForce;
-import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
-import com.android.internal.os.SomeArgs;
import com.android.systemui.pip.PipSnapAlgorithm;
import com.android.systemui.pip.PipTaskOrganizer;
import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -47,11 +42,12 @@
import com.android.systemui.util.animation.PhysicsAnimator;
import java.io.PrintWriter;
+import java.util.function.Consumer;
/**
* A helper to animate and manipulate the PiP.
*/
-public class PipMotionHelper implements Handler.Callback, PipAppOpsListener.Callback,
+public class PipMotionHelper implements PipAppOpsListener.Callback,
FloatingContentCoordinator.FloatingContent {
private static final String TAG = "PipMotionHelper";
@@ -68,14 +64,9 @@
// The fraction of the stack height that the user has to drag offscreen to dismiss the PiP
private static final float DISMISS_OFFSCREEN_FRACTION = 0.3f;
- private static final int MSG_RESIZE_IMMEDIATE = 1;
- private static final int MSG_RESIZE_ANIMATE = 2;
- private static final int MSG_OFFSET_ANIMATE = 3;
-
private final Context mContext;
private final IActivityTaskManager mActivityTaskManager;
private final PipTaskOrganizer mPipTaskOrganizer;
- private final Handler mHandler;
private PipMenuActivityController mMenuController;
private PipSnapAlgorithm mSnapAlgorithm;
@@ -92,9 +83,6 @@
/** The region that all of PIP must stay within. */
private Rect mFloatingAllowedArea = new Rect();
- private final SfVsyncFrameCallbackProvider mSfVsyncFrameProvider =
- new SfVsyncFrameCallbackProvider();
-
/**
* Bounds that are animated using the physics animator.
*/
@@ -112,16 +100,11 @@
private PhysicsAnimator<Rect> mAnimatedBoundsPhysicsAnimator = PhysicsAnimator.getInstance(
mAnimatedBounds);
- /** Callback that re-sizes PIP to the animated bounds. */
- private final Choreographer.FrameCallback mResizePipVsyncCallback =
- l -> resizePipUnchecked(mAnimatedBounds);
-
/**
- * Update listener that posts a vsync frame callback to resize PIP to {@link #mAnimatedBounds}.
+ * Update listener that resizes the PIP to {@link #mAnimatedBounds}.
*/
- private final PhysicsAnimator.UpdateListener<Rect> mResizePipVsyncUpdateListener =
- (target, values) ->
- mSfVsyncFrameProvider.postFrameCallback(mResizePipVsyncCallback);
+ private final PhysicsAnimator.UpdateListener<Rect> mResizePipUpdateListener =
+ (target, values) -> resizePipUnchecked(mAnimatedBounds);
/** FlingConfig instances provided to PhysicsAnimator for fling gestures. */
private PhysicsAnimator.FlingConfig mFlingConfigX;
@@ -137,12 +120,13 @@
new PhysicsAnimator.SpringConfig(
SpringForce.STIFFNESS_LOW, SpringForce.DAMPING_RATIO_LOW_BOUNCY);
+ private final Consumer<Rect> mUpdateBoundsCallback = (toBounds) -> mBounds.set(toBounds);
+
public PipMotionHelper(Context context, IActivityTaskManager activityTaskManager,
PipTaskOrganizer pipTaskOrganizer, PipMenuActivityController menuController,
PipSnapAlgorithm snapAlgorithm, FlingAnimationUtils flingAnimationUtils,
FloatingContentCoordinator floatingContentCoordinator) {
mContext = context;
- mHandler = new Handler(ForegroundThread.get().getLooper(), this);
mActivityTaskManager = activityTaskManager;
mPipTaskOrganizer = pipTaskOrganizer;
mMenuController = menuController;
@@ -234,7 +218,7 @@
}
cancelAnimations();
mMenuController.hideMenuWithoutResize();
- mHandler.post(() -> {
+ mPipTaskOrganizer.getUpdateHandler().post(() -> {
try {
mActivityTaskManager.dismissPip(!skipAnimation, EXPAND_STACK_TO_FULLSCREEN_DURATION);
} catch (RemoteException e) {
@@ -253,7 +237,7 @@
}
cancelAnimations();
mMenuController.hideMenuWithoutResize();
- mHandler.post(() -> {
+ mPipTaskOrganizer.getUpdateHandler().post(() -> {
try {
mActivityTaskManager.removeStacksInWindowingModes(
new int[]{ WINDOWING_MODE_PINNED });
@@ -406,17 +390,13 @@
* Animates the PiP to offset it from the IME or shelf.
*/
void animateToOffset(Rect originalBounds, int offset) {
+ if (DEBUG) {
+ Log.d(TAG, "animateToOffset: originalBounds=" + originalBounds + " offset=" + offset
+ + " callers=\n" + Debug.getCallers(5, " "));
+ }
cancelAnimations();
- adjustAndAnimatePipOffset(originalBounds, offset, SHIFT_DURATION);
- }
-
- private void adjustAndAnimatePipOffset(Rect originalBounds, int offset, int duration) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = originalBounds;
- // offset would be zero if triggered from screen rotation.
- args.argi1 = offset;
- args.argi2 = duration;
- mHandler.sendMessage(mHandler.obtainMessage(MSG_OFFSET_ANIMATE, args));
+ mPipTaskOrganizer.scheduleOffsetPip(originalBounds, offset, SHIFT_DURATION,
+ mUpdateBoundsCallback);
}
/**
@@ -437,8 +417,7 @@
/**
* Starts the physics animator which will update the animated PIP bounds using physics
- * animations, as well as the TimeAnimator which will apply those bounds to PIP at intervals
- * synchronized with the SurfaceFlinger vsync frame provider.
+ * animations, as well as the TimeAnimator which will apply those bounds to PIP.
*
* This will also add end actions to the bounds animator that cancel the TimeAnimator and update
* the 'real' bounds to equal the final animated bounds.
@@ -448,7 +427,7 @@
mAnimatedBoundsPhysicsAnimator
.withEndActions(() -> mPipTaskOrganizer.onMotionMovementEnd(mAnimatedBounds))
- .addUpdateListener(mResizePipVsyncUpdateListener)
+ .addUpdateListener(mResizePipUpdateListener)
.start();
}
@@ -471,9 +450,7 @@
+ " callers=\n" + Debug.getCallers(5, " "));
}
if (!toBounds.equals(mBounds)) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = toBounds;
- mHandler.sendMessage(mHandler.obtainMessage(MSG_RESIZE_IMMEDIATE, args));
+ mPipTaskOrganizer.scheduleResizePip(toBounds, mUpdateBoundsCallback);
}
}
@@ -486,10 +463,7 @@
+ " duration=" + duration + " callers=\n" + Debug.getCallers(5, " "));
}
if (!toBounds.equals(mBounds)) {
- SomeArgs args = SomeArgs.obtain();
- args.arg1 = toBounds;
- args.argi1 = duration;
- mHandler.sendMessage(mHandler.obtainMessage(MSG_RESIZE_ANIMATE, args));
+ mPipTaskOrganizer.scheduleAnimateResizePip(toBounds, duration, mUpdateBoundsCallback);
setAnimatingToBounds(toBounds);
}
}
@@ -538,70 +512,6 @@
return dismissArea.contains(endpoint.x, endpoint.y);
}
- /**
- * Handles messages to be processed on the background thread.
- */
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_RESIZE_IMMEDIATE: {
- SomeArgs args = (SomeArgs) msg.obj;
- Rect toBounds = (Rect) args.arg1;
- mPipTaskOrganizer.resizePip(toBounds);
- mBounds.set(toBounds);
- return true;
- }
-
- case MSG_RESIZE_ANIMATE: {
- SomeArgs args = (SomeArgs) msg.obj;
- Rect toBounds = (Rect) args.arg1;
- int duration = args.argi1;
- try {
- StackInfo stackInfo = mActivityTaskManager.getStackInfo(
- WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
- if (stackInfo == null) {
- // In the case where we've already re-expanded or dismissed the PiP, then
- // just skip the resize
- return true;
- }
-
- mPipTaskOrganizer.animateResizePip(toBounds, duration);
- mBounds.set(toBounds);
- } catch (RemoteException e) {
- Log.e(TAG, "Could not animate resize pinned stack to bounds: " + toBounds, e);
- }
- return true;
- }
-
- case MSG_OFFSET_ANIMATE: {
- SomeArgs args = (SomeArgs) msg.obj;
- Rect originalBounds = (Rect) args.arg1;
- final int offset = args.argi1;
- final int duration = args.argi2;
- try {
- StackInfo stackInfo = mActivityTaskManager.getStackInfo(
- WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
- if (stackInfo == null) {
- // In the case where we've already re-expanded or dismissed the PiP, then
- // just skip the resize
- return true;
- }
-
- mPipTaskOrganizer.offsetPinnedStack(originalBounds,
- 0 /* xOffset */, offset, duration);
- Rect toBounds = new Rect(originalBounds);
- toBounds.offset(0, offset);
- mBounds.set(toBounds);
- } catch (RemoteException e) {
- Log.e(TAG, "Could not animate offset pinned stack with offset: " + offset, e);
- }
- return true;
- }
-
- default:
- return false;
- }
- }
-
public void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
pw.println(prefix + TAG);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/ForegroundThread.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipUpdateThread.java
similarity index 70%
rename from packages/SystemUI/src/com/android/systemui/pip/phone/ForegroundThread.java
rename to packages/SystemUI/src/com/android/systemui/pip/phone/PipUpdateThread.java
index 9bf46bb..6c5d846 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/ForegroundThread.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipUpdateThread.java
@@ -21,33 +21,38 @@
/**
* Similar to {@link com.android.internal.os.BackgroundThread}, this is a shared singleton
- * foreground thread for each process.
+ * foreground thread for each process for updating PIP.
*/
-public final class ForegroundThread extends HandlerThread {
- private static ForegroundThread sInstance;
+public final class PipUpdateThread extends HandlerThread {
+ private static PipUpdateThread sInstance;
private static Handler sHandler;
- private ForegroundThread() {
- super("recents.fg");
+ private PipUpdateThread() {
+ super("pip");
}
private static void ensureThreadLocked() {
if (sInstance == null) {
- sInstance = new ForegroundThread();
+ sInstance = new PipUpdateThread();
sInstance.start();
sHandler = new Handler(sInstance.getLooper());
}
}
- public static ForegroundThread get() {
- synchronized (ForegroundThread.class) {
+ /**
+ * @return the static update thread instance
+ */
+ public static PipUpdateThread get() {
+ synchronized (PipUpdateThread.class) {
ensureThreadLocked();
return sInstance;
}
}
-
+ /**
+ * @return the static update thread handler instance
+ */
public static Handler getHandler() {
- synchronized (ForegroundThread.class) {
+ synchronized (PipUpdateThread.class) {
ensureThreadLocked();
return sHandler;
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index ca44f6b..a5e9dbc 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -20,6 +20,8 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static com.android.systemui.pip.PipAnimationController.DURATION_DEFAULT_MS;
+
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityTaskManager;
@@ -50,7 +52,6 @@
import com.android.systemui.UiOffloadThread;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.pip.BasePipManager;
-import com.android.systemui.pip.PipAnimationController;
import com.android.systemui.pip.PipBoundsHandler;
import com.android.systemui.pip.PipTaskOrganizer;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -233,6 +234,7 @@
if (mInitialized) {
return;
}
+
mInitialized = true;
mContext = context;
mPipBoundsHandler = pipBoundsHandler;
@@ -434,8 +436,7 @@
mCurrentPipBounds = mPipBounds;
break;
}
- mPipTaskOrganizer.animateResizePip(mCurrentPipBounds,
- PipAnimationController.DURATION_DEFAULT_MS);
+ mPipTaskOrganizer.scheduleAnimateResizePip(mCurrentPipBounds, DURATION_DEFAULT_MS, null);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 37a8ca5..8b8b6f8 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -16,10 +16,6 @@
package com.android.systemui.screenshot;
-import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;
-
-import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_CORNER_FLOW;
-
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -33,7 +29,6 @@
import android.os.Messenger;
import android.os.RemoteException;
import android.os.UserManager;
-import android.provider.DeviceConfig;
import android.util.Log;
import android.view.WindowManager;
@@ -70,8 +65,7 @@
}
// TODO (mkephart): clean up once notifications flow is fully deprecated
- boolean useCornerFlow = DeviceConfig.getBoolean(
- NAMESPACE_SYSTEMUI, SCREENSHOT_CORNER_FLOW, true);
+ boolean useCornerFlow = true;
switch (msg.what) {
case WindowManager.TAKE_SCREENSHOT_FULLSCREEN:
if (useCornerFlow) {
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
index 333fa3c..c6eecf26 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
@@ -17,6 +17,8 @@
package com.android.systemui.stackdivider;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
+import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
import static android.view.Display.DEFAULT_DISPLAY;
import android.animation.Animator;
@@ -214,8 +216,22 @@
if (mTargetAdjusted) {
mSplitLayout.updateAdjustedBounds(mShownTop, mHiddenTop, mShownTop);
wct.setBounds(mSplits.mSecondary.token, mSplitLayout.mAdjustedSecondary);
+ // "Freeze" the configuration size so that the app doesn't get a config
+ // or relaunch. This is required because normally nav-bar contributes
+ // to configuration bounds (via nondecorframe).
+ Rect adjustAppBounds = new Rect(mSplits.mSecondary.configuration
+ .windowConfiguration.getAppBounds());
+ adjustAppBounds.offset(0, mSplitLayout.mAdjustedSecondary.top
+ - mSplitLayout.mSecondary.top);
+ wct.setAppBounds(mSplits.mSecondary.token, adjustAppBounds);
+ wct.setScreenSizeDp(mSplits.mSecondary.token,
+ mSplits.mSecondary.configuration.screenWidthDp,
+ mSplits.mSecondary.configuration.screenHeightDp);
} else {
wct.setBounds(mSplits.mSecondary.token, mSplitLayout.mSecondary);
+ wct.setAppBounds(mSplits.mSecondary.token, null);
+ wct.setScreenSizeDp(mSplits.mSecondary.token,
+ SCREEN_WIDTH_DP_UNDEFINED, SCREEN_HEIGHT_DP_UNDEFINED);
}
try {
ActivityTaskManager.getTaskOrganizerController()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index d746822..bd4984e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -315,7 +315,6 @@
mNotificationActivityStarter.startNotificationGutsIntent(intent, sbn.getUid(),
row);
};
- boolean isForBlockingHelper = row.isBlockingHelperShowing();
if (!userHandle.equals(UserHandle.ALL)
|| mLockscreenUserManager.getCurrentUserId() == UserHandle.USER_SYSTEM) {
@@ -335,13 +334,10 @@
row.getEntry().getChannel(),
row.getUniqueChannels(),
row.getEntry(),
- mCheckSaveListener,
onSettingsClick,
onAppSettingsClick,
mDeviceProvisionedController.isDeviceProvisioned(),
row.getIsNonblockable(),
- isForBlockingHelper,
- row.getEntry().getImportance(),
mHighPriorityProvider.isHighPriority(row.getEntry()));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 6b4511d..12aa4df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -24,10 +24,6 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.INotificationManager;
@@ -53,7 +49,6 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -63,42 +58,33 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.logging.NotificationCounters;
import java.lang.annotation.Retention;
import java.util.List;
import java.util.Set;
/**
- * The guts of a notification revealed when performing a long press. This also houses the blocking
- * helper affordance that allows a user to keep/stop notifications after swiping one away.
+ * The guts of a notification revealed when performing a long press.
*/
public class NotificationInfo extends LinearLayout implements NotificationGuts.GutsContent {
private static final String TAG = "InfoGuts";
@IntDef(prefix = { "ACTION_" }, value = {
ACTION_NONE,
- ACTION_UNDO,
+ ACTION_TOGGLE_ALERT,
ACTION_TOGGLE_SILENT,
- ACTION_BLOCK,
})
public @interface NotificationInfoAction {
}
public static final int ACTION_NONE = 0;
- static final int ACTION_UNDO = 1;
// standard controls
static final int ACTION_TOGGLE_SILENT = 2;
- // unused
- static final int ACTION_BLOCK = 3;
- // blocking helper
- static final int ACTION_DELIVER_SILENTLY = 4;
// standard controls
- private static final int ACTION_ALERT = 5;
+ private static final int ACTION_TOGGLE_ALERT = 5;
private TextView mPriorityDescriptionView;
private TextView mSilentDescriptionView;
@@ -128,101 +114,35 @@
@Nullable private Integer mChosenImportance;
private boolean mIsSingleDefaultChannel;
private boolean mIsNonblockable;
- private NotificationEntry mEntry;
private StatusBarNotification mSbn;
- private AnimatorSet mExpandAnimation;
private boolean mIsDeviceProvisioned;
- private CheckSaveListener mCheckSaveListener;
private OnSettingsClickListener mOnSettingsClickListener;
private OnAppSettingsClickListener mAppSettingsClickListener;
private NotificationGuts mGutsContainer;
private Drawable mPkgIcon;
- /** Whether this view is being shown as part of the blocking helper. */
- private boolean mIsForBlockingHelper;
-
@VisibleForTesting
boolean mSkipPost = false;
- /**
- * String that describes how the user exit or quit out of this view, also used as a counter tag.
- */
- private String mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
-
-
// used by standard ui
private OnClickListener mOnAlert = v -> {
- mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
mChosenImportance = IMPORTANCE_DEFAULT;
applyAlertingBehavior(BEHAVIOR_ALERTING, true /* userTriggered */);
};
// used by standard ui
private OnClickListener mOnSilent = v -> {
- mExitReason = NotificationCounters.BLOCKING_HELPER_DELIVER_SILENTLY;
mChosenImportance = IMPORTANCE_LOW;
applyAlertingBehavior(BEHAVIOR_SILENT, true /* userTriggered */);
};
-
// used by standard ui
private OnClickListener mOnDismissSettings = v -> {
mPressedApply = true;
closeControls(v, true);
};
- // used by blocking helper
- private OnClickListener mOnKeepShowing = v -> {
- mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
- closeControls(v, true);
- mMetricsLogger.write(getLogMaker().setCategory(
- MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT));
- };
-
- // used by blocking helper
- private OnClickListener mOnDeliverSilently = v -> {
- handleSaveImportance(
- ACTION_DELIVER_SILENTLY, MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT);
- };
-
- private void handleSaveImportance(int action, int metricsSubtype) {
- Runnable saveImportance = () -> {
- saveImportanceAndExitReason(action);
- if (mIsForBlockingHelper) {
- swapContent(action, true /* animate */);
- mMetricsLogger.write(getLogMaker()
- .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_ACTION)
- .setSubtype(metricsSubtype));
- }
- };
- if (mCheckSaveListener != null) {
- mCheckSaveListener.checkSave(saveImportance, mSbn);
- } else {
- saveImportance.run();
- }
- }
-
- private OnClickListener mOnUndo = v -> {
- // Reset exit counter that we'll log and record an undo event separately (not an exit event)
- mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
- if (mIsForBlockingHelper) {
- logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
- mMetricsLogger.write(getLogMaker().setCategory(
- MetricsEvent.NOTIFICATION_BLOCKING_HELPER)
- .setType(MetricsEvent.TYPE_DISMISS)
- .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO));
- } else {
- // TODO: this can't happen?
- mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS));
- }
- saveImportanceAndExitReason(ACTION_UNDO);
- swapContent(ACTION_UNDO, true /* animate */);
- };
-
public NotificationInfo(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -250,30 +170,6 @@
void onClick(View v, Intent intent);
}
- @VisibleForTesting
- void bindNotification(
- final PackageManager pm,
- final INotificationManager iNotificationManager,
- final VisualStabilityManager visualStabilityManager,
- final String pkg,
- final NotificationChannel notificationChannel,
- final Set<NotificationChannel> uniqueChannelsInRow,
- final NotificationEntry entry,
- final CheckSaveListener checkSaveListener,
- final OnSettingsClickListener onSettingsClick,
- final OnAppSettingsClickListener onAppSettingsClick,
- boolean isDeviceProvisioned,
- boolean isNonblockable,
- int importance,
- boolean wasShownHighPriority)
- throws RemoteException {
- bindNotification(pm, iNotificationManager, visualStabilityManager, pkg, notificationChannel,
- uniqueChannelsInRow, entry, checkSaveListener, onSettingsClick,
- onAppSettingsClick, isDeviceProvisioned, isNonblockable,
- false /* isBlockingHelper */,
- importance, wasShownHighPriority);
- }
-
public void bindNotification(
PackageManager pm,
INotificationManager iNotificationManager,
@@ -282,13 +178,10 @@
NotificationChannel notificationChannel,
Set<NotificationChannel> uniqueChannelsInRow,
NotificationEntry entry,
- CheckSaveListener checkSaveListener,
OnSettingsClickListener onSettingsClick,
OnAppSettingsClickListener onAppSettingsClick,
boolean isDeviceProvisioned,
boolean isNonblockable,
- boolean isForBlockingHelper,
- int importance,
boolean wasShownHighPriority)
throws RemoteException {
mINotificationManager = iNotificationManager;
@@ -298,18 +191,15 @@
mPackageName = pkg;
mUniqueChannelsInRow = uniqueChannelsInRow;
mNumUniqueChannelsInRow = uniqueChannelsInRow.size();
- mEntry = entry;
mSbn = entry.getSbn();
mPm = pm;
mAppSettingsClickListener = onAppSettingsClick;
mAppName = mPackageName;
- mCheckSaveListener = checkSaveListener;
mOnSettingsClickListener = onSettingsClick;
mSingleNotificationChannel = notificationChannel;
mStartingChannelImportance = mSingleNotificationChannel.getImportance();
mWasShownHighPriority = wasShownHighPriority;
mIsNonblockable = isNonblockable;
- mIsForBlockingHelper = isForBlockingHelper;
mAppUid = mSbn.getUid();
mDelegatePkg = mSbn.getOpPkg();
mIsDeviceProvisioned = isDeviceProvisioned;
@@ -329,36 +219,12 @@
bindHeader();
bindChannelDetails();
- if (mIsForBlockingHelper) {
- bindBlockingHelper();
- } else {
- bindInlineControls();
- }
+ bindInlineControls();
mMetricsLogger.write(notificationControlsLogMaker());
}
- private void bindBlockingHelper() {
- findViewById(R.id.inline_controls).setVisibility(GONE);
- findViewById(R.id.blocking_helper).setVisibility(VISIBLE);
-
- findViewById(R.id.undo).setOnClickListener(mOnUndo);
-
- View turnOffButton = findViewById(R.id.blocking_helper_turn_off_notifications);
- turnOffButton.setOnClickListener(getSettingsOnClickListener());
- turnOffButton.setVisibility(turnOffButton.hasOnClickListeners() ? VISIBLE : GONE);
-
- TextView keepShowing = findViewById(R.id.keep_showing);
- keepShowing.setOnClickListener(mOnKeepShowing);
-
- View deliverSilently = findViewById(R.id.deliver_silently);
- deliverSilently.setOnClickListener(mOnDeliverSilently);
- }
-
private void bindInlineControls() {
- findViewById(R.id.inline_controls).setVisibility(VISIBLE);
- findViewById(R.id.blocking_helper).setVisibility(GONE);
-
if (mIsNonblockable) {
findViewById(R.id.non_configurable_text).setVisibility(VISIBLE);
findViewById(R.id.non_configurable_multichannel_text).setVisibility(GONE);
@@ -414,8 +280,8 @@
// app is gone, just show package name and generic icon
mPkgIcon = mPm.getDefaultActivityIcon();
}
- ((ImageView) findViewById(R.id.pkgicon)).setImageDrawable(mPkgIcon);
- ((TextView) findViewById(R.id.pkgname)).setText(mAppName);
+ ((ImageView) findViewById(R.id.pkg_icon)).setImageDrawable(mPkgIcon);
+ ((TextView) findViewById(R.id.pkg_name)).setText(mAppName);
// Delegate
bindDelegate();
@@ -445,8 +311,6 @@
if (mAppUid >= 0 && mOnSettingsClickListener != null && mIsDeviceProvisioned) {
final int appUidF = mAppUid;
return ((View view) -> {
- logBlockingHelperCounter(
- NotificationCounters.BLOCKING_HELPER_NOTIF_SETTINGS);
mOnSettingsClickListener.onClick(view,
mNumUniqueChannelsInRow > 1 ? null : mSingleNotificationChannel,
appUidF);
@@ -487,16 +351,13 @@
private void bindDelegate() {
TextView delegateView = findViewById(R.id.delegate_name);
- TextView dividerView = findViewById(R.id.pkg_divider);
CharSequence delegatePkg = null;
if (!TextUtils.equals(mPackageName, mDelegatePkg)) {
// this notification was posted by a delegate!
delegateView.setVisibility(View.VISIBLE);
- dividerView.setVisibility(View.VISIBLE);
} else {
delegateView.setVisibility(View.GONE);
- dividerView.setVisibility(View.GONE);
}
}
@@ -512,25 +373,19 @@
}
}
TextView groupNameView = findViewById(R.id.group_name);
+ View divider = findViewById(R.id.group_divider);
if (groupName != null) {
groupNameView.setText(groupName);
- groupNameView.setVisibility(View.VISIBLE);
+ groupNameView.setVisibility(VISIBLE);
+ divider.setVisibility(VISIBLE);
} else {
- groupNameView.setVisibility(View.GONE);
- }
- }
-
-
- @VisibleForTesting
- void logBlockingHelperCounter(String counterTag) {
- if (mIsForBlockingHelper) {
- mMetricsLogger.count(counterTag, 1);
+ groupNameView.setVisibility(GONE);
+ divider.setVisibility(GONE);
}
}
private void saveImportance() {
- if (!mIsNonblockable
- || mExitReason != NotificationCounters.BLOCKING_HELPER_STOP_NOTIFICATIONS) {
+ if (!mIsNonblockable) {
if (mChosenImportance == null) {
mChosenImportance = mStartingChannelImportance;
}
@@ -621,99 +476,13 @@
: R.string.inline_done_button);
}
- private void saveImportanceAndExitReason(@NotificationInfoAction int action) {
- switch (action) {
- case ACTION_UNDO:
- mChosenImportance = mStartingChannelImportance;
- break;
- case ACTION_DELIVER_SILENTLY:
- mExitReason = NotificationCounters.BLOCKING_HELPER_DELIVER_SILENTLY;
- mChosenImportance = mWasShownHighPriority
- ? IMPORTANCE_LOW : mStartingChannelImportance;
- break;
- default:
- throw new IllegalArgumentException();
- }
- }
-
- // only used for blocking helper
- private void swapContent(@NotificationInfoAction int action, boolean animate) {
- if (mExpandAnimation != null) {
- mExpandAnimation.cancel();
- }
-
- View blockingHelper = findViewById(R.id.blocking_helper);
- ViewGroup confirmation = findViewById(R.id.confirmation);
- TextView confirmationText = findViewById(R.id.confirmation_text);
-
- saveImportanceAndExitReason(action);
-
- switch (action) {
- case ACTION_UNDO:
- break;
- case ACTION_DELIVER_SILENTLY:
- confirmationText.setText(R.string.notification_channel_silenced);
- break;
- default:
- throw new IllegalArgumentException();
- }
-
- boolean isUndo = action == ACTION_UNDO;
-
- blockingHelper.setVisibility(isUndo ? VISIBLE : GONE);
- findViewById(R.id.channel_info).setVisibility(isUndo ? VISIBLE : GONE);
- findViewById(R.id.header).setVisibility(isUndo ? VISIBLE : GONE);
- confirmation.setVisibility(isUndo ? GONE : VISIBLE);
-
- if (animate) {
- ObjectAnimator promptAnim = ObjectAnimator.ofFloat(blockingHelper, View.ALPHA,
- blockingHelper.getAlpha(), isUndo ? 1f : 0f);
- promptAnim.setInterpolator(isUndo ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT);
- ObjectAnimator confirmAnim = ObjectAnimator.ofFloat(confirmation, View.ALPHA,
- confirmation.getAlpha(), isUndo ? 0f : 1f);
- confirmAnim.setInterpolator(isUndo ? Interpolators.ALPHA_OUT : Interpolators.ALPHA_IN);
-
- mExpandAnimation = new AnimatorSet();
- mExpandAnimation.playTogether(promptAnim, confirmAnim);
- mExpandAnimation.setDuration(150);
- mExpandAnimation.addListener(new AnimatorListenerAdapter() {
- boolean mCancelled = false;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mCancelled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mCancelled) {
- blockingHelper.setVisibility(isUndo ? VISIBLE : GONE);
- confirmation.setVisibility(isUndo ? GONE : VISIBLE);
- }
- }
- });
- mExpandAnimation.start();
- }
-
- // Since we're swapping/update the content, reset the timeout so the UI can't close
- // immediately after the update.
- if (mGutsContainer != null) {
- mGutsContainer.resetFalsingCheck();
- }
- }
-
@Override
public void onFinishedClosing() {
if (mChosenImportance != null) {
mStartingChannelImportance = mChosenImportance;
}
- mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
- if (mIsForBlockingHelper) {
- bindBlockingHelper();
- } else {
- bindInlineControls();
- }
+ bindInlineControls();
mMetricsLogger.write(notificationControlsLogMaker().setType(MetricsEvent.TYPE_CLOSE));
}
@@ -756,13 +525,10 @@
}
/**
- * Closes the controls and commits the updated importance values (indirectly). If this view is
- * being used to show the blocking helper, this will immediately dismiss the blocking helper and
- * commit the updated importance.
+ * Closes the controls and commits the updated importance values (indirectly).
*
* <p><b>Note,</b> this will only get called once the view is dismissing. This means that the
- * user does not have the ability to undo the action anymore. See
- * {@link #swapContent(boolean, boolean)} for where undo is handled.
+ * user does not have the ability to undo the action anymore.
*/
@VisibleForTesting
void closeControls(View v, boolean save) {
@@ -811,7 +577,6 @@
if (save) {
saveImportance();
}
- logBlockingHelperCounter(mExitReason);
return false;
}
@@ -822,7 +587,7 @@
@VisibleForTesting
public boolean isAnimating() {
- return mExpandAnimation != null && mExpandAnimation.isRunning();
+ return false;
}
/**
@@ -901,8 +666,7 @@
private LogMaker notificationControlsLogMaker() {
return getLogMaker().setCategory(MetricsEvent.ACTION_NOTE_CONTROLS)
.setType(MetricsEvent.TYPE_OPEN)
- .setSubtype(mIsForBlockingHelper ? MetricsEvent.BLOCKING_HELPER_DISPLAY
- : MetricsEvent.BLOCKING_HELPER_UNKNOWN);
+ .setSubtype(MetricsEvent.BLOCKING_HELPER_UNKNOWN);
}
@Retention(SOURCE)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationUndoLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationUndoLayout.java
deleted file mode 100644
index 3ea8195..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationUndoLayout.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar.notification.row;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import com.android.systemui.R;
-
-/**
- * Custom view for the NotificationInfo confirmation views so that the confirmation text can
- * occupy the full width of the notification and push the undo button down to the next line if
- * necessary.
- *
- * @see NotificationInfo
- */
-public class NotificationUndoLayout extends FrameLayout {
- /**
- * View for the prompt/confirmation text to tell the user the previous action was successful.
- */
- private View mConfirmationTextView;
- /** Undo button (actionable text) view. */
- private View mUndoView;
-
- /**
- * Whether {@link #mConfirmationTextView} is multiline and will require the full width of the
- * parent (which causes the {@link #mUndoView} to push down).
- */
- private boolean mIsMultiline = false;
- private int mMultilineTopMargin;
-
- public NotificationUndoLayout(Context context) {
- this(context, null);
- }
-
- public NotificationUndoLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public NotificationUndoLayout(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mConfirmationTextView = findViewById(R.id.confirmation_text);
- mUndoView = findViewById(R.id.undo);
-
- mMultilineTopMargin = getResources().getDimensionPixelOffset(
- com.android.internal.R.dimen.notification_content_margin_start);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- LayoutParams confirmationLayoutParams =
- (LayoutParams) mConfirmationTextView.getLayoutParams();
- LayoutParams undoLayoutParams =(LayoutParams) mUndoView.getLayoutParams();
-
- int measuredWidth = getMeasuredWidth();
- // Ignore the left margin on the undo button - no need for additional extra space between
- // the text and the button.
- int requiredWidth = mConfirmationTextView.getMeasuredWidth()
- + confirmationLayoutParams.rightMargin
- + confirmationLayoutParams.leftMargin
- + mUndoView.getMeasuredWidth()
- + undoLayoutParams.rightMargin;
- // If the measured width isn't enough to accommodate both the undo button and the text in
- // the same line, we'll need to adjust the view to be multi-line. Otherwise, we're done.
- if (requiredWidth > measuredWidth) {
- mIsMultiline = true;
-
- // Update height requirement to the text height and the button's height (along with
- // additional spacing for the top of the text).
- int updatedHeight = mMultilineTopMargin
- + mConfirmationTextView.getMeasuredHeight()
- + mUndoView.getMeasuredHeight()
- + undoLayoutParams.topMargin
- + undoLayoutParams.bottomMargin;
-
- setMeasuredDimension(measuredWidth, updatedHeight);
- } else {
- mIsMultiline = false;
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- // If the text view and undo view don't fit on the same line, we'll need to manually lay
- // out the content.
- if (mIsMultiline) {
- // Re-align parent right/bottom values. Left and top are considered to be 0.
- int parentBottom = getMeasuredHeight();
- int parentRight = getMeasuredWidth();
-
- LayoutParams confirmationLayoutParams =
- (LayoutParams) mConfirmationTextView.getLayoutParams();
- LayoutParams undoLayoutParams = (LayoutParams) mUndoView.getLayoutParams();
-
- // The confirmation text occupies the full width as computed earlier. Both side margins
- // are equivalent, so we only need to grab the left one here.
- mConfirmationTextView.layout(
- confirmationLayoutParams.leftMargin,
- mMultilineTopMargin,
- confirmationLayoutParams.leftMargin + mConfirmationTextView.getMeasuredWidth(),
- mMultilineTopMargin + mConfirmationTextView.getMeasuredHeight());
-
- // The undo button is aligned bottom|end with the parent in the case of multiline text.
- int undoViewLeft = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
- ? undoLayoutParams.rightMargin
- : parentRight - mUndoView.getMeasuredWidth() - undoLayoutParams.rightMargin;
- mUndoView.layout(
- undoViewLeft,
- parentBottom - mUndoView.getMeasuredHeight() - undoLayoutParams.bottomMargin,
- undoViewLeft + mUndoView.getMeasuredWidth(),
- parentBottom - undoLayoutParams.bottomMargin);
- } else {
- super.onLayout(changed, left, top, right, bottom);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index c29ec9e..cf9d43e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -26,7 +26,6 @@
import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
-import android.hardware.biometrics.BiometricSourceType;
import android.os.Trace;
import android.provider.Settings;
import android.text.TextUtils;
@@ -34,22 +33,17 @@
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
-import androidx.annotation.Nullable;
-
import com.android.internal.graphics.ColorUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.dock.DockManager;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -61,8 +55,7 @@
* Manages the different states and animations of the unlock icon.
*/
public class LockIcon extends KeyguardAffordanceView implements
- KeyguardStateController.Callback, NotificationWakeUpCoordinator.WakeUpListener,
- ViewTreeObserver.OnPreDrawListener, OnHeadsUpChangedListener {
+ ViewTreeObserver.OnPreDrawListener {
private static final int STATE_LOCKED = 0;
private static final int STATE_LOCK_OPEN = 1;
@@ -70,7 +63,6 @@
private static final int STATE_BIOMETRICS_ERROR = 3;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final AccessibilityController mAccessibilityController;
- private final DockManager mDockManager;
private final KeyguardStateController mKeyguardStateController;
private final KeyguardBypassController mBypassController;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
@@ -130,43 +122,6 @@
update();
}
};
- private final DockManager.DockEventListener mDockEventListener =
- new DockManager.DockEventListener() {
- @Override
- public void onEvent(int event) {
- boolean docked = event == DockManager.STATE_DOCKED
- || event == DockManager.STATE_DOCKED_HIDE;
- if (docked != mDocked) {
- mDocked = docked;
- update();
- }
- }
- };
-
- private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
- new KeyguardUpdateMonitorCallback() {
- @Override
- public void onSimStateChanged(int subId, int slotId, int simState) {
- mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure();
- update();
- }
-
- @Override
- public void onKeyguardVisibilityChanged(boolean showing) {
- update();
- }
-
- @Override
- public void onBiometricRunningStateChanged(boolean running,
- BiometricSourceType biometricSourceType) {
- update();
- }
-
- @Override
- public void onStrongAuthStateChanged(int userId) {
- update();
- }
- };
@Inject
public LockIcon(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
@@ -174,7 +129,6 @@
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardStateController keyguardStateController,
- @Nullable DockManager dockManager,
HeadsUpManagerPhone headsUpManager) {
super(context, attrs);
mContext = context;
@@ -183,7 +137,6 @@
mBypassController = bypassController;
mWakeUpCoordinator = wakeUpCoordinator;
mKeyguardStateController = keyguardStateController;
- mDockManager = dockManager;
mHeadsUpManager = headsUpManager;
}
@@ -191,24 +144,14 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mKeyguardStateController.addCallback(mKeyguardMonitorCallback);
- mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
- mWakeUpCoordinator.addListener(this);
mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure();
- if (mDockManager != null) {
- mDockManager.addListener(mDockEventListener);
- }
update();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback);
mKeyguardStateController.removeCallback(mKeyguardMonitorCallback);
- mWakeUpCoordinator.removeListener(this);
- if (mDockManager != null) {
- mDockManager.removeListener(mDockEventListener);
- }
}
/**
@@ -306,7 +249,7 @@
* Update the icon visibility
* @return true if the visibility changed
*/
- private boolean updateIconVisibility() {
+ boolean updateIconVisibility() {
boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked);
boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning
|| mShowingLaunchAffordance;
@@ -424,16 +367,6 @@
return -1;
}
- @Override
- public void onFullyHiddenChanged(boolean isFullyHidden) {
- if (mBypassController.getBypassEnabled()) {
- boolean changed = updateIconVisibility();
- if (changed) {
- update();
- }
- }
- }
-
public void setBouncerShowingScrimmed(boolean bouncerShowing) {
mBouncerShowingScrimmed = bouncerShowing;
if (mBypassController.getBypassEnabled()) {
@@ -454,6 +387,18 @@
updateDarkTint();
}
+ void setSimLocked(boolean simLocked) {
+ mSimLocked = simLocked;
+ }
+
+ /** Set if the device is docked. */
+ public void setDocked(boolean docked) {
+ if (mDocked != docked) {
+ mDocked = docked;
+ update();
+ }
+ }
+
@Retention(RetentionPolicy.SOURCE)
@IntDef({ERROR, UNLOCK, LOCK, SCANNING})
@interface LockAnimIndex {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
index 698a430..2b1a8a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
@@ -18,20 +18,29 @@
import android.content.res.TypedArray;
import android.graphics.Color;
+import android.hardware.biometrics.BiometricSourceType;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.Nullable;
+
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
+import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardIndicationController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator.WakeUpListener;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
+import java.util.Optional;
+
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -47,6 +56,9 @@
private final KeyguardIndicationController mKeyguardIndicationController;
private final StatusBarStateController mStatusBarStateController;
private final ConfigurationController mConfigurationController;
+ private final NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
+ private final KeyguardBypassController mKeyguardBypassController;
+ private final Optional<DockManager> mDockManager;
private LockIcon mLockIcon;
private View.OnAttachStateChangeListener mOnAttachStateChangeListener =
@@ -55,6 +67,10 @@
public void onViewAttachedToWindow(View v) {
mStatusBarStateController.addCallback(mSBStateListener);
mConfigurationController.addCallback(mConfigurationListener);
+ mNotificationWakeUpCoordinator.addListener(mWakeUpListener);
+ mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback);
+
+ mDockManager.ifPresent(dockManager -> dockManager.addListener(mDockEventListener));
mConfigurationListener.onThemeChanged();
}
@@ -63,6 +79,11 @@
public void onViewDetachedFromWindow(View v) {
mStatusBarStateController.removeCallback(mSBStateListener);
mConfigurationController.removeCallback(mConfigurationListener);
+ mNotificationWakeUpCoordinator.removeListener(mWakeUpListener);
+ mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback);
+
+
+ mDockManager.ifPresent(dockManager -> dockManager.removeListener(mDockEventListener));
}
};
@@ -115,6 +136,47 @@
}
};
+ private final WakeUpListener mWakeUpListener = new WakeUpListener() {
+ @Override
+ public void onFullyHiddenChanged(boolean isFullyHidden) {
+ if (mKeyguardBypassController.getBypassEnabled()) {
+ boolean changed = mLockIcon.updateIconVisibility();
+ if (changed) {
+ mLockIcon.update();
+ }
+ }
+ }
+ };
+
+ private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onSimStateChanged(int subId, int slotId, int simState) {
+ mLockIcon.setSimLocked(mKeyguardUpdateMonitor.isSimPinSecure());
+ mLockIcon.update();
+ }
+
+ @Override
+ public void onKeyguardVisibilityChanged(boolean showing) {
+ mLockIcon.update();
+ }
+
+ @Override
+ public void onBiometricRunningStateChanged(boolean running,
+ BiometricSourceType biometricSourceType) {
+ mLockIcon.update();
+ }
+
+ @Override
+ public void onStrongAuthStateChanged(int userId) {
+ mLockIcon.update();
+ }
+ };
+
+ private final DockManager.DockEventListener mDockEventListener =
+ event -> mLockIcon.setDocked(event == DockManager.STATE_DOCKED
+ || event == DockManager.STATE_DOCKED_HIDE);
+
@Inject
public LockscreenLockIconController(LockscreenGestureLogger lockscreenGestureLogger,
KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -123,7 +185,10 @@
AccessibilityController accessibilityController,
KeyguardIndicationController keyguardIndicationController,
StatusBarStateController statusBarStateController,
- ConfigurationController configurationController) {
+ ConfigurationController configurationController,
+ NotificationWakeUpCoordinator notificationWakeUpCoordinator,
+ KeyguardBypassController keyguardBypassController,
+ @Nullable DockManager dockManager) {
mLockscreenGestureLogger = lockscreenGestureLogger;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockPatternUtils = lockPatternUtils;
@@ -132,6 +197,9 @@
mKeyguardIndicationController = keyguardIndicationController;
mStatusBarStateController = statusBarStateController;
mConfigurationController = configurationController;
+ mNotificationWakeUpCoordinator = notificationWakeUpCoordinator;
+ mKeyguardBypassController = keyguardBypassController;
+ mDockManager = dockManager == null ? Optional.empty() : Optional.of(dockManager);
mKeyguardIndicationController.setLockIconController(this);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java
index 6c09a46..cd46110 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/pip/PipAnimationControllerTest.java
@@ -26,7 +26,6 @@
import android.graphics.Rect;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import android.view.IWindowContainer;
import android.view.SurfaceControl;
import androidx.test.filters.SmallTest;
@@ -51,7 +50,7 @@
private PipAnimationController mPipAnimationController;
@Mock
- private IWindowContainer mWindowContainer;
+ private SurfaceControl mLeash;
@Mock
private PipAnimationController.PipAnimationCallback mPipAnimationCallback;
@@ -65,8 +64,7 @@
@Test
public void getAnimator_withAlpha_returnFloatAnimator() {
final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- new Rect(), 0f, 1f);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, new Rect(), 0f, 1f);
assertEquals("Expect ANIM_TYPE_ALPHA animation",
animator.getAnimationType(), PipAnimationController.ANIM_TYPE_ALPHA);
@@ -75,8 +73,7 @@
@Test
public void getAnimator_withBounds_returnBoundsAnimator() {
final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- new Rect(), new Rect());
+ .getAnimator(mLeash, true /* scheduleFinishPip */, new Rect(), new Rect());
assertEquals("Expect ANIM_TYPE_BOUNDS animation",
animator.getAnimationType(), PipAnimationController.ANIM_TYPE_BOUNDS);
@@ -88,14 +85,12 @@
final Rect endValue1 = new Rect(100, 100, 200, 200);
final Rect endValue2 = new Rect(200, 200, 300, 300);
final PipAnimationController.PipTransitionAnimator oldAnimator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- startValue, endValue1);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, startValue, endValue1);
oldAnimator.setSurfaceControlTransactionFactory(DummySurfaceControlTx::new);
oldAnimator.start();
final PipAnimationController.PipTransitionAnimator newAnimator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- startValue, endValue2);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, startValue, endValue2);
assertEquals("getAnimator with same type returns same animator",
oldAnimator, newAnimator);
@@ -106,13 +101,11 @@
@Test
public void getAnimator_scheduleFinishPip() {
PipAnimationController.PipTransitionAnimator animator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- new Rect(), 0f, 1f);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, new Rect(), 0f, 1f);
assertTrue("scheduleFinishPip is true", animator.shouldScheduleFinishPip());
animator = mPipAnimationController
- .getAnimator(mWindowContainer, false /* scheduleFinishPip */,
- new Rect(), 0f, 1f);
+ .getAnimator(mLeash, false /* scheduleFinishPip */, new Rect(), 0f, 1f);
assertFalse("scheduleFinishPip is false", animator.shouldScheduleFinishPip());
}
@@ -122,8 +115,7 @@
final Rect endValue1 = new Rect(100, 100, 200, 200);
final Rect endValue2 = new Rect(200, 200, 300, 300);
final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- startValue, endValue1);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, startValue, endValue1);
animator.updateEndValue(endValue2);
@@ -135,24 +127,23 @@
final Rect startValue = new Rect(0, 0, 100, 100);
final Rect endValue = new Rect(100, 100, 200, 200);
final PipAnimationController.PipTransitionAnimator animator = mPipAnimationController
- .getAnimator(mWindowContainer, true /* scheduleFinishPip */,
- startValue, endValue);
+ .getAnimator(mLeash, true /* scheduleFinishPip */, startValue, endValue);
animator.setSurfaceControlTransactionFactory(DummySurfaceControlTx::new);
animator.setPipAnimationCallback(mPipAnimationCallback);
// onAnimationStart triggers onPipAnimationStart
animator.onAnimationStart(animator);
- verify(mPipAnimationCallback).onPipAnimationStart(mWindowContainer, animator);
+ verify(mPipAnimationCallback).onPipAnimationStart(animator);
// onAnimationCancel triggers onPipAnimationCancel
animator.onAnimationCancel(animator);
- verify(mPipAnimationCallback).onPipAnimationCancel(mWindowContainer, animator);
+ verify(mPipAnimationCallback).onPipAnimationCancel(animator);
// onAnimationEnd triggers onPipAnimationEnd
animator.onAnimationEnd(animator);
- verify(mPipAnimationCallback).onPipAnimationEnd(eq(mWindowContainer),
- any(SurfaceControl.Transaction.class), eq(animator));
+ verify(mPipAnimationCallback).onPipAnimationEnd(any(SurfaceControl.Transaction.class),
+ eq(animator));
}
/**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 54c0bde..e9dca699 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -316,74 +316,9 @@
}
@Test
- public void testInitializeNotificationInfoView_showBlockingHelper() throws Exception {
- NotificationInfo notificationInfoView = mock(NotificationInfo.class);
- ExpandableNotificationRow row = spy(mHelper.createRow());
- row.setBlockingHelperShowing(true);
- modifyRanking(row.getEntry())
- .setUserSentiment(USER_SENTIMENT_NEGATIVE)
- .build();
- when(row.getIsNonblockable()).thenReturn(false);
- StatusBarNotification statusBarNotification = row.getEntry().getSbn();
- NotificationEntry entry = row.getEntry();
-
- mGutsManager.initializeNotificationInfo(row, notificationInfoView);
-
- verify(notificationInfoView).bindNotification(
- any(PackageManager.class),
- any(INotificationManager.class),
- eq(mVisualStabilityManager),
- eq(statusBarNotification.getPackageName()),
- any(NotificationChannel.class),
- anySet(),
- eq(entry),
- any(NotificationInfo.CheckSaveListener.class),
- any(NotificationInfo.OnSettingsClickListener.class),
- any(NotificationInfo.OnAppSettingsClickListener.class),
- eq(false),
- eq(false),
- eq(true) /* isForBlockingHelper */,
- eq(0),
- eq(false) /* wasShownHighPriority */);
- }
-
- @Test
- public void testInitializeNotificationInfoView_dontShowBlockingHelper() throws Exception {
- NotificationInfo notificationInfoView = mock(NotificationInfo.class);
- ExpandableNotificationRow row = spy(mHelper.createRow());
- row.setBlockingHelperShowing(false);
- modifyRanking(row.getEntry())
- .setUserSentiment(USER_SENTIMENT_NEGATIVE)
- .build();
- when(row.getIsNonblockable()).thenReturn(false);
- StatusBarNotification statusBarNotification = row.getEntry().getSbn();
- NotificationEntry entry = row.getEntry();
-
- mGutsManager.initializeNotificationInfo(row, notificationInfoView);
-
- verify(notificationInfoView).bindNotification(
- any(PackageManager.class),
- any(INotificationManager.class),
- eq(mVisualStabilityManager),
- eq(statusBarNotification.getPackageName()),
- any(NotificationChannel.class),
- anySet(),
- eq(entry),
- any(NotificationInfo.CheckSaveListener.class),
- any(NotificationInfo.OnSettingsClickListener.class),
- any(NotificationInfo.OnAppSettingsClickListener.class),
- eq(false),
- eq(false),
- eq(false) /* isForBlockingHelper */,
- eq(0),
- eq(false) /* wasShownHighPriority */);
- }
-
- @Test
public void testInitializeNotificationInfoView_highPriority() throws Exception {
NotificationInfo notificationInfoView = mock(NotificationInfo.class);
ExpandableNotificationRow row = spy(mHelper.createRow());
- row.setBlockingHelperShowing(true);
final NotificationEntry entry = row.getEntry();
modifyRanking(entry)
.setUserSentiment(USER_SENTIMENT_NEGATIVE)
@@ -403,13 +338,10 @@
any(NotificationChannel.class),
anySet(),
eq(entry),
- any(NotificationInfo.CheckSaveListener.class),
any(NotificationInfo.OnSettingsClickListener.class),
any(NotificationInfo.OnAppSettingsClickListener.class),
eq(false),
eq(false),
- eq(true) /* isForBlockingHelper */,
- eq(IMPORTANCE_HIGH),
eq(true) /* wasShownHighPriority */);
}
@@ -437,13 +369,10 @@
any(NotificationChannel.class),
anySet(),
eq(entry),
- any(NotificationInfo.CheckSaveListener.class),
any(NotificationInfo.OnSettingsClickListener.class),
any(NotificationInfo.OnAppSettingsClickListener.class),
eq(true),
eq(false),
- eq(false) /* isForBlockingHelper */,
- eq(0),
eq(false) /* wasShownHighPriority */);
}
@@ -469,13 +398,10 @@
any(NotificationChannel.class),
anySet(),
eq(entry),
- any(NotificationInfo.CheckSaveListener.class),
any(NotificationInfo.OnSettingsClickListener.class),
any(NotificationInfo.OnAppSettingsClickListener.class),
eq(false),
eq(false),
- eq(true) /* isForBlockingHelper */,
- eq(0),
eq(false) /* wasShownHighPriority */);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
index c62487a..98ef691 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
@@ -119,15 +119,10 @@
@Mock
private PackageManager mMockPackageManager;
@Mock
- private NotificationBlockingHelperManager mBlockingHelperManager;
- @Mock
private VisualStabilityManager mVisualStabilityManager;
@Before
public void setUp() throws Exception {
- mDependency.injectTestDependency(
- NotificationBlockingHelperManager.class,
- mBlockingHelperManager);
mTestableLooper = TestableLooper.get(this);
mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
@@ -183,13 +178,6 @@
NOTIFICATION_NEW_INTERRUPTION_MODEL, 0);
}
- // TODO: if tests are taking too long replace this with something that makes the animation
- // finish instantly.
- private void waitForUndoButton() {
- PollingCheck.waitFor(1000,
- () -> VISIBLE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility());
- }
-
@Test
public void testBindNotification_SetsTextApplicationName() throws Exception {
when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
@@ -203,12 +191,10 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
- final TextView textView = mNotificationInfo.findViewById(R.id.pkgname);
+ final TextView textView = mNotificationInfo.findViewById(R.id.pkg_name);
assertTrue(textView.getText().toString().contains("App Name"));
assertEquals(VISIBLE, mNotificationInfo.findViewById(R.id.header).getVisibility());
}
@@ -228,12 +214,10 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
- final ImageView iconView = mNotificationInfo.findViewById(R.id.pkgicon);
+ final ImageView iconView = mNotificationInfo.findViewById(R.id.pkg_icon);
assertEquals(iconDrawable, iconView.getDrawable());
}
@@ -249,14 +233,12 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
assertEquals(GONE, nameView.getVisibility());
- final TextView dividerView = mNotificationInfo.findViewById(R.id.pkg_divider);
+ final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider);
assertEquals(GONE, dividerView.getVisibility());
}
@@ -281,16 +263,12 @@
entry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
assertEquals(VISIBLE, nameView.getVisibility());
assertTrue(nameView.getText().toString().contains("Proxied"));
- final TextView dividerView = mNotificationInfo.findViewById(R.id.pkg_divider);
- assertEquals(VISIBLE, dividerView.getVisibility());
}
@Test
@@ -305,13 +283,13 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name);
assertEquals(GONE, groupNameView.getVisibility());
+ final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider);
+ assertEquals(GONE, dividerView.getVisibility());
}
@Test
@@ -332,14 +310,14 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name);
assertEquals(View.VISIBLE, groupNameView.getVisibility());
assertEquals("Test Group Name", groupNameView.getText());
+ final TextView dividerView = mNotificationInfo.findViewById(R.id.group_divider);
+ assertEquals(View.VISIBLE, dividerView.getVisibility());
}
@Test
@@ -354,10 +332,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(TEST_CHANNEL_NAME, textView.getText());
@@ -375,10 +351,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(GONE, textView.getVisibility());
@@ -387,7 +361,7 @@
@Test
public void testBindNotification_DefaultChannelUsesChannelNameIfMoreChannelsExist()
throws Exception {
- // Package has one channel by default.
+ // Package has more than one channel by default.
when(mMockINotificationManager.getNumNotificationChannelsForPackage(
eq(TEST_PACKAGE_NAME), eq(TEST_UID), anyBoolean())).thenReturn(10);
mNotificationInfo.bindNotification(
@@ -400,10 +374,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(VISIBLE, textView.getVisibility());
@@ -421,42 +393,14 @@
mEntry,
null,
null,
- null,
true,
true,
- IMPORTANCE_DEFAULT,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.channel_name);
assertEquals(VISIBLE, textView.getVisibility());
}
@Test
- public void testBindNotification_BlockLink_BlockingHelper() throws Exception {
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- mock(NotificationInfo.OnSettingsClickListener.class),
- null,
- true,
- false,
- true /* isBlockingHelper */,
- IMPORTANCE_DEFAULT,
- true);
- final View block =
- mNotificationInfo.findViewById(R.id.blocking_helper_turn_off_notifications);
- final View interruptivenessSettings = mNotificationInfo.findViewById(
- R.id.inline_controls);
- assertEquals(VISIBLE, block.getVisibility());
- assertEquals(GONE, interruptivenessSettings.getVisibility());
- }
-
- @Test
public void testBindNotification_SetsOnClickListenerForSettings() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
@@ -467,7 +411,6 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- null,
(View v, NotificationChannel c, int appUid) -> {
assertEquals(mNotificationChannel, c);
latch.countDown();
@@ -475,7 +418,6 @@
null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
@@ -496,10 +438,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
assertTrue(settingsButton.getVisibility() != View.VISIBLE);
@@ -516,14 +456,12 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- null,
(View v, NotificationChannel c, int appUid) -> {
assertEquals(mNotificationChannel, c);
},
null,
false,
false,
- IMPORTANCE_DEFAULT,
true);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
assertTrue(settingsButton.getVisibility() != View.VISIBLE);
@@ -541,10 +479,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.bindNotification(
mMockPackageManager,
@@ -554,89 +490,16 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- null,
(View v, NotificationChannel c, int appUid) -> { },
null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
assertEquals(View.VISIBLE, settingsButton.getVisibility());
}
@Test
- public void testBindNotificationLogging_notBlockingHelper() throws Exception {
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- null,
- null,
- true,
- false,
- IMPORTANCE_DEFAULT,
- true);
- verify(mMetricsLogger).write(argThat(logMaker ->
- logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
- && logMaker.getType() == MetricsEvent.TYPE_OPEN
- && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_UNKNOWN
- ));
- }
-
- @Test
- public void testBindNotificationLogging_BlockingHelper() throws Exception {
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- null,
- null,
- false,
- true,
- true,
- IMPORTANCE_DEFAULT,
- true);
- verify(mMetricsLogger).write(argThat(logMaker ->
- logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS
- && logMaker.getType() == MetricsEvent.TYPE_OPEN
- && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_DISPLAY
- ));
- }
-
- @Test
- public void testLogBlockingHelperCounter_logsForBlockingHelper() throws Exception {
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- null,
- null,
- false,
- true,
- true,
- IMPORTANCE_DEFAULT,
- true);
- mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent");
- verify(mMetricsLogger).count(eq("HowCanNotifsBeRealIfAppsArent"), eq(1));
- }
-
- @Test
public void testOnClickListenerPassesNullChannelForBundle() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
@@ -646,7 +509,6 @@
TEST_PACKAGE_NAME, mNotificationChannel,
createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT),
mEntry,
- null,
(View v, NotificationChannel c, int appUid) -> {
assertEquals(null, c);
latch.countDown();
@@ -654,7 +516,6 @@
null,
true,
true,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.findViewById(R.id.info).performClick();
@@ -676,10 +537,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
final TextView channelNameView =
mNotificationInfo.findViewById(R.id.channel_name);
@@ -699,10 +558,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
assertEquals(GONE, mNotificationInfo.findViewById(
R.id.interruptiveness_settings).getVisibility());
@@ -722,10 +579,8 @@
mEntry,
null,
null,
- null,
true,
true,
- IMPORTANCE_DEFAULT,
true);
final TextView view = mNotificationInfo.findViewById(R.id.non_configurable_text);
assertEquals(View.VISIBLE, view.getVisibility());
@@ -747,10 +602,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
assertTrue(mNotificationInfo.findViewById(R.id.alert).isSelected());
}
@@ -767,10 +620,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
false);
assertTrue(mNotificationInfo.findViewById(R.id.silence).isSelected());
}
@@ -787,10 +638,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mTestableLooper.processAllMessages();
verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
@@ -810,10 +659,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_LOW,
false);
mNotificationInfo.findViewById(R.id.alert).performClick();
@@ -836,10 +683,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.findViewById(R.id.silence).performClick();
@@ -862,10 +707,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.handleCloseControls(true, false);
@@ -889,10 +732,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_UNSPECIFIED,
true);
mNotificationInfo.handleCloseControls(true, false);
@@ -904,225 +745,6 @@
}
@Test
- public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing_BlockingHelper()
- throws Exception {
- NotificationInfo.CheckSaveListener listener =
- mock(NotificationInfo.CheckSaveListener.class);
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel /* notificationChannel */,
- createMultipleChannelSet(10) /* numUniqueChannelsInRow */,
- mEntry,
- listener /* checkSaveListener */,
- null /* onSettingsClick */,
- null /* onAppSettingsClick */,
- true /* provisioned */,
- false /* isNonblockable */,
- true /* isForBlockingHelper */,
- IMPORTANCE_DEFAULT,
- true);
-
- NotificationGuts guts = spy(new NotificationGuts(mContext, null));
- when(guts.getWindowToken()).thenReturn(mock(IBinder.class));
- doNothing().when(guts).animateClose(anyInt(), anyInt(), anyBoolean());
- doNothing().when(guts).setExposed(anyBoolean(), anyBoolean());
- guts.setGutsContent(mNotificationInfo);
- mNotificationInfo.setGutsParent(guts);
-
- mNotificationInfo.findViewById(R.id.keep_showing).performClick();
-
- verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
- mTestableLooper.processAllMessages();
- verify(mMockINotificationManager, times(1))
- .setNotificationsEnabledWithImportanceLockForPackage(
- anyString(), eq(TEST_UID), eq(true));
- }
-
- @Test
- public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss_BlockingHelper()
- throws Exception {
- NotificationInfo.CheckSaveListener listener =
- mock(NotificationInfo.CheckSaveListener.class);
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel /* notificationChannel */,
- createMultipleChannelSet(10) /* numUniqueChannelsInRow */,
- mEntry,
- listener /* checkSaveListener */,
- null /* onSettingsClick */,
- null /* onAppSettingsClick */,
- false /* isNonblockable */,
- true /* isForBlockingHelper */,
- true, IMPORTANCE_DEFAULT,
- true);
-
- mNotificationInfo.handleCloseControls(true /* save */, false /* force */);
-
- mTestableLooper.processAllMessages();
- verify(listener, times(0)).checkSave(any(Runnable.class), eq(mSbn));
- }
-
- @Test
- public void testCloseControls_checkSaveListenerDelaysStopNotifications_BlockingHelper()
- throws Exception {
- NotificationInfo.CheckSaveListener listener =
- mock(NotificationInfo.CheckSaveListener.class);
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel /* notificationChannel */,
- createMultipleChannelSet(10) /* numUniqueChannelsInRow */,
- mEntry,
- listener /* checkSaveListener */,
- null /* onSettingsClick */,
- null /* onAppSettingsClick */,
- true /* provisioned */,
- false /* isNonblockable */,
- true /* isForBlockingHelper */,
- IMPORTANCE_DEFAULT,
- true);
-
- mNotificationInfo.findViewById(R.id.deliver_silently).performClick();
- mTestableLooper.processAllMessages();
- verify(listener).checkSave(any(Runnable.class), eq(mSbn));
- }
-
- @Test
- public void testCloseControls_blockingHelperDismissedIfShown() throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet /* numChannels */,
- mEntry,
- null /* checkSaveListener */,
- null /* onSettingsClick */,
- null /* onAppSettingsClick */,
- false /* isNonblockable */,
- true /* isForBlockingHelper */,
- true,
- IMPORTANCE_DEFAULT,
- true);
- NotificationGuts guts = mock(NotificationGuts.class);
- doCallRealMethod().when(guts).closeControls(anyInt(), anyInt(), anyBoolean(), anyBoolean());
- mNotificationInfo.setGutsParent(guts);
-
- mNotificationInfo.closeControls(mNotificationInfo, true);
-
- verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
- }
-
- @Test
- public void testSilentlyChangedCallsUpdateNotificationChannel_blockingHelper()
- throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet /* numChannels */,
- mEntry,
- null /* checkSaveListener */,
- null /* onSettingsClick */,
- null /* onAppSettingsClick */,
- true /*provisioned */,
- false /* isNonblockable */,
- true /* isForBlockingHelper */,
- IMPORTANCE_DEFAULT,
- true);
-
- mNotificationInfo.findViewById(R.id.deliver_silently).performClick();
- waitForUndoButton();
- mNotificationInfo.handleCloseControls(true, false);
-
- mTestableLooper.processAllMessages();
- ArgumentCaptor<NotificationChannel> updated =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), eq(TEST_UID), updated.capture());
- assertTrue((updated.getValue().getUserLockedFields()
- & USER_LOCKED_IMPORTANCE) != 0);
- assertEquals(IMPORTANCE_LOW, updated.getValue().getImportance());
- }
-
- @Test
- public void testKeepUpdatesNotificationChannel_blockingHelper() throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_LOW);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- null,
- null,
- true,
- true,
- IMPORTANCE_LOW,
- false);
-
- mNotificationInfo.findViewById(R.id.keep_showing).performClick();
- mNotificationInfo.handleCloseControls(true, false);
-
- mTestableLooper.processAllMessages();
- ArgumentCaptor<NotificationChannel> updated =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), eq(TEST_UID), updated.capture());
- assertTrue(0 != (mNotificationChannel.getUserLockedFields() & USER_LOCKED_IMPORTANCE));
- assertEquals(IMPORTANCE_LOW, mNotificationChannel.getImportance());
- }
-
- @Test
- public void testNoActionsUpdatesNotificationChannel_blockingHelper() throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mNotificationInfo.bindNotification(
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mNotificationChannelSet,
- mEntry,
- null,
- null,
- null,
- true,
- true,
- IMPORTANCE_DEFAULT,
- true);
-
- mNotificationInfo.handleCloseControls(true, false);
-
- mTestableLooper.processAllMessages();
- ArgumentCaptor<NotificationChannel> updated =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), eq(TEST_UID), updated.capture());
- assertTrue(0 != (mNotificationChannel.getUserLockedFields() & USER_LOCKED_IMPORTANCE));
- assertEquals(IMPORTANCE_DEFAULT, mNotificationChannel.getImportance());
- }
-
- @Test
public void testSilenceCallsUpdateNotificationChannel() throws Exception {
mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
mNotificationInfo.bindNotification(
@@ -1135,10 +757,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.findViewById(R.id.silence).performClick();
@@ -1168,10 +788,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_LOW,
false);
mNotificationInfo.findViewById(R.id.alert).performClick();
@@ -1202,10 +820,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_UNSPECIFIED,
true);
mNotificationInfo.findViewById(R.id.silence).performClick();
@@ -1236,10 +852,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_MIN,
false);
assertEquals(mContext.getString(R.string.inline_done_button),
@@ -1273,10 +887,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_MIN,
false);
assertEquals(mContext.getString(R.string.inline_done_button),
@@ -1309,10 +921,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_DEFAULT,
true);
mNotificationInfo.findViewById(R.id.silence).performClick();
@@ -1336,10 +946,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_LOW,
false);
assertEquals(mContext.getString(R.string.inline_done_button),
@@ -1366,10 +974,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_LOW,
false);
mNotificationInfo.findViewById(R.id.alert).performClick();
@@ -1399,10 +1005,8 @@
mEntry,
null,
null,
- null,
true,
false,
- IMPORTANCE_LOW,
false);
mNotificationInfo.findViewById(R.id.alert).performClick();
@@ -1425,14 +1029,10 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- (Runnable saveImportance, StatusBarNotification sbn) -> {
- saveImportance.run();
- },
null,
null,
true,
false,
- IMPORTANCE_LOW,
false
);
@@ -1460,14 +1060,10 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- (Runnable saveImportance, StatusBarNotification sbn) -> {
- saveImportance.run();
- },
null,
null,
true,
false,
- IMPORTANCE_LOW,
false
);
@@ -1488,14 +1084,10 @@
mNotificationChannel,
mNotificationChannelSet,
mEntry,
- (Runnable saveImportance, StatusBarNotification sbn) -> {
- saveImportance.run();
- },
null,
null,
true,
false,
- IMPORTANCE_LOW,
false
);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
index 05f10e3..487885a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
@@ -29,8 +29,10 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.KeyguardIndicationController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.policy.AccessibilityController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -63,6 +65,13 @@
private StatusBarStateController mStatusBarStateController;
@Mock
private ConfigurationController mConfigurationController;
+ @Mock
+ private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator;
+ @Mock
+ private KeyguardBypassController mKeyguardBypassController;
+ @Mock
+ private DockManager mDockManager;
+
@Before
public void setUp() {
@@ -71,7 +80,8 @@
mLockIconController = new LockscreenLockIconController(
mLockscreenGestureLogger, mKeyguardUpdateMonitor, mLockPatternUtils,
mShadeController, mAccessibilityController, mKeyguardIndicationController,
- mStatusBarStateController, mConfigurationController);
+ mStatusBarStateController, mConfigurationController, mNotificationWakeUpCoordinator,
+ mKeyguardBypassController, mDockManager);
mLockIconController.attach(mLockIcon);
}
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 88b517c..7c833fa 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -467,9 +467,9 @@
mNightMode = Secure.getIntForUser(context.getContentResolver(),
Secure.UI_NIGHT_MODE, defaultNightMode, userId);
mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(),
- Secure.UI_NIGHT_MODE_OVERRIDE_ON, defaultNightMode, userId) != 0;
+ Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0;
mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(),
- Secure.UI_NIGHT_MODE_OVERRIDE_OFF, defaultNightMode, userId) != 0;
+ Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
Secure.getLongForUser(context.getContentResolver(),
Secure.DARK_THEME_CUSTOM_START_TIME,
@@ -1045,7 +1045,6 @@
final TwilightState lastState = mTwilightManager.getLastTwilightState();
activateNightMode = lastState == null ? mComputedNightMode : lastState.isNight();
}
-
updateComputedNightModeLocked(activateNightMode);
} else {
if (mTwilightManager != null) {
@@ -1375,6 +1374,9 @@
private void updateComputedNightModeLocked(boolean activate) {
mComputedNightMode = activate;
+ if (mNightMode == MODE_NIGHT_YES || mNightMode == UiModeManager.MODE_NIGHT_NO) {
+ return;
+ }
if (mOverrideNightModeOn && !mComputedNightMode) {
mComputedNightMode = true;
return;
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 8fbe923..6b917bc 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -19,16 +19,12 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
import android.app.ActivityThread;
-import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
-import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.OnPropertiesChangedListener;
import android.provider.DeviceConfig.Properties;
@@ -37,7 +33,6 @@
import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Slog;
-import android.util.SparseArray;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -294,12 +289,6 @@
// started, the restriction is on while-in-use permissions.)
volatile boolean mFlagBackgroundFgsStartRestrictionEnabled = true;
- /**
- * UserId to Assistant ComponentName mapping.
- * Per user Assistant ComponentName is from {@link android.provider.Settings.Secure#ASSISTANT}
- */
- SparseArray<ComponentName> mAssistants = new SparseArray<>();
-
private final ActivityManagerService mService;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -375,8 +364,6 @@
Settings.Global.getUriFor(
Settings.Global.FOREGROUND_SERVICE_STARTS_LOGGING_ENABLED);
- private static final Uri ASSISTANT_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
-
private static final Uri ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI =
Settings.Global.getUriFor(Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS);
@@ -443,8 +430,6 @@
mResolver.registerContentObserver(ACTIVITY_STARTS_LOGGING_ENABLED_URI, false, this);
mResolver.registerContentObserver(FOREGROUND_SERVICE_STARTS_LOGGING_ENABLED_URI,
false, this);
- mResolver.registerContentObserver(ASSISTANT_URI, false, this,
- UserHandle.USER_ALL);
if (mSystemServerAutomaticHeapDumpEnabled) {
mResolver.registerContentObserver(ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI,
false, this);
@@ -460,7 +445,6 @@
// The following read from Settings.
updateActivityStartsLoggingEnabled();
updateForegroundServiceStartsLoggingEnabled();
- updateAssistant();
}
private void loadDeviceConfigConstants() {
@@ -492,8 +476,6 @@
updateForegroundServiceStartsLoggingEnabled();
} else if (ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI.equals(uri)) {
updateEnableAutomaticSystemServerHeapDumps();
- } else if (ASSISTANT_URI.equals(uri)) {
- updateAssistant();
}
}
@@ -590,32 +572,6 @@
mFlagForegroundServiceStartsLoggingEnabled = Settings.Global.getInt(mResolver,
Settings.Global.FOREGROUND_SERVICE_STARTS_LOGGING_ENABLED, 1) == 1;
}
-
- private void updateAssistant() {
- final List<UserInfo> users =
- mService.mContext.getSystemService(UserManager.class).getUsers();
- SparseArray<ComponentName> componentNames = new SparseArray<>();
- for (int i = 0; i < users.size(); i++) {
- final int userId = users.get(i).id;
- final String str = Settings.Secure.getStringForUser(mResolver,
- Settings.Secure.ASSISTANT, userId);
- if (!TextUtils.isEmpty(str)) {
- componentNames.put(userId, ComponentName.unflattenFromString(str));
- }
- }
- synchronized (mService) {
- for (int i = 0; i < mAssistants.size(); i++) {
- mService.mServices.mWhiteListAllowWhileInUsePermissionInFgs.remove(
- mAssistants.valueAt(i).getPackageName());
- }
- mAssistants = componentNames;
- for (int i = 0; i < mAssistants.size(); i++) {
- mService.mServices.mWhiteListAllowWhileInUsePermissionInFgs.add(
- mAssistants.valueAt(i).getPackageName());
- }
- }
- }
-
private void updateBackgroundFgsStartsRestriction() {
mFlagBackgroundFgsStartRestrictionEnabled = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index e484ca0..968528c 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -52,7 +52,6 @@
import android.net.IpPrefix;
import android.net.IpSecManager;
import android.net.IpSecManager.IpSecTunnelInterface;
-import android.net.IpSecManager.UdpEncapsulationSocket;
import android.net.IpSecTransform;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -2201,7 +2200,6 @@
/** Signal to ensure shutdown is honored even if a new Network is connected. */
private boolean mIsRunning = true;
- @Nullable private UdpEncapsulationSocket mEncapSocket;
@Nullable private IpSecTunnelInterface mTunnelIface;
@Nullable private IkeSession mSession;
@Nullable private Network mActiveNetwork;
@@ -2352,29 +2350,21 @@
resetIkeState();
mActiveNetwork = network;
- // TODO(b/149356682): Update this based on new IKE API
- mEncapSocket = mIpSecManager.openUdpEncapsulationSocket();
-
- // TODO(b/149356682): Update this based on new IKE API
final IkeSessionParams ikeSessionParams =
- VpnIkev2Utils.buildIkeSessionParams(mProfile, mEncapSocket);
+ VpnIkev2Utils.buildIkeSessionParams(mContext, mProfile, network);
final ChildSessionParams childSessionParams =
VpnIkev2Utils.buildChildSessionParams();
// TODO: Remove the need for adding two unused addresses with
// IPsec tunnels.
+ final InetAddress address = InetAddress.getLocalHost();
mTunnelIface =
mIpSecManager.createIpSecTunnelInterface(
- ikeSessionParams.getServerAddress() /* unused */,
- ikeSessionParams.getServerAddress() /* unused */,
+ address /* unused */,
+ address /* unused */,
network);
mNetd.setInterfaceUp(mTunnelIface.getInterfaceName());
- // Socket must be bound to prevent network switches from causing
- // the IKE teardown to fail/timeout.
- // TODO(b/149356682): Update this based on new IKE API
- network.bindSocket(mEncapSocket.getFileDescriptor());
-
mSession = mIkev2SessionCreator.createIkeSession(
mContext,
ikeSessionParams,
@@ -2459,16 +2449,6 @@
mSession.kill(); // Kill here to make sure all resources are released immediately
mSession = null;
}
-
- // TODO(b/149356682): Update this based on new IKE API
- if (mEncapSocket != null) {
- try {
- mEncapSocket.close();
- } catch (IOException e) {
- Log.e(TAG, "Failed to close encap socket", e);
- }
- mEncapSocket = null;
- }
}
/**
diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
index 33fc32b..3da304c 100644
--- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
+++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
@@ -35,10 +35,10 @@
import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_HMAC_SHA1;
import android.annotation.NonNull;
+import android.content.Context;
import android.net.Ikev2VpnProfile;
import android.net.InetAddresses;
import android.net.IpPrefix;
-import android.net.IpSecManager.UdpEncapsulationSocket;
import android.net.IpSecTransform;
import android.net.Network;
import android.net.RouteInfo;
@@ -84,18 +84,14 @@
*/
public class VpnIkev2Utils {
static IkeSessionParams buildIkeSessionParams(
- @NonNull Ikev2VpnProfile profile, @NonNull UdpEncapsulationSocket socket) {
- // TODO(b/149356682): Update this based on new IKE API. Only numeric addresses supported
- // until then. All others throw IAE (caught by caller).
- final InetAddress serverAddr = InetAddresses.parseNumericAddress(profile.getServerAddr());
+ @NonNull Context context, @NonNull Ikev2VpnProfile profile, @NonNull Network network) {
final IkeIdentification localId = parseIkeIdentification(profile.getUserIdentity());
final IkeIdentification remoteId = parseIkeIdentification(profile.getServerAddr());
- // TODO(b/149356682): Update this based on new IKE API.
final IkeSessionParams.Builder ikeOptionsBuilder =
- new IkeSessionParams.Builder()
- .setServerAddress(serverAddr)
- .setUdpEncapsulationSocket(socket)
+ new IkeSessionParams.Builder(context)
+ .setServerHostname(profile.getServerAddr())
+ .setNetwork(network)
.setLocalIdentification(localId)
.setRemoteIdentification(remoteId);
setIkeAuth(profile, ikeOptionsBuilder);
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 8c510b7..e9c4b51 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -472,8 +472,7 @@
private int mSyncRandomOffset;
- // STOPSHIP: b/143656271 this should be true on launch
- private static final boolean DELETE_LEGACY_PARCEL_FILES = false;
+ private static final boolean DELETE_LEGACY_PARCEL_FILES = true;
private static final String LEGACY_STATUS_FILE_NAME = "status.bin";
private static final String LEGACY_STATISTICS_FILE_NAME = "stats.bin";
@@ -2076,7 +2075,7 @@
}
// if upgrade to proto was successful, delete parcel file
- if (DELETE_LEGACY_PARCEL_FILES && mStatusFile.exists()) {
+ if (DELETE_LEGACY_PARCEL_FILES && parcelStatus.exists() && mStatusFile.exists()) {
parcelStatus.delete();
}
}
@@ -2475,7 +2474,7 @@
}
// if upgrade to proto was successful, delete parcel file
- if (DELETE_LEGACY_PARCEL_FILES && mStatisticsFile.exists()) {
+ if (DELETE_LEGACY_PARCEL_FILES && parcelStats.exists() && mStatisticsFile.exists()) {
parcelStats.delete();
}
}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 6faf674..c1c3760 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -1572,6 +1572,24 @@
"This operation requires secure lock screen feature");
}
checkWritePermission(userId);
+
+ // When changing credential for profiles with unified challenge, some callers
+ // will pass in empty credential while others will pass in the credential of
+ // the parent user. setLockCredentialInternal() handles the formal case (empty
+ // credential) correctly but not the latter. As a stopgap fix, convert the latter
+ // case to the formal. The long-term fix would be fixing LSS such that it should
+ // accept only the parent user credential on its public API interfaces, swap it
+ // with the profile's random credential at that API boundary (i.e. here) and make
+ // sure LSS internally does not special case profile with unififed challenge: b/80170828.
+ if (!savedCredential.isNone() && isManagedProfileWithUnifiedLock(userId)) {
+ // Verify the parent credential again, to make sure we have a fresh enough
+ // auth token such that getDecryptedPasswordForTiedProfile() inside
+ // setLockCredentialInternal() can function correctly.
+ verifyCredential(savedCredential, /* challenge */ 0,
+ mUserManager.getProfileParent(userId).id);
+ savedCredential.zeroize();
+ savedCredential = LockscreenCredential.createNone();
+ }
synchronized (mSeparateChallengeLock) {
if (!setLockCredentialInternal(credential, savedCredential,
userId, /* isLockTiedToParent= */ false)) {
@@ -1627,6 +1645,7 @@
// get credential from keystore when managed profile has unified lock
if (savedCredential.isNone()) {
try {
+ //TODO: remove as part of b/80170828
savedCredential = getDecryptedPasswordForTiedProfile(userId);
} catch (FileNotFoundException e) {
Slog.i(TAG, "Child profile key not found");
@@ -2876,6 +2895,7 @@
if (savedCredential.isNone() && isManagedProfileWithUnifiedLock(userId)) {
// get credential from keystore when managed profile has unified lock
try {
+ //TODO: remove as part of b/80170828
savedCredential = getDecryptedPasswordForTiedProfile(userId);
} catch (FileNotFoundException e) {
Slog.i(TAG, "Child profile key not found");
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index b5e7ea0..e7553b6 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2189,19 +2189,19 @@
private void registerNotificationPreferencesPullers() {
mPullAtomCallback = new StatsPullAtomCallbackImpl();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
PACKAGE_NOTIFICATION_PREFERENCES,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
mPullAtomCallback
);
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
PACKAGE_NOTIFICATION_CHANNEL_PREFERENCES,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
mPullAtomCallback
);
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 2bd1a26..a83a847 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -321,6 +321,8 @@
Set<String> mimeGroupNames = other.mimeGroups != null ? other.mimeGroups.keySet() : null;
updateMimeGroups(mimeGroupNames);
+
+ getPkgState().updateFrom(other.getPkgState());
}
@NonNull
diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
index e27bf48..edb6d65 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
@@ -27,6 +27,7 @@
import com.android.internal.util.DataClass;
import com.android.server.pm.PackageSetting;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -88,6 +89,22 @@
return latestUse;
}
+ public void updateFrom(PackageStateUnserialized other) {
+ this.hiddenUntilInstalled = other.hiddenUntilInstalled;
+
+ if (!other.usesLibraryInfos.isEmpty()) {
+ this.usesLibraryInfos = new ArrayList<>(other.usesLibraryInfos);
+ }
+
+ if (!other.usesLibraryFiles.isEmpty()) {
+ this.usesLibraryFiles = new ArrayList<>(other.usesLibraryFiles);
+ }
+
+ this.updatedSystemApp = other.updatedSystemApp;
+ this.lastPackageUsageTimeInMills = other.lastPackageUsageTimeInMills;
+ this.overrideSeInfo = other.overrideSeInfo;
+ }
+
// Code below generated by codegen v1.0.14.
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 612989f..32cff3b 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -182,7 +182,7 @@
* How long to wait on an individual subsystem to return its stats.
*/
private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
- private static final long NS_PER_SEC = 1000000000;
+ private static final long MILLIS_PER_SEC = 1000;
private static final long MILLI_AMP_HR_TO_NANO_AMP_SECS = 1_000_000L * 3600L;
private static final int MAX_BATTERY_STATS_HELPER_FREQUENCY_MS = 1000;
@@ -680,7 +680,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2, 3, 4, 5})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -772,7 +772,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {3, 4, 5, 6})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -810,7 +810,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2, 3, 4, 5})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -848,7 +848,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {3, 4, 5, 6})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -886,7 +886,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2, 3})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -955,7 +955,7 @@
private void registerKernelWakelock() {
int tagId = FrameworkStatsLog.KERNEL_WAKELOCK;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
/* PullAtomMetadata */ null,
BackgroundThread.getExecutor(),
@@ -986,7 +986,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {3})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1017,7 +1017,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2, 3})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1046,7 +1046,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {4})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1078,7 +1078,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1105,7 +1105,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {3})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1130,7 +1130,7 @@
private void registerWifiActivityInfo() {
int tagId = FrameworkStatsLog.WIFI_ACTIVITY_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1182,7 +1182,7 @@
private void registerModemActivityInfo() {
int tagId = FrameworkStatsLog.MODEM_ACTIVITY_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1220,7 +1220,7 @@
private void registerBluetoothActivityInfo() {
int tagId = FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
/* metadata */ null,
BackgroundThread.getExecutor(),
@@ -1249,10 +1249,10 @@
private void registerSystemElapsedRealtime() {
int tagId = FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setCoolDownNs(NS_PER_SEC)
- .setTimeoutNs(NS_PER_SEC / 2)
+ .setCoolDownMillis(MILLIS_PER_SEC)
+ .setTimeoutMillis(MILLIS_PER_SEC / 2)
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1271,7 +1271,7 @@
private void registerSystemUptime() {
int tagId = FrameworkStatsLog.SYSTEM_UPTIME;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1293,7 +1293,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {4, 5, 6, 7, 8})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1336,7 +1336,7 @@
private void registerProcessMemoryHighWaterMark() {
int tagId = FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1389,7 +1389,7 @@
private void registerProcessMemorySnapshot() {
int tagId = FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1449,7 +1449,7 @@
private void registerSystemIonHeapSize() {
int tagId = FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1472,7 +1472,7 @@
return;
}
int tagId = FrameworkStatsLog.ION_HEAP_SIZE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
/* PullAtomMetadata */ null,
BackgroundThread.getExecutor(),
@@ -1492,7 +1492,7 @@
private void registerProcessSystemIonHeapSize() {
int tagId = FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1518,7 +1518,7 @@
private void registerTemperature() {
int tagId = FrameworkStatsLog.TEMPERATURE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1556,7 +1556,7 @@
private void registerCoolingDevice() {
int tagId = FrameworkStatsLog.COOLING_DEVICE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1596,7 +1596,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {4, 5, 6, 8, 12})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1639,7 +1639,7 @@
private void registerBinderCallsStatsExceptions() {
int tagId = FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1674,7 +1674,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {5, 6, 7, 8, 9})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -1716,7 +1716,7 @@
private void registerDiskStats() {
int tagId = FrameworkStatsLog.DISK_STATS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1782,7 +1782,7 @@
private void registerDirectoryUsage() {
int tagId = FrameworkStatsLog.DIRECTORY_USAGE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1823,7 +1823,7 @@
private void registerAppSize() {
int tagId = FrameworkStatsLog.APP_SIZE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1867,7 +1867,7 @@
private void registerCategorySize() {
int tagId = FrameworkStatsLog.CATEGORY_SIZE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1971,7 +1971,7 @@
private void registerNumFingerprintsEnrolled() {
int tagId = FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -1981,7 +1981,7 @@
private void registerNumFacesEnrolled() {
int tagId = FrameworkStatsLog.NUM_FACES_ENROLLED;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2039,7 +2039,7 @@
private void registerProcStats() {
int tagId = FrameworkStatsLog.PROC_STATS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2049,7 +2049,7 @@
private void registerProcStatsPkgProc() {
int tagId = FrameworkStatsLog.PROC_STATS_PKG_PROC;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2120,9 +2120,9 @@
int tagId = FrameworkStatsLog.DISK_IO;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11})
- .setCoolDownNs(3 * NS_PER_SEC)
+ .setCoolDownMillis(3 * MILLIS_PER_SEC)
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -2155,7 +2155,7 @@
private void registerPowerProfile() {
int tagId = FrameworkStatsLog.POWER_PROFILE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
/* PullAtomMetadata */ null,
BackgroundThread.getExecutor(),
@@ -2180,9 +2180,9 @@
int tagId = FrameworkStatsLog.PROCESS_CPU_TIME;
// Min cool-down is 5 sec, in line with what ActivityManagerService uses.
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
- .setCoolDownNs(5 * NS_PER_SEC)
+ .setCoolDownMillis(5 * MILLIS_PER_SEC)
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -2217,7 +2217,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -2310,7 +2310,7 @@
private void registerDeviceCalculatedPowerUse() {
int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2330,7 +2330,7 @@
private void registerDeviceCalculatedPowerBlameUid() {
int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2360,7 +2360,7 @@
private void registerDeviceCalculatedPowerBlameOther() {
int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2396,7 +2396,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {1, 2, 3, 4})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -2447,7 +2447,7 @@
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
.setAdditiveFields(new int[] {1, 2, 3, 4})
.build();
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
metadata,
BackgroundThread.getExecutor(),
@@ -2485,7 +2485,7 @@
private void registerBuildInformation() {
int tagId = FrameworkStatsLog.BUILD_INFORMATION;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2512,7 +2512,7 @@
private void registerRoleHolder() {
int tagId = FrameworkStatsLog.ROLE_HOLDER;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2570,7 +2570,7 @@
private void registerDangerousPermissionState() {
int tagId = FrameworkStatsLog.DANGEROUS_PERMISSION_STATE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2660,7 +2660,7 @@
private void registerTimeZoneDataInfo() {
int tagId = FrameworkStatsLog.TIME_ZONE_DATA_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2687,7 +2687,7 @@
private void registerExternalStorageInfo() {
int tagId = FrameworkStatsLog.EXTERNAL_STORAGE_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2737,7 +2737,7 @@
private void registerAppsOnExternalStorageInfo() {
int tagId = FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2793,7 +2793,7 @@
private void registerFaceSettings() {
int tagId = FrameworkStatsLog.FACE_SETTINGS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2847,7 +2847,7 @@
private void registerAppOps() {
int tagId = FrameworkStatsLog.APP_OPS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2857,7 +2857,7 @@
private void registerRuntimeAppOpAccessMessage() {
int tagId = FrameworkStatsLog.RUNTIME_APP_OP_ACCESS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -2927,7 +2927,7 @@
private void registerAppFeaturesOps() {
int tagId = FrameworkStatsLog.APP_FEATURES_OPS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3080,7 +3080,7 @@
private void registerNotificationRemoteViews() {
int tagId = FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3124,7 +3124,7 @@
private void registerDangerousPermissionStateSampled() {
int tagId = FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3134,7 +3134,7 @@
private void registerBatteryLevel() {
int tagId = FrameworkStatsLog.BATTERY_LEVEL;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3144,7 +3144,7 @@
private void registerRemainingBatteryCapacity() {
int tagId = FrameworkStatsLog.REMAINING_BATTERY_CAPACITY;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3154,7 +3154,7 @@
private void registerFullBatteryCapacity() {
int tagId = FrameworkStatsLog.FULL_BATTERY_CAPACITY;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3164,7 +3164,7 @@
private void registerBatteryVoltage() {
int tagId = FrameworkStatsLog.BATTERY_VOLTAGE;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
@@ -3174,7 +3174,7 @@
private void registerBatteryCycleCount() {
int tagId = FrameworkStatsLog.BATTERY_CYCLE_COUNT;
- mStatsManager.registerPullAtomCallback(
+ mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
BackgroundThread.getExecutor(),
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index bc12923..420675c 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -1469,11 +1469,11 @@
if (resumeNext) {
final ActivityStack topStack = mRootWindowContainer.getTopDisplayFocusedStack();
- if (!topStack.shouldSleepOrShutDownActivities()) {
+ if (topStack != null && !topStack.shouldSleepOrShutDownActivities()) {
mRootWindowContainer.resumeFocusedStacksTopActivities(topStack, prev, null);
} else {
checkReadyForSleep();
- ActivityRecord top = topStack.topRunningActivity();
+ final ActivityRecord top = topStack != null ? topStack.topRunningActivity() : null;
if (top == null || (prev != null && top != prev)) {
// If there are no more activities available to run, do resume anyway to start
// something. Also if the top activity on the stack is not the just paused
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 3210304..984ae21 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -615,12 +615,15 @@
int res;
synchronized (mService.mGlobalLock) {
- final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
- stack.mConfigWillChange = mRequest.globalConfig != null
+ final boolean globalConfigWillChange = mRequest.globalConfig != null
&& mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
+ final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
+ if (stack != null) {
+ stack.mConfigWillChange = globalConfigWillChange;
+ }
if (DEBUG_CONFIGURATION) {
Slog.v(TAG_CONFIGURATION, "Starting activity when config will change = "
- + stack.mConfigWillChange);
+ + globalConfigWillChange);
}
final long origId = Binder.clearCallingIdentity();
@@ -633,7 +636,7 @@
Binder.restoreCallingIdentity(origId);
- if (stack.mConfigWillChange) {
+ if (globalConfigWillChange) {
// If the caller also wants to switch to a new configuration, do so now.
// This allows a clean switch, as we are waiting for the current activity
// to pause (so we will not destroy it), and have not yet started the
@@ -641,7 +644,9 @@
mService.mAmInternal.enforceCallingPermission(
android.Manifest.permission.CHANGE_CONFIGURATION,
"updateConfiguration()");
- stack.mConfigWillChange = false;
+ if (stack != null) {
+ stack.mConfigWillChange = false;
+ }
if (DEBUG_CONFIGURATION) {
Slog.v(TAG_CONFIGURATION,
"Updating to new configuration after starting activity.");
@@ -1536,9 +1541,11 @@
// If the activity being launched is the same as the one currently at the top, then
// we need to check if it should only be launched once.
final ActivityStack topStack = mRootWindowContainer.getTopDisplayFocusedStack();
- startResult = deliverToCurrentTopIfNeeded(topStack);
- if (startResult != START_SUCCESS) {
- return startResult;
+ if (topStack != null) {
+ startResult = deliverToCurrentTopIfNeeded(topStack);
+ if (startResult != START_SUCCESS) {
+ return startResult;
+ }
}
if (mTargetStack == null) {
@@ -2126,10 +2133,13 @@
if ((startFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
ActivityRecord checkedCaller = sourceRecord;
if (checkedCaller == null) {
- checkedCaller = mRootWindowContainer.getTopDisplayFocusedStack()
- .topRunningNonDelayedActivityLocked(mNotTop);
+ ActivityStack topFocusedStack = mRootWindowContainer.getTopDisplayFocusedStack();
+ if (topFocusedStack != null) {
+ checkedCaller = topFocusedStack.topRunningNonDelayedActivityLocked(mNotTop);
+ }
}
- if (!checkedCaller.mActivityComponent.equals(r.mActivityComponent)) {
+ if (checkedCaller == null
+ || !checkedCaller.mActivityComponent.equals(r.mActivityComponent)) {
// Caller is not the same as launcher, so always needed.
mStartFlags &= ~START_FLAG_ONLY_IF_NEEDED;
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 98c8b61..911812b 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1104,8 +1104,8 @@
// If this is coming from the currently resumed activity, it is
// effectively saying that app switches are allowed at this point.
final ActivityStack stack = getTopDisplayFocusedStack();
- if (stack.mResumedActivity != null &&
- stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
+ if (stack != null && stack.mResumedActivity != null
+ && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
mAppSwitchesAllowedTime = 0;
}
}
@@ -1951,8 +1951,13 @@
public boolean isTopActivityImmersive() {
enforceNotIsolatedCaller("isTopActivityImmersive");
synchronized (mGlobalLock) {
- final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivity();
- return (r != null) ? r.immersive : false;
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ if (topFocusedStack == null) {
+ return false;
+ }
+
+ final ActivityRecord r = topFocusedStack.topRunningActivity();
+ return r != null && r.immersive;
}
}
@@ -1981,7 +1986,8 @@
public int getFrontActivityScreenCompatMode() {
enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
synchronized (mGlobalLock) {
- final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivity();
+ final ActivityStack stack = getTopDisplayFocusedStack();
+ final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
if (r == null) {
return ActivityManager.COMPAT_MODE_UNKNOWN;
}
@@ -1995,7 +2001,8 @@
"setFrontActivityScreenCompatMode");
ApplicationInfo ai;
synchronized (mGlobalLock) {
- final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivity();
+ final ActivityStack stack = getTopDisplayFocusedStack();
+ final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
if (r == null) {
Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
return;
@@ -2383,7 +2390,10 @@
synchronized (mGlobalLock) {
final long origId = Binder.clearCallingIdentity();
try {
- getTopDisplayFocusedStack().unhandledBackLocked();
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ if (topFocusedStack != null) {
+ topFocusedStack.unhandledBackLocked();
+ }
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -3616,7 +3626,8 @@
"enqueueAssistContext()");
synchronized (mGlobalLock) {
- ActivityRecord activity = getTopDisplayFocusedStack().getTopNonFinishingActivity();
+ final ActivityStack stack = getTopDisplayFocusedStack();
+ ActivityRecord activity = stack != null ? stack.getTopNonFinishingActivity() : null;
if (activity == null) {
Slog.w(TAG, "getAssistContextExtras failed: no top activity");
return null;
@@ -7037,9 +7048,9 @@
mRootWindowContainer.dumpDisplayConfigs(pw, " ");
}
if (dumpAll) {
- if (dumpPackage == null) {
- pw.println(" mConfigWillChange: "
- + getTopDisplayFocusedStack().mConfigWillChange);
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ if (dumpPackage == null && topFocusedStack != null) {
+ pw.println(" mConfigWillChange: " + topFocusedStack.mConfigWillChange);
}
if (mCompatModePackages.getPackages().size() > 0) {
boolean printed = false;
@@ -7120,7 +7131,10 @@
synchronized (mGlobalLock) {
if (dumpPackage == null) {
getGlobalConfiguration().dumpDebug(proto, GLOBAL_CONFIGURATION);
- proto.write(CONFIG_WILL_CHANGE, getTopDisplayFocusedStack().mConfigWillChange);
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ if (topFocusedStack != null) {
+ proto.write(CONFIG_WILL_CHANGE, topFocusedStack.mConfigWillChange);
+ }
writeSleepStateToProto(proto, wakeFullness, testPssMode);
if (mRunningVoice != null) {
final long vrToken = proto.start(
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ada5685..74c3044 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1980,7 +1980,9 @@
}
boolean switchUser(int userId, UserState uss) {
- final int focusStackId = getTopDisplayFocusedStack().getRootTaskId();
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ final int focusStackId = topFocusedStack != null
+ ? topFocusedStack.getRootTaskId() : INVALID_TASK_ID;
// We dismiss the docked stack whenever we switch users.
final ActivityStack dockedStack = getDefaultDisplay().getRootSplitScreenPrimaryTask();
if (dockedStack != null) {
@@ -3455,7 +3457,12 @@
ArrayList<ActivityRecord> getDumpActivities(String name, boolean dumpVisibleStacksOnly,
boolean dumpFocusedStackOnly) {
if (dumpFocusedStackOnly) {
- return getTopDisplayFocusedStack().getDumpActivitiesLocked(name);
+ final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
+ if (topFocusedStack != null) {
+ return topFocusedStack.getDumpActivitiesLocked(name);
+ } else {
+ return new ArrayList<>();
+ }
} else {
ArrayList<ActivityRecord> activities = new ArrayList<>();
int numDisplays = getChildCount();
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 8f5d048..b38c18b 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -463,8 +463,9 @@
int configMask = change.getConfigSetMask();
int windowMask = change.getWindowSetMask();
configMask &= ActivityInfo.CONFIG_WINDOW_CONFIGURATION
- | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
- windowMask &= WindowConfiguration.WINDOW_CONFIG_BOUNDS;
+ | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE | ActivityInfo.CONFIG_SCREEN_SIZE;
+ windowMask &= (WindowConfiguration.WINDOW_CONFIG_BOUNDS
+ | WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS);
int effects = 0;
if (configMask != 0) {
Configuration c = new Configuration(container.getRequestedOverrideConfiguration());
diff --git a/services/core/java/com/android/server/wm/TaskTile.java b/services/core/java/com/android/server/wm/TaskTile.java
index 74d5c33..205b423 100644
--- a/services/core/java/com/android/server/wm/TaskTile.java
+++ b/services/core/java/com/android/server/wm/TaskTile.java
@@ -147,7 +147,7 @@
*/
void updateResolvedConfig(Configuration inOutResolvedConfig) {
Rect resolveBounds = inOutResolvedConfig.windowConfiguration.getBounds();
- if (resolveBounds == null || resolveBounds.isEmpty()) {
+ if (resolveBounds.isEmpty()) {
resolveBounds.set(getRequestedOverrideBounds());
}
int stackMode = inOutResolvedConfig.windowConfiguration.getWindowingMode();
@@ -162,6 +162,17 @@
inOutResolvedConfig.smallestScreenWidthDp =
getRequestedOverrideConfiguration().smallestScreenWidthDp;
}
+ if (inOutResolvedConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED) {
+ inOutResolvedConfig.screenWidthDp = getRequestedOverrideConfiguration().screenWidthDp;
+ }
+ if (inOutResolvedConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
+ inOutResolvedConfig.screenHeightDp = getRequestedOverrideConfiguration().screenHeightDp;
+ }
+ Rect resolveAppBounds = inOutResolvedConfig.windowConfiguration.getAppBounds();
+ if (resolveAppBounds == null || resolveAppBounds.isEmpty()) {
+ inOutResolvedConfig.windowConfiguration.setAppBounds(
+ getRequestedOverrideConfiguration().windowConfiguration.getAppBounds());
+ }
}
@Override
@@ -184,7 +195,6 @@
boolean isResizable = topTask == null || topTask.isResizeable();
info.resizeMode = isResizable ? RESIZE_MODE_RESIZEABLE : RESIZE_MODE_UNRESIZEABLE;
info.topActivityType = top == null ? ACTIVITY_TYPE_UNDEFINED : top.getActivityType();
- info.configuration.setTo(getRequestedOverrideConfiguration());
}
@Override
diff --git a/services/people/java/com/android/server/people/PeopleService.java b/services/people/java/com/android/server/people/PeopleService.java
index 983a639..37bf664 100644
--- a/services/people/java/com/android/server/people/PeopleService.java
+++ b/services/people/java/com/android/server/people/PeopleService.java
@@ -72,13 +72,13 @@
}
@Override
- public void onUserUnlocking(@NonNull TargetUser targetUser) {
- mDataManager.onUserUnlocked(targetUser.getUserIdentifier());
+ public void onUserUnlocked(@NonNull TargetUser user) {
+ mDataManager.onUserUnlocked(user.getUserIdentifier());
}
@Override
- public void onUserStopping(@NonNull TargetUser targetUser) {
- mDataManager.onUserStopped(targetUser.getUserIdentifier());
+ public void onUserStopping(@NonNull TargetUser user) {
+ mDataManager.onUserStopping(user.getUserIdentifier());
}
@VisibleForTesting
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java
index e4ce6ba..4e0afc5 100644
--- a/services/people/java/com/android/server/people/data/DataManager.java
+++ b/services/people/java/com/android/server/people/data/DataManager.java
@@ -198,13 +198,13 @@
DataMaintenanceService.scheduleJob(mContext, userId);
}
- /** This method is called when a user is stopped. */
- public void onUserStopped(int userId) {
+ /** This method is called when a user is stopping. */
+ public void onUserStopping(int userId) {
if (mUserDataArray.indexOfKey(userId) >= 0) {
mUserDataArray.get(userId).setUserStopped();
}
if (mUsageStatsQueryFutures.indexOfKey(userId) >= 0) {
- mUsageStatsQueryFutures.valueAt(userId).cancel(true);
+ mUsageStatsQueryFutures.get(userId).cancel(true);
}
if (mBroadcastReceivers.indexOfKey(userId) >= 0) {
mContext.unregisterReceiver(mBroadcastReceivers.get(userId));
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 2e77c9f..684bbd4 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -236,6 +236,7 @@
@Test
public void testSetLockCredential_forProfileWithSeparateChallenge_updatesCredentials()
throws Exception {
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, true, null);
initializeStorageWithCredential(
MANAGED_PROFILE_USER_ID,
newPattern("12345"),
diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
index 624b67c..a4d63ac 100644
--- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java
@@ -269,7 +269,7 @@
assertEquals(1, conversations.size());
assertEquals("sc_1", conversations.get(0).getShortcutId());
- mDataManager.onUserStopped(USER_ID_PRIMARY);
+ mDataManager.onUserStopping(USER_ID_PRIMARY);
conversations = getConversationsInPrimary();
assertTrue(conversations.isEmpty());
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
index e501452..48a583c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
@@ -39,6 +39,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -253,6 +254,30 @@
}
@Test
+ public void testOverrideConfigSize() {
+ removeGlobalMinSizeRestriction();
+ final ActivityStack stack = new ActivityTestsBase.StackBuilder(mWm.mRoot)
+ .setWindowingMode(WINDOWING_MODE_FREEFORM).build();
+ final Task task = stack.getTopMostTask();
+ WindowContainerTransaction t = new WindowContainerTransaction();
+ t.setBounds(task.mRemoteToken, new Rect(10, 10, 100, 100));
+ mWm.mAtmService.mTaskOrganizerController.applyContainerTransaction(t, null);
+ final int origScreenWDp = task.getConfiguration().screenHeightDp;
+ final int origScreenHDp = task.getConfiguration().screenHeightDp;
+ t = new WindowContainerTransaction();
+ // verify that setting config overrides on parent restricts children.
+ t.setScreenSizeDp(stack.mRemoteToken, origScreenWDp, origScreenHDp);
+ t.setBounds(task.mRemoteToken, new Rect(10, 10, 150, 200));
+ mWm.mAtmService.mTaskOrganizerController.applyContainerTransaction(t, null);
+ assertEquals(origScreenHDp, task.getConfiguration().screenHeightDp);
+ t = new WindowContainerTransaction();
+ t.setScreenSizeDp(stack.mRemoteToken, Configuration.SCREEN_WIDTH_DP_UNDEFINED,
+ Configuration.SCREEN_HEIGHT_DP_UNDEFINED);
+ mWm.mAtmService.mTaskOrganizerController.applyContainerTransaction(t, null);
+ assertNotEquals(origScreenHDp, task.getConfiguration().screenHeightDp);
+ }
+
+ @Test
public void testCreateDeleteRootTasks() {
RunningTaskInfo info1 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
Display.DEFAULT_DISPLAY,
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index 01abb26..558f4cd 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -19,6 +19,10 @@
import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.hardware.radio.V1_1.EutranBands;
+import android.hardware.radio.V1_1.GeranBands;
+import android.hardware.radio.V1_5.AccessNetwork;
+import android.hardware.radio.V1_5.UtranBands;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -84,13 +88,13 @@
public @interface RadioAccessNetworkType {}
public static final class AccessNetworkType {
- public static final int UNKNOWN = 0;
- public static final int GERAN = 1;
- public static final int UTRAN = 2;
- public static final int EUTRAN = 3;
- public static final int CDMA2000 = 4;
- public static final int IWLAN = 5;
- public static final int NGRAN = 6;
+ public static final int UNKNOWN = AccessNetwork.UNKNOWN;
+ public static final int GERAN = AccessNetwork.GERAN;
+ public static final int UTRAN = AccessNetwork.UTRAN;
+ public static final int EUTRAN = AccessNetwork.EUTRAN;
+ public static final int CDMA2000 = AccessNetwork.CDMA2000;
+ public static final int IWLAN = AccessNetwork.IWLAN;
+ public static final int NGRAN = AccessNetwork.NGRAN;
/** @hide */
private AccessNetworkType() {}
@@ -115,20 +119,20 @@
* http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/14.00.00_60/ts_145005v140000p.pdf
*/
public static final class GeranBand {
- public static final int BAND_T380 = 1;
- public static final int BAND_T410 = 2;
- public static final int BAND_450 = 3;
- public static final int BAND_480 = 4;
- public static final int BAND_710 = 5;
- public static final int BAND_750 = 6;
- public static final int BAND_T810 = 7;
- public static final int BAND_850 = 8;
- public static final int BAND_P900 = 9;
- public static final int BAND_E900 = 10;
- public static final int BAND_R900 = 11;
- public static final int BAND_DCS1800 = 12;
- public static final int BAND_PCS1900 = 13;
- public static final int BAND_ER900 = 14;
+ public static final int BAND_T380 = GeranBands.BAND_T380;
+ public static final int BAND_T410 = GeranBands.BAND_T410;
+ public static final int BAND_450 = GeranBands.BAND_450;
+ public static final int BAND_480 = GeranBands.BAND_480;
+ public static final int BAND_710 = GeranBands.BAND_710;
+ public static final int BAND_750 = GeranBands.BAND_750;
+ public static final int BAND_T810 = GeranBands.BAND_T810;
+ public static final int BAND_850 = GeranBands.BAND_850;
+ public static final int BAND_P900 = GeranBands.BAND_P900;
+ public static final int BAND_E900 = GeranBands.BAND_E900;
+ public static final int BAND_R900 = GeranBands.BAND_R900;
+ public static final int BAND_DCS1800 = GeranBands.BAND_DCS1800;
+ public static final int BAND_PCS1900 = GeranBands.BAND_PCS1900;
+ public static final int BAND_ER900 = GeranBands.BAND_ER900;
/** @hide */
private GeranBand() {}
@@ -139,28 +143,28 @@
* http://www.etsi.org/deliver/etsi_ts/125100_125199/125104/13.03.00_60/ts_125104v130p.pdf
*/
public static final class UtranBand {
- public static final int BAND_1 = 1;
- public static final int BAND_2 = 2;
- public static final int BAND_3 = 3;
- public static final int BAND_4 = 4;
- public static final int BAND_5 = 5;
- public static final int BAND_6 = 6;
- public static final int BAND_7 = 7;
- public static final int BAND_8 = 8;
- public static final int BAND_9 = 9;
- public static final int BAND_10 = 10;
- public static final int BAND_11 = 11;
- public static final int BAND_12 = 12;
- public static final int BAND_13 = 13;
- public static final int BAND_14 = 14;
+ public static final int BAND_1 = UtranBands.BAND_1;
+ public static final int BAND_2 = UtranBands.BAND_2;
+ public static final int BAND_3 = UtranBands.BAND_3;
+ public static final int BAND_4 = UtranBands.BAND_4;
+ public static final int BAND_5 = UtranBands.BAND_5;
+ public static final int BAND_6 = UtranBands.BAND_6;
+ public static final int BAND_7 = UtranBands.BAND_7;
+ public static final int BAND_8 = UtranBands.BAND_8;
+ public static final int BAND_9 = UtranBands.BAND_9;
+ public static final int BAND_10 = UtranBands.BAND_10;
+ public static final int BAND_11 = UtranBands.BAND_11;
+ public static final int BAND_12 = UtranBands.BAND_12;
+ public static final int BAND_13 = UtranBands.BAND_13;
+ public static final int BAND_14 = UtranBands.BAND_14;
// band 15, 16, 17, 18 are reserved
- public static final int BAND_19 = 19;
- public static final int BAND_20 = 20;
- public static final int BAND_21 = 21;
- public static final int BAND_22 = 22;
+ public static final int BAND_19 = UtranBands.BAND_19;
+ public static final int BAND_20 = UtranBands.BAND_20;
+ public static final int BAND_21 = UtranBands.BAND_21;
+ public static final int BAND_22 = UtranBands.BAND_22;
// band 23, 24 are reserved
- public static final int BAND_25 = 25;
- public static final int BAND_26 = 26;
+ public static final int BAND_25 = UtranBands.BAND_25;
+ public static final int BAND_26 = UtranBands.BAND_26;
// Frequency bands for TD-SCDMA. Defined in 3GPP TS 25.102, Table 5.2.
@@ -169,38 +173,38 @@
* 1900 - 1920 MHz: Uplink and downlink transmission
* 2010 - 2025 MHz: Uplink and downlink transmission
*/
- public static final int BAND_A = 101;
+ public static final int BAND_A = UtranBands.BAND_A;
/**
* Band B
* 1850 - 1910 MHz: Uplink and downlink transmission
* 1930 - 1990 MHz: Uplink and downlink transmission
*/
- public static final int BAND_B = 102;
+ public static final int BAND_B = UtranBands.BAND_B;
/**
* Band C
* 1910 - 1930 MHz: Uplink and downlink transmission
*/
- public static final int BAND_C = 103;
+ public static final int BAND_C = UtranBands.BAND_C;
/**
* Band D
* 2570 - 2620 MHz: Uplink and downlink transmission
*/
- public static final int BAND_D = 104;
+ public static final int BAND_D = UtranBands.BAND_D;
/**
* Band E
* 2300—2400 MHz: Uplink and downlink transmission
*/
- public static final int BAND_E = 105;
+ public static final int BAND_E = UtranBands.BAND_E;
/**
* Band F
* 1880 - 1920 MHz: Uplink and downlink transmission
*/
- public static final int BAND_F = 106;
+ public static final int BAND_F = UtranBands.BAND_F;
/** @hide */
private UtranBand() {}
@@ -211,54 +215,54 @@
* http://www.etsi.org/deliver/etsi_ts/136100_136199/136101/14.03.00_60/ts_136101v140p.pdf
*/
public static final class EutranBand {
- public static final int BAND_1 = 1;
- public static final int BAND_2 = 2;
- public static final int BAND_3 = 3;
- public static final int BAND_4 = 4;
- public static final int BAND_5 = 5;
- public static final int BAND_6 = 6;
- public static final int BAND_7 = 7;
- public static final int BAND_8 = 8;
- public static final int BAND_9 = 9;
- public static final int BAND_10 = 10;
- public static final int BAND_11 = 11;
- public static final int BAND_12 = 12;
- public static final int BAND_13 = 13;
- public static final int BAND_14 = 14;
- public static final int BAND_17 = 17;
- public static final int BAND_18 = 18;
- public static final int BAND_19 = 19;
- public static final int BAND_20 = 20;
- public static final int BAND_21 = 21;
- public static final int BAND_22 = 22;
- public static final int BAND_23 = 23;
- public static final int BAND_24 = 24;
- public static final int BAND_25 = 25;
- public static final int BAND_26 = 26;
- public static final int BAND_27 = 27;
- public static final int BAND_28 = 28;
- public static final int BAND_30 = 30;
- public static final int BAND_31 = 31;
- public static final int BAND_33 = 33;
- public static final int BAND_34 = 34;
- public static final int BAND_35 = 35;
- public static final int BAND_36 = 36;
- public static final int BAND_37 = 37;
- public static final int BAND_38 = 38;
- public static final int BAND_39 = 39;
- public static final int BAND_40 = 40;
- public static final int BAND_41 = 41;
- public static final int BAND_42 = 42;
- public static final int BAND_43 = 43;
- public static final int BAND_44 = 44;
- public static final int BAND_45 = 45;
- public static final int BAND_46 = 46;
- public static final int BAND_47 = 47;
- public static final int BAND_48 = 48;
- public static final int BAND_65 = 65;
- public static final int BAND_66 = 66;
- public static final int BAND_68 = 68;
- public static final int BAND_70 = 70;
+ public static final int BAND_1 = EutranBands.BAND_1;
+ public static final int BAND_2 = EutranBands.BAND_2;
+ public static final int BAND_3 = EutranBands.BAND_3;
+ public static final int BAND_4 = EutranBands.BAND_4;
+ public static final int BAND_5 = EutranBands.BAND_5;
+ public static final int BAND_6 = EutranBands.BAND_6;
+ public static final int BAND_7 = EutranBands.BAND_7;
+ public static final int BAND_8 = EutranBands.BAND_8;
+ public static final int BAND_9 = EutranBands.BAND_9;
+ public static final int BAND_10 = EutranBands.BAND_10;
+ public static final int BAND_11 = EutranBands.BAND_11;
+ public static final int BAND_12 = EutranBands.BAND_12;
+ public static final int BAND_13 = EutranBands.BAND_13;
+ public static final int BAND_14 = EutranBands.BAND_14;
+ public static final int BAND_17 = EutranBands.BAND_17;
+ public static final int BAND_18 = EutranBands.BAND_18;
+ public static final int BAND_19 = EutranBands.BAND_19;
+ public static final int BAND_20 = EutranBands.BAND_20;
+ public static final int BAND_21 = EutranBands.BAND_21;
+ public static final int BAND_22 = EutranBands.BAND_22;
+ public static final int BAND_23 = EutranBands.BAND_23;
+ public static final int BAND_24 = EutranBands.BAND_24;
+ public static final int BAND_25 = EutranBands.BAND_25;
+ public static final int BAND_26 = EutranBands.BAND_26;
+ public static final int BAND_27 = EutranBands.BAND_27;
+ public static final int BAND_28 = EutranBands.BAND_28;
+ public static final int BAND_30 = EutranBands.BAND_30;
+ public static final int BAND_31 = EutranBands.BAND_31;
+ public static final int BAND_33 = EutranBands.BAND_33;
+ public static final int BAND_34 = EutranBands.BAND_34;
+ public static final int BAND_35 = EutranBands.BAND_35;
+ public static final int BAND_36 = EutranBands.BAND_36;
+ public static final int BAND_37 = EutranBands.BAND_37;
+ public static final int BAND_38 = EutranBands.BAND_38;
+ public static final int BAND_39 = EutranBands.BAND_39;
+ public static final int BAND_40 = EutranBands.BAND_40;
+ public static final int BAND_41 = EutranBands.BAND_41;
+ public static final int BAND_42 = EutranBands.BAND_42;
+ public static final int BAND_43 = EutranBands.BAND_43;
+ public static final int BAND_44 = EutranBands.BAND_44;
+ public static final int BAND_45 = EutranBands.BAND_45;
+ public static final int BAND_46 = EutranBands.BAND_46;
+ public static final int BAND_47 = EutranBands.BAND_47;
+ public static final int BAND_48 = EutranBands.BAND_48;
+ public static final int BAND_65 = EutranBands.BAND_65;
+ public static final int BAND_66 = EutranBands.BAND_66;
+ public static final int BAND_68 = EutranBands.BAND_68;
+ public static final int BAND_70 = EutranBands.BAND_70;
/** @hide */
private EutranBand() {};
@@ -304,51 +308,51 @@
*/
public static final class NgranBands {
/** FR1 bands */
- public static final int BAND_1 = 1;
- public static final int BAND_2 = 2;
- public static final int BAND_3 = 3;
- public static final int BAND_5 = 5;
- public static final int BAND_7 = 7;
- public static final int BAND_8 = 8;
- public static final int BAND_12 = 12;
- public static final int BAND_14 = 14;
- public static final int BAND_18 = 18;
- public static final int BAND_20 = 20;
- public static final int BAND_25 = 25;
- public static final int BAND_28 = 28;
- public static final int BAND_29 = 29;
- public static final int BAND_30 = 30;
- public static final int BAND_34 = 34;
- public static final int BAND_38 = 38;
- public static final int BAND_39 = 39;
- public static final int BAND_40 = 40;
- public static final int BAND_41 = 41;
- public static final int BAND_48 = 48;
- public static final int BAND_50 = 50;
- public static final int BAND_51 = 51;
- public static final int BAND_65 = 65;
- public static final int BAND_66 = 66;
- public static final int BAND_70 = 70;
- public static final int BAND_71 = 71;
- public static final int BAND_74 = 74;
- public static final int BAND_75 = 75;
- public static final int BAND_76 = 76;
- public static final int BAND_77 = 77;
- public static final int BAND_78 = 78;
- public static final int BAND_79 = 79;
- public static final int BAND_80 = 80;
- public static final int BAND_81 = 81;
- public static final int BAND_82 = 82;
- public static final int BAND_83 = 83;
- public static final int BAND_84 = 84;
- public static final int BAND_86 = 86;
- public static final int BAND_90 = 90;
+ public static final int BAND_1 = android.hardware.radio.V1_5.NgranBands.BAND_1;
+ public static final int BAND_2 = android.hardware.radio.V1_5.NgranBands.BAND_2;
+ public static final int BAND_3 = android.hardware.radio.V1_5.NgranBands.BAND_3;
+ public static final int BAND_5 = android.hardware.radio.V1_5.NgranBands.BAND_5;
+ public static final int BAND_7 = android.hardware.radio.V1_5.NgranBands.BAND_7;
+ public static final int BAND_8 = android.hardware.radio.V1_5.NgranBands.BAND_8;
+ public static final int BAND_12 = android.hardware.radio.V1_5.NgranBands.BAND_12;
+ public static final int BAND_14 = android.hardware.radio.V1_5.NgranBands.BAND_14;
+ public static final int BAND_18 = android.hardware.radio.V1_5.NgranBands.BAND_18;
+ public static final int BAND_20 = android.hardware.radio.V1_5.NgranBands.BAND_20;
+ public static final int BAND_25 = android.hardware.radio.V1_5.NgranBands.BAND_25;
+ public static final int BAND_28 = android.hardware.radio.V1_5.NgranBands.BAND_28;
+ public static final int BAND_29 = android.hardware.radio.V1_5.NgranBands.BAND_29;
+ public static final int BAND_30 = android.hardware.radio.V1_5.NgranBands.BAND_30;
+ public static final int BAND_34 = android.hardware.radio.V1_5.NgranBands.BAND_34;
+ public static final int BAND_38 = android.hardware.radio.V1_5.NgranBands.BAND_38;
+ public static final int BAND_39 = android.hardware.radio.V1_5.NgranBands.BAND_39;
+ public static final int BAND_40 = android.hardware.radio.V1_5.NgranBands.BAND_40;
+ public static final int BAND_41 = android.hardware.radio.V1_5.NgranBands.BAND_41;
+ public static final int BAND_48 = android.hardware.radio.V1_5.NgranBands.BAND_48;
+ public static final int BAND_50 = android.hardware.radio.V1_5.NgranBands.BAND_50;
+ public static final int BAND_51 = android.hardware.radio.V1_5.NgranBands.BAND_51;
+ public static final int BAND_65 = android.hardware.radio.V1_5.NgranBands.BAND_65;
+ public static final int BAND_66 = android.hardware.radio.V1_5.NgranBands.BAND_66;
+ public static final int BAND_70 = android.hardware.radio.V1_5.NgranBands.BAND_70;
+ public static final int BAND_71 = android.hardware.radio.V1_5.NgranBands.BAND_71;
+ public static final int BAND_74 = android.hardware.radio.V1_5.NgranBands.BAND_74;
+ public static final int BAND_75 = android.hardware.radio.V1_5.NgranBands.BAND_75;
+ public static final int BAND_76 = android.hardware.radio.V1_5.NgranBands.BAND_76;
+ public static final int BAND_77 = android.hardware.radio.V1_5.NgranBands.BAND_77;
+ public static final int BAND_78 = android.hardware.radio.V1_5.NgranBands.BAND_78;
+ public static final int BAND_79 = android.hardware.radio.V1_5.NgranBands.BAND_79;
+ public static final int BAND_80 = android.hardware.radio.V1_5.NgranBands.BAND_80;
+ public static final int BAND_81 = android.hardware.radio.V1_5.NgranBands.BAND_81;
+ public static final int BAND_82 = android.hardware.radio.V1_5.NgranBands.BAND_82;
+ public static final int BAND_83 = android.hardware.radio.V1_5.NgranBands.BAND_83;
+ public static final int BAND_84 = android.hardware.radio.V1_5.NgranBands.BAND_84;
+ public static final int BAND_86 = android.hardware.radio.V1_5.NgranBands.BAND_86;
+ public static final int BAND_90 = android.hardware.radio.V1_5.NgranBands.BAND_90;
/** FR2 bands */
- public static final int BAND_257 = 257;
- public static final int BAND_258 = 258;
- public static final int BAND_260 = 260;
- public static final int BAND_261 = 261;
+ public static final int BAND_257 = android.hardware.radio.V1_5.NgranBands.BAND_257;
+ public static final int BAND_258 = android.hardware.radio.V1_5.NgranBands.BAND_258;
+ public static final int BAND_260 = android.hardware.radio.V1_5.NgranBands.BAND_260;
+ public static final int BAND_261 = android.hardware.radio.V1_5.NgranBands.BAND_261;
/**
* NR Bands
diff --git a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
index 61f3dba..4ecca2d 100644
--- a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
+++ b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
@@ -78,13 +78,12 @@
return false;
}
String res = mTestDevice.executeShellCommand("kill -s SIGUSR1 " + pid).trim();
- assertTrue("kill SIGUSR1: " + res, res.length() == 0);
- return true;
+ return res.length() == 0;
}
@Test
public void testSystemServerProfile() throws Exception {
- final int numIterations = 20;
+ final int numIterations = 30;
String res;
// Set properties and wait for them to be readable.
for (int i = 1; i <= numIterations; ++i) {
diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
index 339df93..475305e 100644
--- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
+++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java
@@ -32,7 +32,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -51,7 +51,7 @@
}
@DataClass.Generated.Member
- public HierrarchicalDataClassBase setBaseData(int value) {
+ public HierrarchicalDataClassBase setBaseData( int value) {
mBaseData = value;
return this;
}
@@ -98,8 +98,8 @@
};
@DataClass.Generated(
- time = 1574122837821L,
- codegenVersion = "1.0.14",
+ time = 1582685650576L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassBase.java",
inputSignatures = "private int mBaseData\nclass HierrarchicalDataClassBase extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genSetters=true)")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
index 69e06b2..150b324 100644
--- a/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
+++ b/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java
@@ -46,7 +46,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -120,8 +120,8 @@
};
@DataClass.Generated(
- time = 1574122838768L,
- codegenVersion = "1.0.14",
+ time = 1582685651560L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/HierrarchicalDataClassChild.java",
inputSignatures = "private @android.annotation.NonNull java.lang.String mChildData\nclass HierrarchicalDataClassChild extends com.android.codegentest.HierrarchicalDataClassBase implements []\n@com.android.internal.util.DataClass(genParcelable=true, genConstructor=false, genSetters=true)")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
index ca128be..3087156 100644
--- a/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
+++ b/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java
@@ -54,7 +54,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -355,7 +355,7 @@
}
@DataClass.Generated.Member
- public @NonNull Builder setNullableBoolean(@SuppressWarnings({ "WeakerAccess" }) @Nullable Boolean value) {
+ public @NonNull Builder setNullableBoolean(@SuppressWarnings({ "WeakerAccess" }) @NonNull Boolean value) {
checkNotUsed();
mBuilderFieldsSet |= 0x80;
mNullableBoolean = value;
@@ -412,8 +412,8 @@
}
@DataClass.Generated(
- time = 1574122836960L,
- codegenVersion = "1.0.14",
+ time = 1582685649678L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/ParcelAllTheThingsDataClass.java",
inputSignatures = " @android.annotation.NonNull java.lang.String[] mStringArray\n @android.annotation.NonNull int[] mIntArray\n @android.annotation.NonNull java.util.List<java.lang.String> mStringList\n @android.annotation.NonNull java.util.Map<java.lang.String,com.android.codegentest.SampleWithCustomBuilder> mMap\n @android.annotation.NonNull java.util.Map<java.lang.String,java.lang.String> mStringMap\n @android.annotation.NonNull android.util.SparseArray<com.android.codegentest.SampleWithCustomBuilder> mSparseArray\n @android.annotation.NonNull android.util.SparseIntArray mSparseIntArray\n @java.lang.SuppressWarnings({\"WeakerAccess\"}) @android.annotation.Nullable java.lang.Boolean mNullableBoolean\nclass ParcelAllTheThingsDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
index c850bf8..8d421bf 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java
@@ -342,7 +342,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -512,7 +512,7 @@
@Nullable LinkAddress[] linkAddresses5,
@StringRes int stringRes,
@android.annotation.IntRange(from = 0, to = 6) int dayOfWeek,
- @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] coords) {
+ @Size(2) @NonNull @FloatRange(from = 0f) float[] coords) {
this.mNum = num;
this.mNum2 = num2;
this.mNum4 = num4;
@@ -790,7 +790,7 @@
* @see AnnotationValidations#validate(Class, Size, int, String, int)
*/
@DataClass.Generated.Member
- public @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] getCoords() {
+ public @Size(2) @NonNull @FloatRange(from = 0f) float[] getCoords() {
return mCoords;
}
@@ -820,7 +820,7 @@
* pieces in multiple places for each field.
*/
@DataClass.Generated.Member
- public SampleDataClass setNum(int value) {
+ public SampleDataClass setNum( int value) {
mNum = value;
return this;
}
@@ -832,7 +832,7 @@
* @see #mNum2 ..and so should blocks at the bottom, e.g. {@code @see} blocks.
*/
@DataClass.Generated.Member
- public SampleDataClass setNum2(int value) {
+ public SampleDataClass setNum2( int value) {
mNum2 = value;
return this;
}
@@ -846,7 +846,7 @@
* @hide
*/
@DataClass.Generated.Member
- public SampleDataClass setNum4(int value) {
+ public SampleDataClass setNum4( int value) {
mNum4 = value;
return this;
}
@@ -855,7 +855,7 @@
* {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields.
*/
@DataClass.Generated.Member
- public SampleDataClass setName(@Nullable String value) {
+ public SampleDataClass setName(@NonNull String value) {
mName = value;
return this;
}
@@ -892,7 +892,7 @@
* E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc.
*/
@DataClass.Generated.Member
- public SampleDataClass setOtherParcelable(@Nullable AccessibilityNodeInfo value) {
+ public SampleDataClass setOtherParcelable(@NonNull AccessibilityNodeInfo value) {
mOtherParcelable = value;
return this;
}
@@ -957,7 +957,7 @@
* @see Builder#setLinkAddresses4(LinkAddress...)
*/
@DataClass.Generated.Member
- public SampleDataClass setLinkAddresses4(@Nullable LinkAddress... value) {
+ public SampleDataClass setLinkAddresses4(@NonNull LinkAddress... value) {
mLinkAddresses4 = value;
return this;
}
@@ -1070,7 +1070,7 @@
* @see AnnotationValidations#validate(Class, Size, int, String, int)
*/
@DataClass.Generated.Member
- public SampleDataClass setCoords(@Size(2) @NonNull @Each @FloatRange(from = 0f) float... value) {
+ public SampleDataClass setCoords(@Size(2) @NonNull @FloatRange(from = 0f) float... value) {
mCoords = value;
AnnotationValidations.validate(
Size.class, null, mCoords.length,
@@ -1451,7 +1451,7 @@
private @Nullable LinkAddress[] mLinkAddresses5;
private @StringRes int mStringRes;
private @android.annotation.IntRange(from = 0, to = 6) int mDayOfWeek;
- private @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] mCoords;
+ private @Size(2) @NonNull @FloatRange(from = 0f) float[] mCoords;
private long mBuilderFieldsSet = 0L;
@@ -1549,7 +1549,7 @@
* {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields.
*/
@DataClass.Generated.Member
- public @NonNull Builder setName(@Nullable String value) {
+ public @NonNull Builder setName(@NonNull String value) {
checkNotUsed();
mBuilderFieldsSet |= 0x8;
mName = value;
@@ -1588,7 +1588,7 @@
* E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc.
*/
@DataClass.Generated.Member
- public @NonNull Builder setOtherParcelable(@Nullable AccessibilityNodeInfo value) {
+ public @NonNull Builder setOtherParcelable(@NonNull AccessibilityNodeInfo value) {
checkNotUsed();
mBuilderFieldsSet |= 0x40;
mOtherParcelable = value;
@@ -1674,7 +1674,7 @@
* @see Builder#setLinkAddresses4(LinkAddress...)
*/
@DataClass.Generated.Member
- public @NonNull Builder setLinkAddresses4(@Nullable LinkAddress... value) {
+ public @NonNull Builder setLinkAddresses4(@NonNull LinkAddress... value) {
checkNotUsed();
mBuilderFieldsSet |= 0x800;
mLinkAddresses4 = value;
@@ -1733,7 +1733,7 @@
* Final fields suppress generating a setter (when setters are requested).
*/
@DataClass.Generated.Member
- public @NonNull Builder setLinkAddresses5(@Nullable LinkAddress... value) {
+ public @NonNull Builder setLinkAddresses5(@NonNull LinkAddress... value) {
checkNotUsed();
mBuilderFieldsSet |= 0x10000;
mLinkAddresses5 = value;
@@ -1785,7 +1785,7 @@
* @see AnnotationValidations#validate(Class, Size, int, String, int)
*/
@DataClass.Generated.Member
- public @NonNull Builder setCoords(@Size(2) @NonNull @Each @FloatRange(from = 0f) float... value) {
+ public @NonNull Builder setCoords(@Size(2) @NonNull @FloatRange(from = 0f) float... value) {
checkNotUsed();
mBuilderFieldsSet |= 0x80000;
mCoords = value;
@@ -1872,8 +1872,8 @@
}
@DataClass.Generated(
- time = 1574122835009L,
- codegenVersion = "1.0.14",
+ time = 1582685647656L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java",
inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate @android.annotation.NonNull java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate @android.annotation.Nullable android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.MyDateParcelling.class) @android.annotation.NonNull java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @android.annotation.NonNull java.util.regex.Pattern mPattern\nprivate @android.annotation.NonNull java.util.List<android.net.LinkAddress> mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") @android.annotation.NonNull java.util.ArrayList<android.net.LinkAddress> mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate @com.android.codegentest.SampleDataClass.StateName @android.annotation.NonNull java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic @android.annotation.NonNull java.lang.CharSequence charSeq\nprivate final @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=6L) int mDayOfWeek\nprivate @android.annotation.Size(2L) @android.annotation.NonNull @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate static java.lang.String defaultName4()\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)\nclass SampleDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=true, genEqualsHashCode=true, genToString=true, genForEachField=true, genSetters=true)")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
index 2de848c..d9fe1fd 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java
@@ -85,7 +85,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -253,8 +253,8 @@
}
@DataClass.Generated(
- time = 1574122835982L,
- codegenVersion = "1.0.14",
+ time = 1582685648622L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithCustomBuilder.java",
inputSignatures = " long delayAmount\n @android.annotation.NonNull java.util.concurrent.TimeUnit delayUnit\n long creationTimestamp\nprivate static java.util.concurrent.TimeUnit unparcelDelayUnit(android.os.Parcel)\nprivate void parcelDelayUnit(android.os.Parcel,int)\nclass SampleWithCustomBuilder extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genAidl=false, genToString=true)\nabstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayAmount(long)\npublic abstract com.android.codegentest.SampleWithCustomBuilder.Builder setDelayUnit(java.util.concurrent.TimeUnit)\npublic com.android.codegentest.SampleWithCustomBuilder.Builder setDelay(long,java.util.concurrent.TimeUnit)\nclass BaseBuilder extends java.lang.Object implements []")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
index 0deffe4..f98d7b0 100644
--- a/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
+++ b/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java
@@ -36,7 +36,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -135,8 +135,8 @@
};
@DataClass.Generated(
- time = 1574122840588L,
- codegenVersion = "1.0.14",
+ time = 1582685653406L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
inputSignatures = " @android.annotation.NonNull java.lang.String mBar\nclass NestedDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
@Deprecated
@@ -160,7 +160,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -259,8 +259,8 @@
};
@DataClass.Generated(
- time = 1574122840597L,
- codegenVersion = "1.0.14",
+ time = 1582685653415L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
inputSignatures = " @android.annotation.NonNull long mBaz2\nclass NestedDataClass3 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
@Deprecated
@@ -274,7 +274,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -373,8 +373,8 @@
};
@DataClass.Generated(
- time = 1574122840608L,
- codegenVersion = "1.0.14",
+ time = 1582685653420L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleWithNestedDataClasses.java",
inputSignatures = " @android.annotation.NonNull java.lang.String mBaz\nclass NestedDataClass2 extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true)")
@Deprecated
diff --git a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
index 712722b..6b4fc2f 100644
--- a/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
+++ b/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java
@@ -51,7 +51,7 @@
- // Code below generated by codegen v1.0.14.
+ // Code below generated by codegen v1.0.15.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -65,8 +65,8 @@
@DataClass.Generated(
- time = 1574122839646L,
- codegenVersion = "1.0.14",
+ time = 1582685652436L,
+ codegenVersion = "1.0.15",
sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/StaleDataclassDetectorFalsePositivesTest.java",
inputSignatures = "public @android.annotation.NonNull java.lang.String someMethod(int)\nclass StaleDataclassDetectorFalsePositivesTest extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false)")
@Deprecated
diff --git a/tools/codegen/src/com/android/codegen/ClassPrinter.kt b/tools/codegen/src/com/android/codegen/ClassPrinter.kt
index c7c80ba..b90e1bb 100644
--- a/tools/codegen/src/com/android/codegen/ClassPrinter.kt
+++ b/tools/codegen/src/com/android/codegen/ClassPrinter.kt
@@ -100,7 +100,7 @@
?: emptyMap()
val internalAnnotations = setOf(ParcelWith, DataClassEnum, PluralOf, UnsupportedAppUsage,
- DataClassSuppressConstDefs)
+ DataClassSuppressConstDefs, MaySetToNull, Each, DataClass)
val knownNonValidationAnnotations = internalAnnotations + Each + Nullable
/**
diff --git a/tools/codegen/src/com/android/codegen/FieldInfo.kt b/tools/codegen/src/com/android/codegen/FieldInfo.kt
index ebfbbd8..02ebaef 100644
--- a/tools/codegen/src/com/android/codegen/FieldInfo.kt
+++ b/tools/codegen/src/com/android/codegen/FieldInfo.kt
@@ -147,9 +147,19 @@
val sParcelling by lazy { customParcellingClass?.let { "sParcellingFor$NameUpperCamel" } }
val SetterParamType = if (isArray) "$FieldInnerType..." else Type
- val annotatedTypeForSetterParam by lazy {
- (annotationsNoInternal + SetterParamType).joinToString(" ")
+ val annotationsForSetterParam by lazy {
+ buildList<String> {
+ addAll(annotationsNoInternal)
+ classPrinter {
+ if ("@$Nullable" in annotations
+ && "@$MaySetToNull" !in annotations) {
+ remove("@$Nullable")
+ add("@$NonNull")
+ }
+ }
+ }.joinToString(" ")
}
+ val annotatedTypeForSetterParam by lazy { "$annotationsForSetterParam $SetterParamType" }
// Utilities
diff --git a/tools/codegen/src/com/android/codegen/Generators.kt b/tools/codegen/src/com/android/codegen/Generators.kt
index 8fe243f..5a96cf1 100644
--- a/tools/codegen/src/com/android/codegen/Generators.kt
+++ b/tools/codegen/src/com/android/codegen/Generators.kt
@@ -315,7 +315,7 @@
generateBuilderMethod(
name = setterName,
defVisibility = visibility,
- paramAnnotations = annotationsNoInternal.joinToString(" "),
+ paramAnnotations = annotationsForSetterParam,
paramTypes = listOf(SetterParamType),
genJavadoc = { generateFieldJavadoc() }) {
+"checkNotUsed();"
diff --git a/tools/codegen/src/com/android/codegen/ImportsProvider.kt b/tools/codegen/src/com/android/codegen/ImportsProvider.kt
index c830aaa..27dd958 100644
--- a/tools/codegen/src/com/android/codegen/ImportsProvider.kt
+++ b/tools/codegen/src/com/android/codegen/ImportsProvider.kt
@@ -39,6 +39,7 @@
val ParcelWith: String get() { return classRef("com.android.internal.util.DataClass.ParcelWith") }
val PluralOf: String get() { return classRef("com.android.internal.util.DataClass.PluralOf") }
val Each: String get() { return classRef("com.android.internal.util.DataClass.Each") }
+ val MaySetToNull: String get() { return classRef("com.android.internal.util.DataClass.MaySetToNull") }
val DataClassGenerated: String get() { return classRef("com.android.internal.util.DataClass.Generated") }
val DataClassSuppressConstDefs: String get() { return classRef("com.android.internal.util.DataClass.SuppressConstDefsGeneration") }
val DataClassSuppress: String get() { return classRef("com.android.internal.util.DataClass.Suppress") }
diff --git a/tools/codegen/src/com/android/codegen/SharedConstants.kt b/tools/codegen/src/com/android/codegen/SharedConstants.kt
index 74c86f4..6f740cd6 100644
--- a/tools/codegen/src/com/android/codegen/SharedConstants.kt
+++ b/tools/codegen/src/com/android/codegen/SharedConstants.kt
@@ -1,7 +1,7 @@
package com.android.codegen
const val CODEGEN_NAME = "codegen"
-const val CODEGEN_VERSION = "1.0.14"
+const val CODEGEN_VERSION = "1.0.15"
const val CANONICAL_BUILDER_CLASS = "Builder"
const val BASE_BUILDER_CLASS = "BaseBuilder"