Merge "Fix autogroupsummary bug" into tm-dev
diff --git a/Android.bp b/Android.bp
index 933d1af..5523986 100644
--- a/Android.bp
+++ b/Android.bp
@@ -132,7 +132,6 @@
":installd_aidl",
":libaudioclient_aidl",
":libbinder_aidl",
- ":libbluetooth-binder-aidl",
":libcamera_client_aidl",
":libcamera_client_framework_aidl",
":libupdate_engine_aidl",
@@ -273,7 +272,6 @@
defaults: ["framework-aidl-export-defaults"],
srcs: [
":framework-non-updatable-sources",
- ":framework-bluetooth-sources", // TODO(b/214988855) : Remove once framework-bluetooth jar is ready
"core/java/**/*.logtags",
":apex-info-list",
],
@@ -287,6 +285,7 @@
"frameworks/native/libs/permission/aidl",
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
+ "packages/modules/Bluetooth/system/binder",
"packages/modules/Connectivity/framework/aidl-export",
"packages/modules/Media/apex/aidl/stable",
"hardware/interfaces/graphics/common/aidl",
@@ -357,7 +356,6 @@
visibility: [
"//frameworks/base",
// TODO(b/147128803) remove the below lines
- "//frameworks/base/apex/appsearch/framework",
"//frameworks/base/apex/blobstore/framework",
"//frameworks/base/apex/jobscheduler/framework",
"//frameworks/base/packages/Tethering/tests/unit",
@@ -545,8 +543,9 @@
"frameworks/native/libs/permission/aidl",
// TODO: remove when moved to the below package
"frameworks/base/packages/ConnectivityT/framework-t/aidl-export",
- "packages/modules/Media/apex/aidl/stable",
+ "packages/modules/Bluetooth/system/binder",
"packages/modules/Connectivity/framework/aidl-export",
+ "packages/modules/Media/apex/aidl/stable",
"hardware/interfaces/graphics/common/aidl",
],
},
@@ -584,6 +583,7 @@
name: "module-classpath-stubs-defaults",
aidl: {
include_dirs: [
+ "packages/modules/Bluetooth/system/binder",
"packages/modules/Connectivity/framework/aidl-export",
"packages/modules/Media/apex/aidl/stable",
],
diff --git a/ApiDocs.bp b/ApiDocs.bp
index ba31161..5b7c125 100644
--- a/ApiDocs.bp
+++ b/ApiDocs.bp
@@ -79,6 +79,7 @@
":conscrypt.module.public.api{.public.stubs.source}",
":i18n.module.public.api{.public.stubs.source}",
+ ":framework-adservices-sources",
":framework-appsearch-sources",
":framework-auxiliary-sources",
":framework-connectivity-sources",
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index 2b0a833..ee0f9e8 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -37,7 +37,6 @@
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.IUidObserver;
-import android.app.job.JobInfo;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.UsageEventListener;
@@ -166,28 +165,6 @@
public long inQuotaTimeElapsed;
/**
- * The time after which the app will be under the bucket quota and can start running
- * low priority jobs again. This is only valid if
- * {@link #executionTimeInWindowMs} >=
- * {@link #mAllowedTimePerPeriodMs} * (1 - {@link #mAllowedTimeSurplusPriorityLow}),
- * {@link #executionTimeInMaxPeriodMs} >= {@link #mMaxExecutionTimeMs},
- * {@link #bgJobCountInWindow} >= {@link #jobCountLimit}, or
- * {@link #sessionCountInWindow} >= {@link #sessionCountLimit}.
- */
- public long inQuotaTimeLowElapsed;
-
- /**
- * The time after which the app will be under the bucket quota and can start running
- * min priority jobs again. This is only valid if
- * {@link #executionTimeInWindowMs} >=
- * {@link #mAllowedTimePerPeriodMs} * (1 - {@link #mAllowedTimeSurplusPriorityMin}),
- * {@link #executionTimeInMaxPeriodMs} >= {@link #mMaxExecutionTimeMs},
- * {@link #bgJobCountInWindow} >= {@link #jobCountLimit}, or
- * {@link #sessionCountInWindow} >= {@link #sessionCountLimit}.
- */
- public long inQuotaTimeMinElapsed;
-
- /**
* The time after which {@link #jobCountInRateLimitingWindow} should be considered invalid,
* in the elapsed realtime timebase.
*/
@@ -227,8 +204,6 @@
+ "bgJobCountInMaxPeriod=" + bgJobCountInMaxPeriod + ", "
+ "sessionCountInWindow=" + sessionCountInWindow + ", "
+ "inQuotaTime=" + inQuotaTimeElapsed + ", "
- + "inQuotaTimeLow=" + inQuotaTimeLowElapsed + ", "
- + "inQuotaTimeMin=" + inQuotaTimeMinElapsed + ", "
+ "rateLimitJobCountExpirationTime=" + jobRateLimitExpirationTimeElapsed + ", "
+ "rateLimitJobCountWindow=" + jobCountInRateLimitingWindow + ", "
+ "rateLimitSessionCountExpirationTime="
@@ -385,24 +360,6 @@
*/
private long mMaxExecutionTimeIntoQuotaMs = mMaxExecutionTimeMs - mQuotaBufferMs;
- /**
- * The percentage of {@link #mAllowedTimePerPeriodMs} that should not be used by
- * {@link JobInfo#PRIORITY_LOW low priority} jobs. In other words, there must be a minimum
- * surplus of this amount of remaining allowed time before we start running low priority
- * jobs.
- */
- private float mAllowedTimeSurplusPriorityLow =
- QcConstants.DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_LOW;
-
- /**
- * The percentage of {@link #mAllowedTimePerPeriodMs} that should not be used by
- * {@link JobInfo#PRIORITY_MIN min priority} jobs. In other words, there must be a minimum
- * surplus of this amount of remaining allowed time before we start running low priority
- * jobs.
- */
- private float mAllowedTimeSurplusPriorityMin =
- QcConstants.DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_MIN;
-
/** The period of time used to rate limit recently run jobs. */
private long mRateLimitingWindowMs = QcConstants.DEFAULT_RATE_LIMITING_WINDOW_MS;
@@ -828,8 +785,7 @@
return mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS;
}
return getTimeUntilQuotaConsumedLocked(
- jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(),
- jobStatus.getEffectivePriority());
+ jobStatus.getSourceUserId(), jobStatus.getSourcePackageName());
}
// Expedited job.
@@ -919,8 +875,7 @@
return isTopStartedJobLocked(jobStatus)
|| isUidInForeground(jobStatus.getSourceUid())
|| isWithinQuotaLocked(
- jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket,
- jobStatus.getEffectivePriority());
+ jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket);
}
@GuardedBy("mLock")
@@ -937,7 +892,7 @@
@VisibleForTesting
@GuardedBy("mLock")
boolean isWithinQuotaLocked(final int userId, @NonNull final String packageName,
- final int standbyBucket, final int priority) {
+ final int standbyBucket) {
if (!mIsEnabled) {
return true;
}
@@ -945,18 +900,9 @@
if (isQuotaFreeLocked(standbyBucket)) return true;
- final long minSurplus;
- if (priority <= JobInfo.PRIORITY_MIN) {
- minSurplus = (long)
- (mAllowedTimePerPeriodMs[standbyBucket] * mAllowedTimeSurplusPriorityMin);
- } else if (priority <= JobInfo.PRIORITY_LOW) {
- minSurplus = (long)
- (mAllowedTimePerPeriodMs[standbyBucket] * mAllowedTimeSurplusPriorityLow);
- } else {
- minSurplus = 0;
- }
ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket);
- return getRemainingExecutionTimeLocked(stats) > minSurplus
+ // TODO: use a higher minimum remaining time for jobs with MINIMUM priority
+ return getRemainingExecutionTimeLocked(stats) > 0
&& isUnderJobCountQuotaLocked(stats, standbyBucket)
&& isUnderSessionCountQuotaLocked(stats, standbyBucket);
}
@@ -1074,8 +1020,7 @@
* job is running.
*/
@VisibleForTesting
- long getTimeUntilQuotaConsumedLocked(final int userId, @NonNull final String packageName,
- @JobInfo.Priority int jobPriority) {
+ long getTimeUntilQuotaConsumedLocked(final int userId, @NonNull final String packageName) {
final long nowElapsed = sElapsedRealtimeClock.millis();
final int standbyBucket = JobSchedulerService.standbyBucketForPackage(
packageName, userId, nowElapsed);
@@ -1096,15 +1041,11 @@
final long startWindowElapsed = nowElapsed - stats.windowSizeMs;
final long startMaxElapsed = nowElapsed - MAX_PERIOD_MS;
- final long allowedTimePerPeriodMs = getAllowedTimePerPeriodMs(standbyBucket, jobPriority);
+ final long allowedTimePerPeriodMs = mAllowedTimePerPeriodMs[standbyBucket];
final long allowedTimeRemainingMs = allowedTimePerPeriodMs - stats.executionTimeInWindowMs;
final long maxExecutionTimeRemainingMs =
mMaxExecutionTimeMs - stats.executionTimeInMaxPeriodMs;
- if (maxExecutionTimeRemainingMs < 0) {
- return 0;
- }
-
// Regular ACTIVE case. Since the bucket size equals the allowed time, the app jobs can
// essentially run until they reach the maximum limit.
if (stats.windowSizeMs == mAllowedTimePerPeriodMs[standbyBucket]) {
@@ -1112,10 +1053,6 @@
sessions, startMaxElapsed, maxExecutionTimeRemainingMs);
}
- if (allowedTimeRemainingMs < 0) {
- return 0;
- }
-
// Need to check both max time and period time in case one is less than the other.
// For example, max time remaining could be less than bucket time remaining, but sessions
// contributing to the max time remaining could phase out enough that we'd want to use the
@@ -1127,21 +1064,6 @@
sessions, startWindowElapsed, allowedTimeRemainingMs));
}
- private long getAllowedTimePerPeriodMs(int standbyBucket, @JobInfo.Priority int jobPriority) {
- return getAllowedTimePerPeriodMs(mAllowedTimePerPeriodMs[standbyBucket], jobPriority);
- }
-
- private long getAllowedTimePerPeriodMs(long initialAllowedTime,
- @JobInfo.Priority int jobPriority) {
- if (jobPriority <= JobInfo.PRIORITY_MIN) {
- return (long) (initialAllowedTime * (1 - mAllowedTimeSurplusPriorityMin));
- }
- if (jobPriority <= JobInfo.PRIORITY_LOW) {
- return (long) (initialAllowedTime * (1 - mAllowedTimeSurplusPriorityLow));
- }
- return initialAllowedTime;
- }
-
/**
* Calculates how much time it will take, in milliseconds, until the quota is fully consumed.
*
@@ -1299,15 +1221,10 @@
stats.sessionCountInWindow = 0;
if (stats.jobCountLimit == 0 || stats.sessionCountLimit == 0) {
// App won't be in quota until configuration changes.
- stats.inQuotaTimeElapsed = stats.inQuotaTimeLowElapsed = stats.inQuotaTimeMinElapsed =
- Long.MAX_VALUE;
+ stats.inQuotaTimeElapsed = Long.MAX_VALUE;
} else {
stats.inQuotaTimeElapsed = 0;
}
- final long allowedTimeMinMs =
- getAllowedTimePerPeriodMs(stats.allowedTimePerPeriodMs, JobInfo.PRIORITY_MIN);
- final long allowedTimeLowMs =
- getAllowedTimePerPeriodMs(stats.allowedTimePerPeriodMs, JobInfo.PRIORITY_LOW);
final long allowedTimeIntoQuotaMs = stats.allowedTimePerPeriodMs - mQuotaBufferMs;
Timer timer = mPkgTimers.get(userId, packageName);
@@ -1326,25 +1243,13 @@
stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed,
nowElapsed - allowedTimeIntoQuotaMs + stats.windowSizeMs);
}
- if (stats.executionTimeInWindowMs >= allowedTimeLowMs) {
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed,
- nowElapsed - allowedTimeLowMs + stats.windowSizeMs);
- }
- if (stats.executionTimeInWindowMs >= allowedTimeMinMs) {
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed,
- nowElapsed - allowedTimeMinMs + stats.windowSizeMs);
- }
if (stats.executionTimeInMaxPeriodMs >= mMaxExecutionTimeIntoQuotaMs) {
final long inQuotaTime = nowElapsed - mMaxExecutionTimeIntoQuotaMs + MAX_PERIOD_MS;
stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, inQuotaTime);
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed, inQuotaTime);
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed, inQuotaTime);
}
if (stats.bgJobCountInWindow >= stats.jobCountLimit) {
final long inQuotaTime = nowElapsed + stats.windowSizeMs;
stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, inQuotaTime);
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed, inQuotaTime);
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed, inQuotaTime);
}
}
@@ -1386,23 +1291,9 @@
start + stats.executionTimeInWindowMs - allowedTimeIntoQuotaMs
+ stats.windowSizeMs);
}
- if (stats.executionTimeInWindowMs >= allowedTimeLowMs) {
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed,
- start + stats.executionTimeInWindowMs - allowedTimeLowMs
- + stats.windowSizeMs);
- }
- if (stats.executionTimeInWindowMs >= allowedTimeMinMs) {
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed,
- start + stats.executionTimeInWindowMs - allowedTimeMinMs
- + stats.windowSizeMs);
- }
if (stats.bgJobCountInWindow >= stats.jobCountLimit) {
final long inQuotaTime = session.endTimeElapsed + stats.windowSizeMs;
stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, inQuotaTime);
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed,
- inQuotaTime);
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed,
- inQuotaTime);
}
if (i == loopStart
|| (sessions.get(i + 1).startTimeElapsed - session.endTimeElapsed)
@@ -1413,10 +1304,6 @@
if (sessionCountInWindow >= stats.sessionCountLimit) {
final long inQuotaTime = session.endTimeElapsed + stats.windowSizeMs;
stats.inQuotaTimeElapsed = Math.max(stats.inQuotaTimeElapsed, inQuotaTime);
- stats.inQuotaTimeLowElapsed = Math.max(stats.inQuotaTimeLowElapsed,
- inQuotaTime);
- stats.inQuotaTimeMinElapsed = Math.max(stats.inQuotaTimeMinElapsed,
- inQuotaTime);
}
}
}
@@ -1706,7 +1593,7 @@
/**
* Update the CONSTRAINT_WITHIN_QUOTA bit for all of the Jobs for a given package.
*
- * @return true if at least one job had its bit changed
+ * @return the set of jobs whose status changed
*/
@NonNull
private ArraySet<JobStatus> maybeUpdateConstraintForPkgLocked(final long nowElapsed,
@@ -1719,8 +1606,7 @@
// Quota is the same for all jobs within a package.
final int realStandbyBucket = jobs.valueAt(0).getStandbyBucket();
- final boolean realInQuota = isWithinQuotaLocked(
- userId, packageName, realStandbyBucket, JobInfo.PRIORITY_DEFAULT);
+ final boolean realInQuota = isWithinQuotaLocked(userId, packageName, realStandbyBucket);
boolean outOfEJQuota = false;
for (int i = jobs.size() - 1; i >= 0; --i) {
final JobStatus js = jobs.valueAt(i);
@@ -1733,8 +1619,7 @@
changedJobs.add(js);
}
} else if (realStandbyBucket != EXEMPTED_INDEX && realStandbyBucket != ACTIVE_INDEX
- && realStandbyBucket == js.getEffectiveStandbyBucket()
- && js.getEffectivePriority() >= JobInfo.PRIORITY_DEFAULT) {
+ && realStandbyBucket == js.getEffectiveStandbyBucket()) {
// An app in the ACTIVE bucket may be out of quota while the job could be in quota
// for some reason. Therefore, avoid setting the real value here and check each job
// individually.
@@ -1798,8 +1683,9 @@
final String packageName = jobStatus.getSourcePackageName();
final int realStandbyBucket = jobStatus.getStandbyBucket();
if (isWithinEJQuota
- && isWithinQuotaLocked(userId, packageName, realStandbyBucket,
- JobInfo.PRIORITY_MIN)) {
+ && isWithinQuotaLocked(userId, packageName, realStandbyBucket)) {
+ // TODO(141645789): we probably shouldn't cancel the alarm until we've verified
+ // that all jobs for the userId-package are within quota.
mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
} else {
mToScheduleStartAlarms.add(userId, packageName, realStandbyBucket);
@@ -1860,25 +1746,8 @@
standbyBucket);
final long remainingEJQuota = getRemainingEJExecutionTimeLocked(userId, packageName);
- int minPriority = JobInfo.PRIORITY_MAX;
- boolean hasDefPlus = false, hasLow = false, hasMin = false;
- for (int i = jobs.size() - 1; i >= 0; --i) {
- final int priority = jobs.valueAt(i).getEffectivePriority();
- minPriority = Math.min(minPriority, priority);
- if (priority <= JobInfo.PRIORITY_MIN) {
- hasMin = true;
- } else if (priority <= JobInfo.PRIORITY_LOW) {
- hasLow = true;
- } else {
- hasDefPlus = true;
- }
- if (hasMin && hasLow && hasDefPlus) {
- break;
- }
- }
final boolean inRegularQuota =
- stats.executionTimeInWindowMs
- < getAllowedTimePerPeriodMs(standbyBucket, minPriority)
+ stats.executionTimeInWindowMs < mAllowedTimePerPeriodMs[standbyBucket]
&& stats.executionTimeInMaxPeriodMs < mMaxExecutionTimeMs
&& isUnderJobCountQuota
&& isUnderTimingSessionCountQuota;
@@ -1900,24 +1769,7 @@
long inEJQuotaTimeElapsed = Long.MAX_VALUE;
if (!inRegularQuota) {
// The time this app will have quota again.
- long executionInQuotaTime = Long.MAX_VALUE;
- boolean hasExecutionInQuotaTime = false;
- if (hasMin && stats.inQuotaTimeMinElapsed > 0) {
- executionInQuotaTime = Math.min(executionInQuotaTime, stats.inQuotaTimeMinElapsed);
- hasExecutionInQuotaTime = true;
- }
- if (hasLow && stats.inQuotaTimeLowElapsed > 0) {
- executionInQuotaTime = Math.min(executionInQuotaTime, stats.inQuotaTimeLowElapsed);
- hasExecutionInQuotaTime = true;
- }
- if (hasDefPlus && stats.inQuotaTimeElapsed > 0) {
- executionInQuotaTime = Math.min(executionInQuotaTime, stats.inQuotaTimeElapsed);
- hasExecutionInQuotaTime = true;
- }
- long inQuotaTimeElapsed = 0;
- if (hasExecutionInQuotaTime) {
- inQuotaTimeElapsed = executionInQuotaTime;
- }
+ long inQuotaTimeElapsed = stats.inQuotaTimeElapsed;
if (!isUnderJobCountQuota && stats.bgJobCountInWindow < stats.jobCountLimit) {
// App hit the rate limit.
inQuotaTimeElapsed =
@@ -2130,7 +1982,6 @@
private final ArraySet<JobStatus> mRunningBgJobs = new ArraySet<>();
private long mStartTimeElapsed;
private int mBgJobCount;
- private int mLowestPriority = JobInfo.PRIORITY_MAX;
private long mDebitAdjustment;
Timer(int uid, int userId, String packageName, boolean regularJobTimer) {
@@ -2153,8 +2004,6 @@
Slog.v(TAG, "Starting to track " + jobStatus.toShortString());
}
// Always maintain list of running jobs, even when quota is free.
- final boolean priorityLowered = mLowestPriority > jobStatus.getEffectivePriority();
- mLowestPriority = Math.min(mLowestPriority, jobStatus.getEffectivePriority());
if (mRunningBgJobs.add(jobStatus) && shouldTrackLocked()) {
mBgJobCount++;
if (mRegularJobTimer) {
@@ -2170,8 +2019,6 @@
invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName);
}
scheduleCutoff();
- } else if (mRegularJobTimer && priorityLowered) {
- rescheduleCutoff();
}
}
}
@@ -2196,19 +2043,6 @@
&& !isQuotaFreeLocked(standbyBucket)) {
emitSessionLocked(nowElapsed);
cancelCutoff();
- mLowestPriority = JobInfo.PRIORITY_MAX;
- } else if (mRegularJobTimer
- && mLowestPriority == jobStatus.getEffectivePriority()) {
- // Lowest priority doesn't matter for EJ timers.
- final int oldPriority = mLowestPriority;
- mLowestPriority = JobInfo.PRIORITY_MAX;
- for (int i = mRunningBgJobs.size() - 1; i >= 0; --i) {
- mLowestPriority = Math.min(mLowestPriority,
- mRunningBgJobs.valueAt(i).getEffectivePriority());
- }
- if (mLowestPriority != oldPriority) {
- rescheduleCutoff();
- }
}
}
}
@@ -2335,14 +2169,9 @@
}
Message msg = mHandler.obtainMessage(
mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg);
- final long timeRemainingMs;
- if (mRegularJobTimer) {
- timeRemainingMs = getTimeUntilQuotaConsumedLocked(
- mPkg.userId, mPkg.packageName, mLowestPriority);
- } else {
- timeRemainingMs =
- getTimeUntilEJQuotaConsumedLocked(mPkg.userId, mPkg.packageName);
- }
+ final long timeRemainingMs = mRegularJobTimer
+ ? getTimeUntilQuotaConsumedLocked(mPkg.userId, mPkg.packageName)
+ : getTimeUntilEJQuotaConsumedLocked(mPkg.userId, mPkg.packageName);
if (DEBUG) {
Slog.i(TAG,
(mRegularJobTimer ? "Regular job" : "EJ") + " for " + mPkg + " has "
@@ -2695,19 +2524,26 @@
Slog.d(TAG, "Checking if " + pkg + " has reached its quota.");
}
- final ArraySet<JobStatus> changedJobs = maybeUpdateConstraintForPkgLocked(
- sElapsedRealtimeClock.millis(), pkg.userId, pkg.packageName);
- if (changedJobs.size() > 0) {
+ long timeRemainingMs = getRemainingExecutionTimeLocked(pkg.userId,
+ pkg.packageName);
+ if (timeRemainingMs <= 50) {
+ // Less than 50 milliseconds left. Start process of shutting down jobs.
if (DEBUG) Slog.d(TAG, pkg + " has reached its quota.");
- mStateChangedListener.onControllerStateChanged(changedJobs);
+ mStateChangedListener.onControllerStateChanged(
+ maybeUpdateConstraintForPkgLocked(
+ sElapsedRealtimeClock.millis(),
+ pkg.userId, pkg.packageName));
} else {
// This could potentially happen if an old session phases out while a
// job is currently running.
// Reschedule message
+ Message rescheduleMsg = obtainMessage(MSG_REACHED_QUOTA, pkg);
+ timeRemainingMs = getTimeUntilQuotaConsumedLocked(pkg.userId,
+ pkg.packageName);
if (DEBUG) {
- Slog.d(TAG, pkg + " had early REACHED_QUOTA message");
+ Slog.d(TAG, pkg + " has " + timeRemainingMs + "ms left.");
}
- mPkgTimers.get(pkg.userId, pkg.packageName).rescheduleCutoff();
+ sendMessageDelayed(rescheduleMsg, timeRemainingMs);
}
break;
}
@@ -2717,19 +2553,25 @@
Slog.d(TAG, "Checking if " + pkg + " has reached its EJ quota.");
}
- final ArraySet<JobStatus> changedJobs = maybeUpdateConstraintForPkgLocked(
- sElapsedRealtimeClock.millis(), pkg.userId, pkg.packageName);
- if (changedJobs.size() > 0) {
+ long timeRemainingMs = getRemainingEJExecutionTimeLocked(
+ pkg.userId, pkg.packageName);
+ if (timeRemainingMs <= 0) {
if (DEBUG) Slog.d(TAG, pkg + " has reached its EJ quota.");
- mStateChangedListener.onControllerStateChanged(changedJobs);
+ mStateChangedListener.onControllerStateChanged(
+ maybeUpdateConstraintForPkgLocked(
+ sElapsedRealtimeClock.millis(),
+ pkg.userId, pkg.packageName));
} else {
// This could potentially happen if an old session phases out while a
// job is currently running.
// Reschedule message
+ Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_QUOTA, pkg);
+ timeRemainingMs = getTimeUntilEJQuotaConsumedLocked(
+ pkg.userId, pkg.packageName);
if (DEBUG) {
- Slog.d(TAG, pkg + " had early REACHED_EJ_QUOTA message");
+ Slog.d(TAG, pkg + " has " + timeRemainingMs + "ms left for EJ");
}
- mEJPkgTimers.get(pkg.userId, pkg.packageName).rescheduleCutoff();
+ sendMessageDelayed(rescheduleMsg, timeRemainingMs);
}
break;
}
@@ -2993,12 +2835,6 @@
static final String KEY_IN_QUOTA_BUFFER_MS =
QC_CONSTANT_PREFIX + "in_quota_buffer_ms";
@VisibleForTesting
- static final String KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW =
- QC_CONSTANT_PREFIX + "allowed_time_surplus_priority_low";
- @VisibleForTesting
- static final String KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN =
- QC_CONSTANT_PREFIX + "allowed_time_surplus_priority_min";
- @VisibleForTesting
static final String KEY_WINDOW_SIZE_EXEMPTED_MS =
QC_CONSTANT_PREFIX + "window_size_exempted_ms";
@VisibleForTesting
@@ -3130,8 +2966,6 @@
10 * 60 * 1000L; // 10 minutes
private static final long DEFAULT_IN_QUOTA_BUFFER_MS =
30 * 1000L; // 30 seconds
- private static final float DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_LOW = .25f;
- private static final float DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_MIN = .5f;
private static final long DEFAULT_WINDOW_SIZE_EXEMPTED_MS =
DEFAULT_ALLOWED_TIME_PER_PERIOD_EXEMPTED_MS; // EXEMPT apps can run jobs at any time
private static final long DEFAULT_WINDOW_SIZE_ACTIVE_MS =
@@ -3230,22 +3064,6 @@
public long IN_QUOTA_BUFFER_MS = DEFAULT_IN_QUOTA_BUFFER_MS;
/**
- * The percentage of ALLOWED_TIME_PER_PERIOD_*_MS that should not be used by
- * {@link JobInfo#PRIORITY_LOW low priority} jobs. In other words, there must be a minimum
- * surplus of this amount of remaining allowed time before we start running low priority
- * jobs.
- */
- public float ALLOWED_TIME_SURPLUS_PRIORITY_LOW = DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_LOW;
-
- /**
- * The percentage of ALLOWED_TIME_PER_PERIOD_*_MS that should not be used by
- * {@link JobInfo#PRIORITY_MIN low priority} jobs. In other words, there must be a minimum
- * surplus of this amount of remaining allowed time before we start running min priority
- * jobs.
- */
- public float ALLOWED_TIME_SURPLUS_PRIORITY_MIN = DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_MIN;
-
- /**
* The quota window size of the particular standby bucket. Apps in this standby bucket are
* expected to run only {@link #ALLOWED_TIME_PER_PERIOD_EXEMPTED_MS} within the past
* WINDOW_SIZE_MS.
@@ -3514,8 +3332,6 @@
case KEY_ALLOWED_TIME_PER_PERIOD_FREQUENT_MS:
case KEY_ALLOWED_TIME_PER_PERIOD_RARE_MS:
case KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS:
- case KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW:
- case KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN:
case KEY_IN_QUOTA_BUFFER_MS:
case KEY_MAX_EXECUTION_TIME_MS:
case KEY_WINDOW_SIZE_ACTIVE_MS:
@@ -3757,7 +3573,6 @@
KEY_ALLOWED_TIME_PER_PERIOD_WORKING_MS, KEY_ALLOWED_TIME_PER_PERIOD_FREQUENT_MS,
KEY_ALLOWED_TIME_PER_PERIOD_RARE_MS, KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
KEY_IN_QUOTA_BUFFER_MS,
- KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW, KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN,
KEY_MAX_EXECUTION_TIME_MS,
KEY_WINDOW_SIZE_EXEMPTED_MS, KEY_WINDOW_SIZE_ACTIVE_MS,
KEY_WINDOW_SIZE_WORKING_MS,
@@ -3781,12 +3596,6 @@
ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS =
properties.getLong(KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
DEFAULT_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS);
- ALLOWED_TIME_SURPLUS_PRIORITY_LOW =
- properties.getFloat(KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW,
- DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_LOW);
- ALLOWED_TIME_SURPLUS_PRIORITY_MIN =
- properties.getFloat(KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN,
- DEFAULT_ALLOWED_TIME_SURPLUS_PRIORITY_MIN);
IN_QUOTA_BUFFER_MS = properties.getLong(KEY_IN_QUOTA_BUFFER_MS,
DEFAULT_IN_QUOTA_BUFFER_MS);
MAX_EXECUTION_TIME_MS = properties.getLong(KEY_MAX_EXECUTION_TIME_MS,
@@ -3865,23 +3674,6 @@
mMaxExecutionTimeIntoQuotaMs = mMaxExecutionTimeMs - mQuotaBufferMs;
mShouldReevaluateConstraints = true;
}
- // Low priority surplus should be in the range [0, .9]. A value of 1 would essentially
- // mean never run low priority jobs.
- float newAllowedTimeSurplusPriorityLow =
- Math.max(0f, Math.min(.9f, ALLOWED_TIME_SURPLUS_PRIORITY_LOW));
- if (Float.compare(
- mAllowedTimeSurplusPriorityLow, newAllowedTimeSurplusPriorityLow) != 0) {
- mAllowedTimeSurplusPriorityLow = newAllowedTimeSurplusPriorityLow;
- mShouldReevaluateConstraints = true;
- }
- // Min priority surplus should be in the range [0, mAllowedTimeSurplusPriorityLow].
- float newAllowedTimeSurplusPriorityMin = Math.max(0f,
- Math.min(mAllowedTimeSurplusPriorityLow, ALLOWED_TIME_SURPLUS_PRIORITY_MIN));
- if (Float.compare(
- mAllowedTimeSurplusPriorityMin, newAllowedTimeSurplusPriorityMin) != 0) {
- mAllowedTimeSurplusPriorityMin = newAllowedTimeSurplusPriorityMin;
- mShouldReevaluateConstraints = true;
- }
long newExemptedPeriodMs = Math.max(mAllowedTimePerPeriodMs[EXEMPTED_INDEX],
Math.min(MAX_PERIOD_MS, WINDOW_SIZE_EXEMPTED_MS));
if (mBucketPeriodsMs[EXEMPTED_INDEX] != newExemptedPeriodMs) {
@@ -4081,10 +3873,6 @@
.println();
pw.print(KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS).println();
- pw.print(KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW, ALLOWED_TIME_SURPLUS_PRIORITY_LOW)
- .println();
- pw.print(KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN, ALLOWED_TIME_SURPLUS_PRIORITY_MIN)
- .println();
pw.print(KEY_IN_QUOTA_BUFFER_MS, IN_QUOTA_BUFFER_MS).println();
pw.print(KEY_WINDOW_SIZE_EXEMPTED_MS, WINDOW_SIZE_EXEMPTED_MS).println();
pw.print(KEY_WINDOW_SIZE_ACTIVE_MS, WINDOW_SIZE_ACTIVE_MS).println();
@@ -4210,16 +3998,6 @@
}
@VisibleForTesting
- float getAllowedTimeSurplusPriorityLow() {
- return mAllowedTimeSurplusPriorityLow;
- }
-
- @VisibleForTesting
- float getAllowedTimeSurplusPriorityMin() {
- return mAllowedTimeSurplusPriorityMin;
- }
-
- @VisibleForTesting
@NonNull
int[] getBucketMaxJobCounts() {
return mMaxBucketJobCounts;
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index cae6cdc..54c3db4 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -104,6 +104,7 @@
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
+import android.util.SparseLongArray;
import android.util.TimeUtils;
import android.view.Display;
import android.widget.Toast;
@@ -260,6 +261,13 @@
private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1);
+ /**
+ * Set of user IDs and the next time (in the elapsed realtime timebase) when we should check the
+ * apps' idle states.
+ */
+ @GuardedBy("mPendingIdleStateChecks")
+ private final SparseLongArray mPendingIdleStateChecks = new SparseLongArray();
+
// Cache the active network scorer queried from the network scorer service
private volatile String mCachedNetworkScorer = null;
// The last time the network scorer service was queried
@@ -722,7 +730,14 @@
@Override
public void postCheckIdleStates(int userId) {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0));
+ if (userId == UserHandle.USER_ALL) {
+ postOneTimeCheckIdleStates();
+ } else {
+ synchronized (mPendingIdleStateChecks) {
+ mPendingIdleStateChecks.put(userId, mInjector.elapsedRealtime());
+ }
+ mHandler.obtainMessage(MSG_CHECK_IDLE_STATES).sendToTarget();
+ }
}
@Override
@@ -2374,10 +2389,32 @@
break;
case MSG_CHECK_IDLE_STATES:
- if (checkIdleStates(msg.arg1) && mAppIdleEnabled) {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(
- MSG_CHECK_IDLE_STATES, msg.arg1, 0),
- mCheckIdleIntervalMillis);
+ removeMessages(MSG_CHECK_IDLE_STATES);
+
+ long earliestCheck = Long.MAX_VALUE;
+ final long nowElapsed = mInjector.elapsedRealtime();
+ synchronized (mPendingIdleStateChecks) {
+ for (int i = mPendingIdleStateChecks.size() - 1; i >= 0; --i) {
+ long expirationTime = mPendingIdleStateChecks.valueAt(i);
+
+ if (expirationTime <= nowElapsed) {
+ final int userId = mPendingIdleStateChecks.keyAt(i);
+ if (checkIdleStates(userId) && mAppIdleEnabled) {
+ expirationTime = nowElapsed + mCheckIdleIntervalMillis;
+ mPendingIdleStateChecks.put(userId, expirationTime);
+ } else {
+ mPendingIdleStateChecks.removeAt(i);
+ continue;
+ }
+ }
+
+ earliestCheck = Math.min(earliestCheck, expirationTime);
+ }
+ }
+ if (earliestCheck != Long.MAX_VALUE) {
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_CHECK_IDLE_STATES),
+ earliestCheck - nowElapsed);
}
break;
diff --git a/api/Android.bp b/api/Android.bp
index 8370c10..9e377a0 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -109,6 +109,7 @@
"android.net.ipsec.ike",
"art.module.public.api",
"conscrypt.module.public.api",
+ "framework-adservices",
"framework-appsearch",
"framework-bluetooth",
"framework-connectivity",
diff --git a/api/api.go b/api/api.go
index 5e5f60e..94bccaa 100644
--- a/api/api.go
+++ b/api/api.go
@@ -203,8 +203,6 @@
func createMergedFrameworkImpl(ctx android.LoadHookContext, modules []string) {
// This module is for the "framework-all" module, which should not include the core libraries.
modules = removeAll(modules, core_libraries_modules)
- // TODO(b/214988855): remove the line below when framework-bluetooth has an impl jar.
- modules = remove(modules, "framework-bluetooth")
props := libraryProps{}
props.Name = proptools.StringPtr("all-framework-module-impl")
props.Static_libs = transformArray(modules, "", ".impl")
diff --git a/boot/Android.bp b/boot/Android.bp
index aa22532..90c3b9c 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -48,6 +48,10 @@
// bootclasspath.
fragments: [
{
+ apex: "com.android.adservices",
+ module: "com.android.adservices-bootclasspath-fragment",
+ },
+ {
apex: "com.android.appsearch",
module: "com.android.appsearch-bootclasspath-fragment",
},
@@ -60,6 +64,10 @@
module: "com.android.auxiliary-bootclasspath-fragment",
},
{
+ apex: "com.android.bluetooth",
+ module: "com.android.bluetooth-bootclasspath-fragment",
+ },
+ {
apex: "com.android.conscrypt",
module: "com.android.conscrypt-bootclasspath-fragment",
},
diff --git a/boot/hiddenapi/hiddenapi-max-target-o.txt b/boot/hiddenapi/hiddenapi-max-target-o.txt
index e346ebf..d3b5be9 100644
--- a/boot/hiddenapi/hiddenapi-max-target-o.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-o.txt
@@ -9733,2812 +9733,6 @@
Landroid/appwidget/PendingHostUpdate;->views:Landroid/widget/RemoteViews;
Landroid/appwidget/PendingHostUpdate;->widgetInfo:Landroid/appwidget/AppWidgetProviderInfo;
Landroid/appwidget/PendingHostUpdate;->writeNullParcelable(Landroid/os/Parcelable;Landroid/os/Parcel;I)V
-Landroid/bluetooth/BluetoothA2dp;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothA2dp;->ACTION_AVRCP_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dp;->DBG:Z
-Landroid/bluetooth/BluetoothA2dp;->doBind()Z
-Landroid/bluetooth/BluetoothA2dp;->enableDisableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothA2dp;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/BluetoothA2dp;->isEnabled()Z
-Landroid/bluetooth/BluetoothA2dp;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dp;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothA2dp;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothA2dp;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothA2dp;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothA2dp;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothA2dp;->mService:Landroid/bluetooth/IBluetoothA2dp;
-Landroid/bluetooth/BluetoothA2dp;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothA2dp;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothA2dp;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/BluetoothA2dp;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothA2dp;->shouldSendVolumeKeys(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dp;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dp;->VDBG:Z
-Landroid/bluetooth/BluetoothA2dpSink;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_AUDIO_CONFIG_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->ACTION_PLAYING_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->close()V
-Landroid/bluetooth/BluetoothA2dpSink;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->DBG:Z
-Landroid/bluetooth/BluetoothA2dpSink;->doBind()Z
-Landroid/bluetooth/BluetoothA2dpSink;->EXTRA_AUDIO_CONFIG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/BluetoothA2dpSink;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothA2dpSink;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->isEnabled()Z
-Landroid/bluetooth/BluetoothA2dpSink;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothA2dpSink;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothA2dpSink;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothA2dpSink;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothA2dpSink;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothA2dpSink;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothA2dpSink;->mService:Landroid/bluetooth/IBluetoothA2dpSink;
-Landroid/bluetooth/BluetoothA2dpSink;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothA2dpSink;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothA2dpSink;->stateToString(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->STATE_NOT_PLAYING:I
-Landroid/bluetooth/BluetoothA2dpSink;->STATE_PLAYING:I
-Landroid/bluetooth/BluetoothA2dpSink;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothA2dpSink;->VDBG:Z
-Landroid/bluetooth/BluetoothActivityEnergyInfo;-><init>(JIJJJJ)V
-Landroid/bluetooth/BluetoothActivityEnergyInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_INVALID:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_ACTIVE:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_IDLE:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->BT_STACK_STATE_STATE_SCANNING:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getBluetoothStackState()I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerEnergyUsed()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerIdleTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerRxTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getControllerTxTimeMillis()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getTimeStamp()J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->getUidTraffic()[Landroid/bluetooth/UidTraffic;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->isValid()Z
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mBluetoothStackState:I
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerEnergyUsed:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerIdleTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerRxTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mControllerTxTimeMs:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mTimestamp:J
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->mUidTraffic:[Landroid/bluetooth/UidTraffic;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;->setUidTraffic([Landroid/bluetooth/UidTraffic;)V
-Landroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/BluetoothAdapter$StateChangeCallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothAdapter$StateChangeCallbackWrapper;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/BluetoothAdapter;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLE_ACL_CONNECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLE_ACL_DISCONNECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_BLUETOOTH_ADDRESS_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ACTION_REQUEST_DISABLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->ADDRESS_LENGTH:I
-Landroid/bluetooth/BluetoothAdapter;->BLUETOOTH_MANAGER_SERVICE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->changeApplicationBluetoothState(ZLandroid/bluetooth/BluetoothAdapter$BluetoothStateChangeCallback;)Z
-Landroid/bluetooth/BluetoothAdapter;->createNewRfcommSocketAndRecord(Ljava/lang/String;Ljava/util/UUID;ZZ)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->DBG:Z
-Landroid/bluetooth/BluetoothAdapter;->DEFAULT_MAC_ADDRESS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->EXTRA_BLUETOOTH_ADDRESS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/BluetoothAdapter;->getControllerActivityEnergyInfo(I)Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/BluetoothAdapter;->getDiscoveryEndMillis()J
-Landroid/bluetooth/BluetoothAdapter;->getLeAccess()Z
-Landroid/bluetooth/BluetoothAdapter;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/BluetoothAdapter;->getPeriodicAdvertisingManager()Landroid/bluetooth/le/PeriodicAdvertisingManager;
-Landroid/bluetooth/BluetoothAdapter;->getSupportedProfiles()Ljava/util/List;
-Landroid/bluetooth/BluetoothAdapter;->isHardwareTrackingFiltersAvailable()Z
-Landroid/bluetooth/BluetoothAdapter;->LE_PSM_CHARACTERISTIC_UUID:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingEncryptedRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureL2capCoc(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureL2capOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingInsecureRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capCoc(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingL2capOn(IZZ)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingRfcommOn(I)Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->listenUsingScoOn()Landroid/bluetooth/BluetoothServerSocket;
-Landroid/bluetooth/BluetoothAdapter;->mLeScanClients:Ljava/util/Map;
-Landroid/bluetooth/BluetoothAdapter;->mLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothAdapter;->mManagerCallback:Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/BluetoothAdapter;->mManagerService:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/BluetoothAdapter;->mProxyServiceStateCallbacks:Ljava/util/ArrayList;
-Landroid/bluetooth/BluetoothAdapter;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothAdapter;->mToken:Landroid/os/IBinder;
-Landroid/bluetooth/BluetoothAdapter;->nameForState(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->readOutOfBandData()Landroid/util/Pair;
-Landroid/bluetooth/BluetoothAdapter;->removeServiceStateCallback(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/BluetoothAdapter;->requestControllerActivityEnergyInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/BluetoothAdapter;->sAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothAdapter;->sBluetoothLeAdvertiser:Landroid/bluetooth/le/BluetoothLeAdvertiser;
-Landroid/bluetooth/BluetoothAdapter;->sBluetoothLeScanner:Landroid/bluetooth/le/BluetoothLeScanner;
-Landroid/bluetooth/BluetoothAdapter;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/BluetoothAdapter;->SOCKET_CHANNEL_AUTO_STATIC_NO_SDP:I
-Landroid/bluetooth/BluetoothAdapter;->sPeriodicAdvertisingManager:Landroid/bluetooth/le/PeriodicAdvertisingManager;
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_ON:I
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_TURNING_OFF:I
-Landroid/bluetooth/BluetoothAdapter;->STATE_BLE_TURNING_ON:I
-Landroid/bluetooth/BluetoothAdapter;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAdapter;->toDeviceSet([Landroid/bluetooth/BluetoothDevice;)Ljava/util/Set;
-Landroid/bluetooth/BluetoothAdapter;->VDBG:Z
-Landroid/bluetooth/BluetoothAssignedNumbers;-><init>()V
-Landroid/bluetooth/BluetoothAudioConfig;-><init>(III)V
-Landroid/bluetooth/BluetoothAudioConfig;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothAudioConfig;->getAudioFormat()I
-Landroid/bluetooth/BluetoothAudioConfig;->getChannelConfig()I
-Landroid/bluetooth/BluetoothAudioConfig;->getSampleRate()I
-Landroid/bluetooth/BluetoothAudioConfig;->mAudioFormat:I
-Landroid/bluetooth/BluetoothAudioConfig;->mChannelConfig:I
-Landroid/bluetooth/BluetoothAudioConfig;->mSampleRate:I
-Landroid/bluetooth/BluetoothAvrcp;-><init>()V
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_0:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_1:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_2:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_3:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_4:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_5:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_6:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_7:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_8:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_9:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ANGLE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_BACKWARD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CHAN_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CHAN_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CLEAR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_CONT_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DISP_INFO:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DOT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_EJECT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ENTER:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_EXIT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F1:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F2:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F3:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F4:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_F5:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FAST_FOR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FAV_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_FORWARD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_HELP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_INPUT_SEL:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_LEFT_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_MUTE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAGE_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAGE_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PAUSE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PLAY:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_POWER:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_PREV_CHAN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RECORD:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_REWIND:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_RIGHT_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_ROOT_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SELECT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SETUP_MENU:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SOUND_SEL:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_STOP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_SUBPICT:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VENDOR:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VOL_DOWN:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_ID_VOL_UP:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_KEYPRESSED_RELEASE:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_STATE_PRESS:I
-Landroid/bluetooth/BluetoothAvrcp;->PASSTHROUGH_STATE_RELEASE:I
-Landroid/bluetooth/BluetoothAvrcpController;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothAvrcpController;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->ACTION_PLAYER_SETTING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->close()V
-Landroid/bluetooth/BluetoothAvrcpController;->DBG:Z
-Landroid/bluetooth/BluetoothAvrcpController;->doBind()Z
-Landroid/bluetooth/BluetoothAvrcpController;->EXTRA_PLAYER_SETTING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/BluetoothAvrcpController;->isEnabled()Z
-Landroid/bluetooth/BluetoothAvrcpController;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothAvrcpController;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothAvrcpController;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothAvrcpController;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothAvrcpController;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothAvrcpController;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothAvrcpController;->mService:Landroid/bluetooth/IBluetoothAvrcpController;
-Landroid/bluetooth/BluetoothAvrcpController;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothAvrcpController;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/BluetoothAvrcpController;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/BluetoothAvrcpController;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothAvrcpController;->VDBG:Z
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;-><init>(I)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->addSettingValue(II)V
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->getSettings()I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->getSettingValue(I)I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->mSettings:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->mSettingsValue:Ljava/util/Map;
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_EQUALIZER:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_REPEAT:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_SCAN:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->SETTING_SHUFFLE:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_ALL_TRACK:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_GROUP:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_INVALID:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_OFF:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_ON:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->STATE_SINGLE_TRACK:I
-Landroid/bluetooth/BluetoothAvrcpPlayerSettings;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothClass$Device$Major;->BITMASK:I
-Landroid/bluetooth/BluetoothClass$Device;->BITMASK:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_KEYBOARD:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_KEYBOARD_POINTING:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_NON_KEYBOARD_NON_POINTING:I
-Landroid/bluetooth/BluetoothClass$Device;->PERIPHERAL_POINTING:I
-Landroid/bluetooth/BluetoothClass$Service;->BITMASK:I
-Landroid/bluetooth/BluetoothClass;->ERROR:I
-Landroid/bluetooth/BluetoothClass;->getClassOfDevice()I
-Landroid/bluetooth/BluetoothClass;->getClassOfDeviceBytes()[B
-Landroid/bluetooth/BluetoothClass;->mClass:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_A2DP_SINK:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_HID:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_NAP:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_OPP:I
-Landroid/bluetooth/BluetoothClass;->PROFILE_PANU:I
-Landroid/bluetooth/BluetoothCodecConfig;->appendCapabilityToString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/bluetooth/BluetoothCodecConfig;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothCodecConfig;->getCodecName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothCodecConfig;->isMandatoryCodec()Z
-Landroid/bluetooth/BluetoothCodecConfig;->isValid()Z
-Landroid/bluetooth/BluetoothCodecConfig;->mBitsPerSample:I
-Landroid/bluetooth/BluetoothCodecConfig;->mChannelMode:I
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecPriority:I
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific1:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific2:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific3:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecSpecific4:J
-Landroid/bluetooth/BluetoothCodecConfig;->mCodecType:I
-Landroid/bluetooth/BluetoothCodecConfig;->mSampleRate:I
-Landroid/bluetooth/BluetoothCodecConfig;->sameAudioFeedingParameters(Landroid/bluetooth/BluetoothCodecConfig;)Z
-Landroid/bluetooth/BluetoothCodecStatus;-><init>(Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/BluetoothCodecStatus;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecConfig:Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecsLocalCapabilities:[Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->mCodecsSelectableCapabilities:[Landroid/bluetooth/BluetoothCodecConfig;
-Landroid/bluetooth/BluetoothCodecStatus;->sameCapabilities([Landroid/bluetooth/BluetoothCodecConfig;[Landroid/bluetooth/BluetoothCodecConfig;)Z
-Landroid/bluetooth/BluetoothDevice;->ACTION_BATTERY_LEVEL_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_CANCEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_REPLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_CONNECTION_ACCESS_REQUEST:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_MAS_INSTANCE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->ACTION_NAME_FAILED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->BATTERY_LEVEL_UNKNOWN:I
-Landroid/bluetooth/BluetoothDevice;->BOND_SUCCESS:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_ACCESS_NO:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_ACCESS_YES:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_ENCRYPTED_BREDR:I
-Landroid/bluetooth/BluetoothDevice;->CONNECTION_STATE_ENCRYPTED_LE:I
-Landroid/bluetooth/BluetoothDevice;->createBondOutOfBand(ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/BluetoothDevice;->createInsecureL2capCocSocket(II)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createInsecureL2capSocket(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createL2capCocSocket(II)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->createL2capSocket(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothDevice;->DBG:Z
-Landroid/bluetooth/BluetoothDevice;->EXTRA_ACCESS_REQUEST_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_ALWAYS_ALLOWED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_CLASS_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_CONNECTION_ACCESS_RESULT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_MAS_INSTANCE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_PACKAGE_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->EXTRA_SDP_RECORD:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->getSimAccessPermission()I
-Landroid/bluetooth/BluetoothDevice;->isBluetoothEnabled()Z
-Landroid/bluetooth/BluetoothDevice;->mAddress:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_CONSENT:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_DISPLAY_PASSKEY:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_DISPLAY_PIN:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_OOB_CONSENT:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_PASSKEY:I
-Landroid/bluetooth/BluetoothDevice;->PAIRING_VARIANT_PIN_16_DIGITS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_MESSAGE_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_PHONEBOOK_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_PROFILE_CONNECTION:I
-Landroid/bluetooth/BluetoothDevice;->REQUEST_TYPE_SIM_ACCESS:I
-Landroid/bluetooth/BluetoothDevice;->sdpSearch(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothDevice;->setDeviceOutOfBandData([B[B)Z
-Landroid/bluetooth/BluetoothDevice;->setRemoteOutOfBandData()Z
-Landroid/bluetooth/BluetoothDevice;->sService:Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/BluetoothDevice;->sStateChangeCallback:Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/BluetoothDevice;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevice;->UNBOND_REASON_AUTH_CANCELED:I
-Landroid/bluetooth/BluetoothDevice;->UNBOND_REASON_REMOVED:I
-Landroid/bluetooth/BluetoothDevicePicker;->ACTION_DEVICE_SELECTED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->ACTION_LAUNCH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_FILTER_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_LAUNCH_CLASS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_LAUNCH_PACKAGE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->EXTRA_NEED_AUTH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_ALL:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_AUDIO:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_NAP:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_PANU:I
-Landroid/bluetooth/BluetoothDevicePicker;->FILTER_TYPE_TRANSFER:I
-Landroid/bluetooth/BluetoothGatt;-><init>(Landroid/bluetooth/IBluetoothGatt;Landroid/bluetooth/BluetoothDevice;IZI)V
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_NONE:I
-Landroid/bluetooth/BluetoothGatt;->AUTHENTICATION_NO_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_IDLE:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_MITM:I
-Landroid/bluetooth/BluetoothGatt;->AUTH_RETRY_STATE_NO_MITM:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CLOSED:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_CONNECTING:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_DISCONNECTING:I
-Landroid/bluetooth/BluetoothGatt;->CONN_STATE_IDLE:I
-Landroid/bluetooth/BluetoothGatt;->DBG:Z
-Landroid/bluetooth/BluetoothGatt;->discoverServiceByUuid(Ljava/util/UUID;)Z
-Landroid/bluetooth/BluetoothGatt;->getCharacteristicById(Landroid/bluetooth/BluetoothDevice;I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGatt;->getDescriptorById(Landroid/bluetooth/BluetoothDevice;I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGatt;->getService(Landroid/bluetooth/BluetoothDevice;Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGatt;->mBluetoothGattCallback:Landroid/bluetooth/IBluetoothGattCallback;
-Landroid/bluetooth/BluetoothGatt;->mConnState:I
-Landroid/bluetooth/BluetoothGatt;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothGatt;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothGatt;->mOpportunistic:Z
-Landroid/bluetooth/BluetoothGatt;->mPhy:I
-Landroid/bluetooth/BluetoothGatt;->mServices:Ljava/util/List;
-Landroid/bluetooth/BluetoothGatt;->mStateLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothGatt;->readUsingCharacteristicUuid(Ljava/util/UUID;II)Z
-Landroid/bluetooth/BluetoothGatt;->registerApp(Landroid/bluetooth/BluetoothGattCallback;Landroid/os/Handler;)Z
-Landroid/bluetooth/BluetoothGatt;->requestLeConnectionUpdate(IIIIII)Z
-Landroid/bluetooth/BluetoothGatt;->runOrQueueCallback(Ljava/lang/Runnable;)V
-Landroid/bluetooth/BluetoothGatt;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothGatt;->VDBG:Z
-Landroid/bluetooth/BluetoothGattCallback;->onConnectionUpdated(Landroid/bluetooth/BluetoothGatt;IIII)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Landroid/bluetooth/BluetoothGattService;Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattCharacteristic;-><init>(Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->bytesToFloat(BB)F
-Landroid/bluetooth/BluetoothGattCharacteristic;->bytesToFloat(BBBB)F
-Landroid/bluetooth/BluetoothGattCharacteristic;->getDescriptor(Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGattCharacteristic;->getKeySize()I
-Landroid/bluetooth/BluetoothGattCharacteristic;->getTypeLen(I)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->initCharacteristic(Landroid/bluetooth/BluetoothGattService;Ljava/util/UUID;III)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->intToSignedBits(II)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mKeySize:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mPermissions:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mProperties:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattCharacteristic;->mValue:[B
-Landroid/bluetooth/BluetoothGattCharacteristic;->mWriteType:I
-Landroid/bluetooth/BluetoothGattCharacteristic;->setInstanceId(I)V
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedBytesToInt(BB)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedBytesToInt(BBBB)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedByteToInt(B)I
-Landroid/bluetooth/BluetoothGattCharacteristic;->unsignedToSigned(II)I
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Landroid/bluetooth/BluetoothGattCharacteristic;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattDescriptor;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;->getInstanceId()I
-Landroid/bluetooth/BluetoothGattDescriptor;->initDescriptor(Landroid/bluetooth/BluetoothGattCharacteristic;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattDescriptor;->mPermissions:I
-Landroid/bluetooth/BluetoothGattDescriptor;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattDescriptor;->mValue:[B
-Landroid/bluetooth/BluetoothGattDescriptor;->setInstanceId(I)V
-Landroid/bluetooth/BluetoothGattIncludedService;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattIncludedService;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattIncludedService;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothGattIncludedService;->getInstanceId()I
-Landroid/bluetooth/BluetoothGattIncludedService;->getType()I
-Landroid/bluetooth/BluetoothGattIncludedService;->getUuid()Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattIncludedService;->mInstanceId:I
-Landroid/bluetooth/BluetoothGattIncludedService;->mServiceType:I
-Landroid/bluetooth/BluetoothGattIncludedService;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattServer;-><init>(Landroid/bluetooth/IBluetoothGatt;I)V
-Landroid/bluetooth/BluetoothGattServer;->CALLBACK_REG_TIMEOUT:I
-Landroid/bluetooth/BluetoothGattServer;->DBG:Z
-Landroid/bluetooth/BluetoothGattServer;->getCharacteristicByHandle(I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGattServer;->getDescriptorByHandle(I)Landroid/bluetooth/BluetoothGattDescriptor;
-Landroid/bluetooth/BluetoothGattServer;->getService(Ljava/util/UUID;II)Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGattServer;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothGattServer;->mBluetoothGattServerCallback:Landroid/bluetooth/IBluetoothGattServerCallback;
-Landroid/bluetooth/BluetoothGattServer;->mCallback:Landroid/bluetooth/BluetoothGattServerCallback;
-Landroid/bluetooth/BluetoothGattServer;->mPendingService:Landroid/bluetooth/BluetoothGattService;
-Landroid/bluetooth/BluetoothGattServer;->mServerIf:I
-Landroid/bluetooth/BluetoothGattServer;->mServerIfLock:Ljava/lang/Object;
-Landroid/bluetooth/BluetoothGattServer;->mService:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/BluetoothGattServer;->mServices:Ljava/util/List;
-Landroid/bluetooth/BluetoothGattServer;->mTransport:I
-Landroid/bluetooth/BluetoothGattServer;->registerCallback(Landroid/bluetooth/BluetoothGattServerCallback;)Z
-Landroid/bluetooth/BluetoothGattServer;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothGattServer;->unregisterCallback()V
-Landroid/bluetooth/BluetoothGattServer;->VDBG:Z
-Landroid/bluetooth/BluetoothGattServerCallback;->onConnectionUpdated(Landroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Landroid/bluetooth/BluetoothDevice;Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/BluetoothGattService;-><init>(Ljava/util/UUID;II)V
-Landroid/bluetooth/BluetoothGattService;->addIncludedService(Landroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/BluetoothGattService;->getCharacteristic(Ljava/util/UUID;I)Landroid/bluetooth/BluetoothGattCharacteristic;
-Landroid/bluetooth/BluetoothGattService;->getDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothGattService;->getHandles()I
-Landroid/bluetooth/BluetoothGattService;->isAdvertisePreferred()Z
-Landroid/bluetooth/BluetoothGattService;->mAdvertisePreferred:Z
-Landroid/bluetooth/BluetoothGattService;->mHandles:I
-Landroid/bluetooth/BluetoothGattService;->mInstanceId:I
-Landroid/bluetooth/BluetoothGattService;->mServiceType:I
-Landroid/bluetooth/BluetoothGattService;->mUuid:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothGattService;->setDevice(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/BluetoothGattService;->setHandles(I)V
-Landroid/bluetooth/BluetoothHeadset;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHeadset;->ACTION_HF_INDICATORS_VALUE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/BluetoothHeadset;->DBG:Z
-Landroid/bluetooth/BluetoothHeadset;->doBind()Z
-Landroid/bluetooth/BluetoothHeadset;->doUnbind()V
-Landroid/bluetooth/BluetoothHeadset;->EXTRA_HF_INDICATORS_IND_ID:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->EXTRA_HF_INDICATORS_IND_VALUE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->getAudioRouteAllowed()Z
-Landroid/bluetooth/BluetoothHeadset;->isAudioOn()Z
-Landroid/bluetooth/BluetoothHeadset;->isBluetoothVoiceDialingEnabled(Landroid/content/Context;)Z
-Landroid/bluetooth/BluetoothHeadset;->isDisabled()Z
-Landroid/bluetooth/BluetoothHeadset;->isInbandRingingEnabled()Z
-Landroid/bluetooth/BluetoothHeadset;->isInbandRingingSupported(Landroid/content/Context;)Z
-Landroid/bluetooth/BluetoothHeadset;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadset;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadset;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHeadset;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHeadset;->mConnection:Landroid/bluetooth/IBluetoothProfileServiceConnection;
-Landroid/bluetooth/BluetoothHeadset;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHeadset;->MESSAGE_HEADSET_SERVICE_CONNECTED:I
-Landroid/bluetooth/BluetoothHeadset;->MESSAGE_HEADSET_SERVICE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothHeadset;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothHeadset;->mService:Landroid/bluetooth/IBluetoothHeadset;
-Landroid/bluetooth/BluetoothHeadset;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHeadset;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/BluetoothHeadset;->setForceScoAudio(Z)V
-Landroid/bluetooth/BluetoothHeadset;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VDBG:Z
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_IPHONEACCEV_BATTERY_LEVEL:I
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XAPL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadset;->VENDOR_SPECIFIC_HEADSET_EVENT_XEVENT_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_AG_EVENT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_AUDIO_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_CALL_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_LAST_VTAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_BLACKLISTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_BUSY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_CME:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_DELAYED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_NO_ANSWER:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_ERROR_NO_CARRIER:I
-Landroid/bluetooth/BluetoothHeadsetClient;->ACTION_RESULT_OK:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_HOLD:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_NONE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CALL_ACCEPT_TERMINATE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->close()V
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_CORPORATE_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_CORPORATE_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_DIAL_STRING_TOO_LONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_EAP_NOT_SUPPORTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_EMERGENCY_SERVICE_ONLY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_HIDDEN_KEY_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INCORRECT_PARAMETERS:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INCORRECT_PASSWORD:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_CHARACTER_IN_DIAL_STRING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_CHARACTER_IN_TEXT_STRING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_INVALID_INDEX:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_MEMORY_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_MEMORY_FULL:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_SUBSET_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_SUBSET_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NETWORK_TIMEOUT:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NOT_FOUND:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NOT_SUPPORTED_FOR_VOIP:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_CONNECTION_TO_PHONE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_NETWORK_SERVICE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_NO_SIMULTANOUS_VOIP_CS_CALLS:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_OPERATION_NOT_ALLOWED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_OPERATION_NOT_SUPPORTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHFSIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHFSIM_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHONE_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_PHSIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SERVICE_PROVIDER_PERSONALIZATION_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SERVICE_PROVIDER_PERSONALIZATION_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_BUSY:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_FAILURE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_NOT_INSERTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PIN2_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PIN_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PUK2_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_PUK_REQUIRED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIM_WRONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_SIP_RESPONSE_CODE:I
-Landroid/bluetooth/BluetoothHeadsetClient;->CME_TEXT_STRING_TOO_LONG:I
-Landroid/bluetooth/BluetoothHeadsetClient;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->DBG:Z
-Landroid/bluetooth/BluetoothHeadsetClient;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/BluetoothHeadsetClient;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->doBind()Z
-Landroid/bluetooth/BluetoothHeadsetClient;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_3WAY_CALLING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ACCEPT_HELD_OR_WAITING_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ATTACH_NUMBER_TO_VT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_ECC:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_MERGE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_MERGE_AND_DETACH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_REJECT_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RELEASE_AND_ACCEPT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RELEASE_HELD_OR_WAITING_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_RESPONSE_AND_HOLD:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AG_FEATURE_VOICE_RECOGNITION:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_AUDIO_WBS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_BATTERY_LEVEL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_CALL:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_CME_CODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_IN_BAND_RING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_ROAMING:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_SIGNAL_STRENGTH:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NETWORK_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_NUMBER:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_OPERATOR_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_RESULT_CODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_SUBSCRIBER_INFO:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->EXTRA_VOICE_RECOGNITION:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/BluetoothHeadsetClient;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/BluetoothHeadsetClient;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHeadsetClient;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothHeadsetClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadsetClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHeadsetClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHeadsetClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHeadsetClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHeadsetClient;->mService:Landroid/bluetooth/IBluetoothHeadsetClient;
-Landroid/bluetooth/BluetoothHeadsetClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHeadsetClient;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothHeadsetClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_CONNECTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_CONNECTING:I
-Landroid/bluetooth/BluetoothHeadsetClient;->STATE_AUDIO_DISCONNECTED:I
-Landroid/bluetooth/BluetoothHeadsetClient;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClient;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/BluetoothHeadsetClient;->VDBG:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;-><init>(Landroid/bluetooth/BluetoothDevice;IILjava/lang/String;ZZZ)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;-><init>(Landroid/bluetooth/BluetoothDevice;ILjava/util/UUID;ILjava/lang/String;ZZZ)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_ACTIVE:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_ALERTING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_DIALING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_HELD:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_HELD_BY_RESPONSE_AND_HOLD:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_INCOMING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_TERMINATED:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CALL_STATE_WAITING:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getCreationElapsedMilli()J
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->getUUID()Ljava/util/UUID;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->isInBandRing()Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mCreationElapsedMilli:J
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mId:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mInBandRing:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mMultiParty:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mNumber:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mOutgoing:Z
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mState:I
-Landroid/bluetooth/BluetoothHeadsetClientCall;->mUUID:Ljava/util/UUID;
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setMultiParty(Z)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setNumber(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->setState(I)V
-Landroid/bluetooth/BluetoothHeadsetClientCall;->toString(Z)Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;-><init>(Landroid/bluetooth/BluetoothHealthCallback;)V
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothHealthCallback;
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/BluetoothHealth$BluetoothHealthCallbackWrapper;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/BluetoothHealth;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHealth;->CHANNEL_TYPE_ANY:I
-Landroid/bluetooth/BluetoothHealth;->checkAppParam(Ljava/lang/String;IILandroid/bluetooth/BluetoothHealthCallback;)Z
-Landroid/bluetooth/BluetoothHealth;->close()V
-Landroid/bluetooth/BluetoothHealth;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/BluetoothHealth;->DBG:Z
-Landroid/bluetooth/BluetoothHealth;->doBind()Z
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_ERROR:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_INVALID_ARGS:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_NOT_ALLOWED:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_NOT_FOUND:I
-Landroid/bluetooth/BluetoothHealth;->HEALTH_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothHealth;->isEnabled()Z
-Landroid/bluetooth/BluetoothHealth;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHealth;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHealth;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHealth;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHealth;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHealth;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHealth;->mService:Landroid/bluetooth/IBluetoothHealth;
-Landroid/bluetooth/BluetoothHealth;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHealth;->registerAppConfiguration(Ljava/lang/String;IIILandroid/bluetooth/BluetoothHealthCallback;)Z
-Landroid/bluetooth/BluetoothHealth;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealth;->VDBG:Z
-Landroid/bluetooth/BluetoothHealthAppConfiguration;-><init>(Ljava/lang/String;I)V
-Landroid/bluetooth/BluetoothHealthAppConfiguration;-><init>(Ljava/lang/String;III)V
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->getChannelType()I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mChannelType:I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mDataType:I
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHealthAppConfiguration;->mRole:I
-Landroid/bluetooth/BluetoothHealthCallback;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHearingAid;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->ACTION_PLAYING_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->adjustVolume(I)V
-Landroid/bluetooth/BluetoothHearingAid;->close()V
-Landroid/bluetooth/BluetoothHearingAid;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->DBG:Z
-Landroid/bluetooth/BluetoothHearingAid;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->doBind()V
-Landroid/bluetooth/BluetoothHearingAid;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/BluetoothHearingAid;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHearingAid;->getVolume()I
-Landroid/bluetooth/BluetoothHearingAid;->HI_SYNC_ID_INVALID:J
-Landroid/bluetooth/BluetoothHearingAid;->isEnabled()Z
-Landroid/bluetooth/BluetoothHearingAid;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHearingAid;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHearingAid;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHearingAid;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHearingAid;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHearingAid;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHearingAid;->MODE_BINAURAL:I
-Landroid/bluetooth/BluetoothHearingAid;->MODE_MONAURAL:I
-Landroid/bluetooth/BluetoothHearingAid;->mService:Landroid/bluetooth/IBluetoothHearingAid;
-Landroid/bluetooth/BluetoothHearingAid;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHearingAid;->mServiceLock:Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Landroid/bluetooth/BluetoothHearingAid;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHearingAid;->setVolume(I)V
-Landroid/bluetooth/BluetoothHearingAid;->SIDE_LEFT:I
-Landroid/bluetooth/BluetoothHearingAid;->SIDE_RIGHT:I
-Landroid/bluetooth/BluetoothHearingAid;->stateToString(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->STATE_NOT_PLAYING:I
-Landroid/bluetooth/BluetoothHearingAid;->STATE_PLAYING:I
-Landroid/bluetooth/BluetoothHearingAid;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHearingAid;->VDBG:Z
-Landroid/bluetooth/BluetoothHidDevice$Callback;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;-><init>(Ljava/util/concurrent/Executor;Landroid/bluetooth/BluetoothHidDevice$Callback;)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->mCallback:Landroid/bluetooth/BluetoothHidDevice$Callback;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->mExecutor:Ljava/util/concurrent/Executor;
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/BluetoothHidDevice$CallbackWrapper;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/BluetoothHidDevice;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHidDevice;->close()V
-Landroid/bluetooth/BluetoothHidDevice;->doBind()Z
-Landroid/bluetooth/BluetoothHidDevice;->doUnbind()V
-Landroid/bluetooth/BluetoothHidDevice;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDevice;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHidDevice;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHidDevice;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHidDevice;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHidDevice;->mService:Landroid/bluetooth/IBluetoothHidDevice;
-Landroid/bluetooth/BluetoothHidDevice;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHidDevice;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mDelayVariation:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mLatency:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mPeakBandwidth:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mServiceType:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mTokenBucketSize:I
-Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;->mTokenRate:I
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mDescription:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mDescriptors:[B
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mProvider:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;->mSubclass:B
-Landroid/bluetooth/BluetoothHidHost;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothHidHost;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_HANDSHAKE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_IDLE_TIME_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_PROTOCOL_MODE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_REPORT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->ACTION_VIRTUAL_UNPLUG_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->close()V
-Landroid/bluetooth/BluetoothHidHost;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->DBG:Z
-Landroid/bluetooth/BluetoothHidHost;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->doBind()Z
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_IDLE_TIME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_PROTOCOL_MODE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_BUFFER_SIZE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_ID:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_REPORT_TYPE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->EXTRA_VIRTUAL_UNPLUG_STATUS:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothHidHost;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/BluetoothHidHost;->INPUT_CONNECT_FAILED_ALREADY_CONNECTED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_CONNECT_FAILED_ATTEMPT_FAILED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_DISCONNECT_FAILED_NOT_CONNECTED:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothHidHost;->INPUT_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothHidHost;->isEnabled()Z
-Landroid/bluetooth/BluetoothHidHost;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothHidHost;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothHidHost;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothHidHost;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothHidHost;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothHidHost;->mService:Landroid/bluetooth/IBluetoothHidHost;
-Landroid/bluetooth/BluetoothHidHost;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_BOOT_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_REPORT_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->PROTOCOL_UNSUPPORTED_MODE:I
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_FEATURE:B
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_INPUT:B
-Landroid/bluetooth/BluetoothHidHost;->REPORT_TYPE_OUTPUT:B
-Landroid/bluetooth/BluetoothHidHost;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/BluetoothHidHost;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/BluetoothHidHost;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHidHost;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothHidHost;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/BluetoothHidHost;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothHidHost;->VDBG:Z
-Landroid/bluetooth/BluetoothHidHost;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothHidHost;->VIRTUAL_UNPLUG_STATUS_FAIL:I
-Landroid/bluetooth/BluetoothHidHost;->VIRTUAL_UNPLUG_STATUS_SUCCESS:I
-Landroid/bluetooth/BluetoothInputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothInputStream;->mSocket:Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothManager;-><init>(Landroid/content/Context;)V
-Landroid/bluetooth/BluetoothManager;->DBG:Z
-Landroid/bluetooth/BluetoothManager;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothManager;->openGattServer(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;I)Landroid/bluetooth/BluetoothGattServer;
-Landroid/bluetooth/BluetoothManager;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothManager;->VDBG:Z
-Landroid/bluetooth/BluetoothMap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothMap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMap;->close()V
-Landroid/bluetooth/BluetoothMap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->DBG:Z
-Landroid/bluetooth/BluetoothMap;->doBind()Z
-Landroid/bluetooth/BluetoothMap;->doesClassMatchSink(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/BluetoothMap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothMap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothMap;->getState()I
-Landroid/bluetooth/BluetoothMap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->isEnabled()Z
-Landroid/bluetooth/BluetoothMap;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothMap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothMap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothMap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothMap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothMap;->mService:Landroid/bluetooth/IBluetoothMap;
-Landroid/bluetooth/BluetoothMap;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothMap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothMap;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothMap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothMap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothMap;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothMap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMap;->VDBG:Z
-Landroid/bluetooth/BluetoothMapClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothMapClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_DELIVERED_SUCCESSFULLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_RECEIVED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->ACTION_MESSAGE_SENT_SUCCESSFULLY:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->close()V
-Landroid/bluetooth/BluetoothMapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->DBG:Z
-Landroid/bluetooth/BluetoothMapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->doBind()Z
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_MESSAGE_HANDLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_SENDER_CONTACT_NAME:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->EXTRA_SENDER_CONTACT_URI:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothMapClient;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothMapClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothMapClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothMapClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothMapClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothMapClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothMapClient;->mService:Landroid/bluetooth/IBluetoothMapClient;
-Landroid/bluetooth/BluetoothMapClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothMapClient;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothMapClient;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothMapClient;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothMapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothMapClient;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothMapClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMapClient;->VDBG:Z
-Landroid/bluetooth/BluetoothMasInstance$MessageType;-><init>()V
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->EMAIL:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->MMS:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->SMS_CDMA:I
-Landroid/bluetooth/BluetoothMasInstance$MessageType;->SMS_GSM:I
-Landroid/bluetooth/BluetoothMasInstance;-><init>(ILjava/lang/String;II)V
-Landroid/bluetooth/BluetoothMasInstance;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/BluetoothMasInstance;->getChannel()I
-Landroid/bluetooth/BluetoothMasInstance;->getId()I
-Landroid/bluetooth/BluetoothMasInstance;->getMsgTypes()I
-Landroid/bluetooth/BluetoothMasInstance;->getName()Ljava/lang/String;
-Landroid/bluetooth/BluetoothMasInstance;->mChannel:I
-Landroid/bluetooth/BluetoothMasInstance;->mId:I
-Landroid/bluetooth/BluetoothMasInstance;->mMsgTypes:I
-Landroid/bluetooth/BluetoothMasInstance;->mName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothMasInstance;->msgSupported(I)Z
-Landroid/bluetooth/BluetoothOutputStream;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothOutputStream;->mSocket:Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothPan;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->DBG:Z
-Landroid/bluetooth/BluetoothPan;->EXTRA_LOCAL_ROLE:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->LOCAL_NAP_ROLE:I
-Landroid/bluetooth/BluetoothPan;->LOCAL_PANU_ROLE:I
-Landroid/bluetooth/BluetoothPan;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPan;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPan;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPan;->mPanService:Landroid/bluetooth/IBluetoothPan;
-Landroid/bluetooth/BluetoothPan;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothPan;->mStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPan;->PAN_CONNECT_FAILED_ALREADY_CONNECTED:I
-Landroid/bluetooth/BluetoothPan;->PAN_CONNECT_FAILED_ATTEMPT_FAILED:I
-Landroid/bluetooth/BluetoothPan;->PAN_DISCONNECT_FAILED_NOT_CONNECTED:I
-Landroid/bluetooth/BluetoothPan;->PAN_OPERATION_GENERIC_FAILURE:I
-Landroid/bluetooth/BluetoothPan;->PAN_OPERATION_SUCCESS:I
-Landroid/bluetooth/BluetoothPan;->PAN_ROLE_NONE:I
-Landroid/bluetooth/BluetoothPan;->REMOTE_NAP_ROLE:I
-Landroid/bluetooth/BluetoothPan;->REMOTE_PANU_ROLE:I
-Landroid/bluetooth/BluetoothPan;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPan;->VDBG:Z
-Landroid/bluetooth/BluetoothPbap$ServiceListener;->onServiceConnected(Landroid/bluetooth/BluetoothPbap;)V
-Landroid/bluetooth/BluetoothPbap$ServiceListener;->onServiceDisconnected()V
-Landroid/bluetooth/BluetoothPbap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothPbap$ServiceListener;)V
-Landroid/bluetooth/BluetoothPbap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbap;->close()V
-Landroid/bluetooth/BluetoothPbap;->DBG:Z
-Landroid/bluetooth/BluetoothPbap;->doBind()Z
-Landroid/bluetooth/BluetoothPbap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothPbap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPbap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPbap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPbap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPbap;->mService:Landroid/bluetooth/IBluetoothPbap;
-Landroid/bluetooth/BluetoothPbap;->mServiceListener:Landroid/bluetooth/BluetoothPbap$ServiceListener;
-Landroid/bluetooth/BluetoothPbap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothPbap;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothPbap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothPbap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothPbapClient;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;->close()V
-Landroid/bluetooth/BluetoothPbapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->DBG:Z
-Landroid/bluetooth/BluetoothPbapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->doBind()Z
-Landroid/bluetooth/BluetoothPbapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothPbapClient;->isEnabled()Z
-Landroid/bluetooth/BluetoothPbapClient;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothPbapClient;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothPbapClient;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothPbapClient;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothPbapClient;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothPbapClient;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothPbapClient;->mService:Landroid/bluetooth/IBluetoothPbapClient;
-Landroid/bluetooth/BluetoothPbapClient;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_FAILURE:I
-Landroid/bluetooth/BluetoothPbapClient;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothPbapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothPbapClient;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothPbapClient;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothPbapClient;->VDBG:Z
-Landroid/bluetooth/BluetoothProfile;->AVRCP:I
-Landroid/bluetooth/BluetoothProfile;->getConnectionStateName(I)Ljava/lang/String;
-Landroid/bluetooth/BluetoothProfile;->HEADSET_CLIENT:I
-Landroid/bluetooth/BluetoothProfile;->HEARING_AID:I
-Landroid/bluetooth/BluetoothProfile;->HID_HOST:I
-Landroid/bluetooth/BluetoothProfile;->MAP:I
-Landroid/bluetooth/BluetoothProfile;->MAP_CLIENT:I
-Landroid/bluetooth/BluetoothProfile;->MAX_PROFILE_ID:I
-Landroid/bluetooth/BluetoothProfile;->OPP:I
-Landroid/bluetooth/BluetoothProfile;->PBAP:I
-Landroid/bluetooth/BluetoothProfile;->PBAP_CLIENT:I
-Landroid/bluetooth/BluetoothProtoEnums;-><init>()V
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_CONNECTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_CONNECTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_DISCONNECTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->CONNECTION_STATE_DISCONNECTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_AIRPLANE_MODE:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_APPLICATION_REQUEST:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_CRASH:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_DISALLOWED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_RESTARTED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_RESTORE_USER_SETTING:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_START_ERROR:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_SYSTEM_BOOT:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_UNSPECIFIED:I
-Landroid/bluetooth/BluetoothProtoEnums;->ENABLE_DISABLE_REASON_USER_SWITCH:I
-Landroid/bluetooth/BluetoothSap;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
-Landroid/bluetooth/BluetoothSap;->ACTION_CONNECTION_STATE_CHANGED:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSap;->close()V
-Landroid/bluetooth/BluetoothSap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->DBG:Z
-Landroid/bluetooth/BluetoothSap;->doBind()Z
-Landroid/bluetooth/BluetoothSap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothSap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/BluetoothSap;->getState()I
-Landroid/bluetooth/BluetoothSap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->isEnabled()Z
-Landroid/bluetooth/BluetoothSap;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/BluetoothSap;->log(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothSap;->mAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothSap;->mBluetoothStateChangeCallback:Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/BluetoothSap;->mConnection:Landroid/content/ServiceConnection;
-Landroid/bluetooth/BluetoothSap;->mContext:Landroid/content/Context;
-Landroid/bluetooth/BluetoothSap;->mService:Landroid/bluetooth/IBluetoothSap;
-Landroid/bluetooth/BluetoothSap;->mServiceListener:Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/BluetoothSap;->RESULT_CANCELED:I
-Landroid/bluetooth/BluetoothSap;->RESULT_SUCCESS:I
-Landroid/bluetooth/BluetoothSap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/BluetoothSap;->STATE_ERROR:I
-Landroid/bluetooth/BluetoothSap;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSap;->VDBG:Z
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZI)V
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZIZZ)V
-Landroid/bluetooth/BluetoothServerSocket;-><init>(IZZLandroid/os/ParcelUuid;)V
-Landroid/bluetooth/BluetoothServerSocket;->DBG:Z
-Landroid/bluetooth/BluetoothServerSocket;->getChannel()I
-Landroid/bluetooth/BluetoothServerSocket;->getPsm()I
-Landroid/bluetooth/BluetoothServerSocket;->mChannel:I
-Landroid/bluetooth/BluetoothServerSocket;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/BluetoothServerSocket;->mMessage:I
-Landroid/bluetooth/BluetoothServerSocket;->setChannel(I)V
-Landroid/bluetooth/BluetoothServerSocket;->setCloseHandler(Landroid/os/Handler;I)V
-Landroid/bluetooth/BluetoothServerSocket;->setServiceName(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothServerSocket;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket$SocketState;->CLOSED:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->CONNECTED:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->INIT:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->LISTENING:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->valueOf(Ljava/lang/String;)Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket$SocketState;->values()[Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;)V
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLandroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;ZZ)V
-Landroid/bluetooth/BluetoothSocket;-><init>(IIZZLjava/lang/String;I)V
-Landroid/bluetooth/BluetoothSocket;-><init>(Landroid/bluetooth/BluetoothSocket;)V
-Landroid/bluetooth/BluetoothSocket;->accept(I)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothSocket;->acceptSocket(Ljava/lang/String;)Landroid/bluetooth/BluetoothSocket;
-Landroid/bluetooth/BluetoothSocket;->available()I
-Landroid/bluetooth/BluetoothSocket;->bindListen()I
-Landroid/bluetooth/BluetoothSocket;->BTSOCK_FLAG_NO_SDP:I
-Landroid/bluetooth/BluetoothSocket;->convertAddr([B)Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->createL2capRxBuffer()V
-Landroid/bluetooth/BluetoothSocket;->DBG:Z
-Landroid/bluetooth/BluetoothSocket;->EBADFD:I
-Landroid/bluetooth/BluetoothSocket;->fillL2capRxBuffer()I
-Landroid/bluetooth/BluetoothSocket;->getPort()I
-Landroid/bluetooth/BluetoothSocket;->getSecurityFlags()I
-Landroid/bluetooth/BluetoothSocket;->mAddress:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->mAuth:Z
-Landroid/bluetooth/BluetoothSocket;->mAuthMitm:Z
-Landroid/bluetooth/BluetoothSocket;->MAX_L2CAP_PACKAGE_SIZE:I
-Landroid/bluetooth/BluetoothSocket;->MAX_RFCOMM_CHANNEL:I
-Landroid/bluetooth/BluetoothSocket;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothSocket;->mEncrypt:Z
-Landroid/bluetooth/BluetoothSocket;->mExcludeSdp:Z
-Landroid/bluetooth/BluetoothSocket;->mFd:I
-Landroid/bluetooth/BluetoothSocket;->mInputStream:Landroid/bluetooth/BluetoothInputStream;
-Landroid/bluetooth/BluetoothSocket;->mL2capBuffer:Ljava/nio/ByteBuffer;
-Landroid/bluetooth/BluetoothSocket;->mMaxRxPacketSize:I
-Landroid/bluetooth/BluetoothSocket;->mMaxTxPacketSize:I
-Landroid/bluetooth/BluetoothSocket;->mMin16DigitPin:Z
-Landroid/bluetooth/BluetoothSocket;->mOutputStream:Landroid/bluetooth/BluetoothOutputStream;
-Landroid/bluetooth/BluetoothSocket;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->mSocketIS:Ljava/io/InputStream;
-Landroid/bluetooth/BluetoothSocket;->mSocketOS:Ljava/io/OutputStream;
-Landroid/bluetooth/BluetoothSocket;->mSocketState:Landroid/bluetooth/BluetoothSocket$SocketState;
-Landroid/bluetooth/BluetoothSocket;->mType:I
-Landroid/bluetooth/BluetoothSocket;->mUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothSocket;->PROXY_CONNECTION_TIMEOUT:I
-Landroid/bluetooth/BluetoothSocket;->read([BII)I
-Landroid/bluetooth/BluetoothSocket;->readAll(Ljava/io/InputStream;[B)I
-Landroid/bluetooth/BluetoothSocket;->readInt(Ljava/io/InputStream;)I
-Landroid/bluetooth/BluetoothSocket;->removeChannel()V
-Landroid/bluetooth/BluetoothSocket;->requestMaximumTxDataLength()V
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH_16_DIGIT:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_AUTH_MITM:I
-Landroid/bluetooth/BluetoothSocket;->SEC_FLAG_ENCRYPT:I
-Landroid/bluetooth/BluetoothSocket;->setExcludeSdp(Z)V
-Landroid/bluetooth/BluetoothSocket;->setServiceName(Ljava/lang/String;)V
-Landroid/bluetooth/BluetoothSocket;->SOCK_SIGNAL_SIZE:I
-Landroid/bluetooth/BluetoothSocket;->TAG:Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->TYPE_L2CAP_BREDR:I
-Landroid/bluetooth/BluetoothSocket;->TYPE_L2CAP_LE:I
-Landroid/bluetooth/BluetoothSocket;->VDBG:Z
-Landroid/bluetooth/BluetoothSocket;->waitSocketSignal(Ljava/io/InputStream;)Ljava/lang/String;
-Landroid/bluetooth/BluetoothSocket;->write([BII)I
-Landroid/bluetooth/BluetoothUuid;-><init>()V
-Landroid/bluetooth/BluetoothUuid;->AudioSource:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->AvrcpController:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->AvrcpTarget:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->BASE_UUID:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->BNEP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->containsAllUuids([Landroid/os/ParcelUuid;[Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->getServiceIdentifierFromParcelUuid(Landroid/os/ParcelUuid;)I
-Landroid/bluetooth/BluetoothUuid;->Handsfree_AG:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->HearingAid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->Hid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->HSP_AG:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->isAudioSink(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isAvrcpController(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isBnep(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isHandsfree(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isHeadset(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isInputDevice(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMas(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isMns(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isNap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isPanu(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->isSap(Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/BluetoothUuid;->MAP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->MAS:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->MNS:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->PANU:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->parseUuidFrom([B)Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->PBAP_PCE:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->SAP:Landroid/os/ParcelUuid;
-Landroid/bluetooth/BluetoothUuid;->uuidToBytes(Landroid/os/ParcelUuid;)[B
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_128_BIT:I
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_16_BIT:I
-Landroid/bluetooth/BluetoothUuid;->UUID_BYTES_32_BIT:I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->cancelBondProcess(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->cancelDiscovery()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->createBond(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->createBondOutOfBand(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->disable()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->enable()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->enableNoAutoConnect()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->factoryReset()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->fetchRemoteUuids(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAdapterConnectionState()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBatteryLevel(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBondedDevices()[Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getBondState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getDiscoverableTimeout()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getDiscoveryEndMillis()J
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getLeMaximumAdvertisingDataLength()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getProfileConnectionState(I)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteAlias(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteClass(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteName(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteType(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getRemoteUuids(Landroid/bluetooth/BluetoothDevice;)[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getScanMode()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSimAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSocketManager()Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getSupportedProfiles()J
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getUuids()[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isActivityAndEnergyReportingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isBondingInitiatedLocally(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isDiscovering()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isEnabled()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLe2MPhySupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLeCodedPhySupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLeExtendedAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isLePeriodicAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isMultiAdvertisementSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isOffloadedFilteringSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->isOffloadedScanBatchingSupported()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->onBrEdrDown()V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->onLeServiceUp()V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->registerCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->removeBond(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->reportActivityInfo()Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->sdpSearch(Landroid/bluetooth/BluetoothDevice;Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setDiscoverableTimeout(I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setName(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPairingConfirmation(Landroid/bluetooth/BluetoothDevice;Z)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPasskey(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setPin(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setRemoteAlias(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setScanMode(II)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->setSimAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->startDiscovery()Z
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->unregisterCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_cancelBondProcess:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_cancelDiscovery:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_createBond:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_createBondOutOfBand:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_disable:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_enableNoAutoConnect:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_factoryReset:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_fetchRemoteUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getAdapterConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getAddress:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBatteryLevel:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBluetoothClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBondedDevices:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getBondState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getDiscoverableTimeout:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getDiscoveryEndMillis:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getLeMaximumAdvertisingDataLength:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getMaxConnectedAudioDevices:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getMessageAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getPhonebookAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getProfileConnectionState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteAlias:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteType:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getRemoteUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getScanMode:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSimAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSocketManager:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getSupportedProfiles:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_getUuids:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isActivityAndEnergyReportingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isBondingInitiatedLocally:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isDiscovering:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isEnabled:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLe2MPhySupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLeCodedPhySupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLeExtendedAdvertisingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isLePeriodicAdvertisingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isMultiAdvertisementSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isOffloadedFilteringSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_isOffloadedScanBatchingSupported:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_onBrEdrDown:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_onLeServiceUp:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_registerCallback:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_removeBond:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_reportActivityInfo:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_requestActivityInfo:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_sdpSearch:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_sendConnectionStateChange:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setBluetoothClass:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setDiscoverableTimeout:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setMessageAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setName:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPairingConfirmation:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPasskey:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPhonebookAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setPin:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setRemoteAlias:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setScanMode:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_setSimAccessPermission:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_startDiscovery:I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_unregisterCallback:I
-Landroid/bluetooth/IBluetooth;->cancelBondProcess(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->cancelDiscovery()Z
-Landroid/bluetooth/IBluetooth;->createBond(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->createBondOutOfBand(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/OobData;)Z
-Landroid/bluetooth/IBluetooth;->disable()Z
-Landroid/bluetooth/IBluetooth;->enable()Z
-Landroid/bluetooth/IBluetooth;->enableNoAutoConnect()Z
-Landroid/bluetooth/IBluetooth;->factoryReset()Z
-Landroid/bluetooth/IBluetooth;->getAdapterConnectionState()I
-Landroid/bluetooth/IBluetooth;->getBatteryLevel(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getBluetoothClass()Landroid/bluetooth/BluetoothClass;
-Landroid/bluetooth/IBluetooth;->getBondedDevices()[Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetooth;->getBondState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getDiscoverableTimeout()I
-Landroid/bluetooth/IBluetooth;->getDiscoveryEndMillis()J
-Landroid/bluetooth/IBluetooth;->getLeMaximumAdvertisingDataLength()I
-Landroid/bluetooth/IBluetooth;->getMaxConnectedAudioDevices()I
-Landroid/bluetooth/IBluetooth;->getMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth;->getPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getProfileConnectionState(I)I
-Landroid/bluetooth/IBluetooth;->getRemoteClass(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getRemoteName(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/bluetooth/IBluetooth;->getRemoteType(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getRemoteUuids(Landroid/bluetooth/BluetoothDevice;)[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth;->getScanMode()I
-Landroid/bluetooth/IBluetooth;->getSimAccessPermission(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth;->getSocketManager()Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetooth;->getState()I
-Landroid/bluetooth/IBluetooth;->getSupportedProfiles()J
-Landroid/bluetooth/IBluetooth;->getUuids()[Landroid/os/ParcelUuid;
-Landroid/bluetooth/IBluetooth;->isActivityAndEnergyReportingSupported()Z
-Landroid/bluetooth/IBluetooth;->isBondingInitiatedLocally(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->isDiscovering()Z
-Landroid/bluetooth/IBluetooth;->isLe2MPhySupported()Z
-Landroid/bluetooth/IBluetooth;->isLeCodedPhySupported()Z
-Landroid/bluetooth/IBluetooth;->isLeExtendedAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth;->isLePeriodicAdvertisingSupported()Z
-Landroid/bluetooth/IBluetooth;->isMultiAdvertisementSupported()Z
-Landroid/bluetooth/IBluetooth;->isOffloadedFilteringSupported()Z
-Landroid/bluetooth/IBluetooth;->isOffloadedScanBatchingSupported()Z
-Landroid/bluetooth/IBluetooth;->onBrEdrDown()V
-Landroid/bluetooth/IBluetooth;->onLeServiceUp()V
-Landroid/bluetooth/IBluetooth;->registerCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetooth;->removeBond(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetooth;->reportActivityInfo()Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/IBluetooth;->requestActivityInfo(Landroid/os/ResultReceiver;)V
-Landroid/bluetooth/IBluetooth;->sdpSearch(Landroid/bluetooth/BluetoothDevice;Landroid/os/ParcelUuid;)Z
-Landroid/bluetooth/IBluetooth;->setBluetoothClass(Landroid/bluetooth/BluetoothClass;)Z
-Landroid/bluetooth/IBluetooth;->setDiscoverableTimeout(I)Z
-Landroid/bluetooth/IBluetooth;->setMessageAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->setName(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth;->setPairingConfirmation(Landroid/bluetooth/BluetoothDevice;Z)Z
-Landroid/bluetooth/IBluetooth;->setPasskey(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth;->setPhonebookAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->setPin(Landroid/bluetooth/BluetoothDevice;ZI[B)Z
-Landroid/bluetooth/IBluetooth;->setRemoteAlias(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetooth;->setScanMode(II)Z
-Landroid/bluetooth/IBluetooth;->setSimAccessPermission(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetooth;->startDiscovery()Z
-Landroid/bluetooth/IBluetooth;->unregisterCallback(Landroid/bluetooth/IBluetoothCallback;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setCodecConfigPreference(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;->supportsOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_disableOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_enableOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getActiveDevice:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getCodecStatus:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getOptionalCodecsEnabled:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_isA2dpPlaying:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_isAvrcpAbsoluteVolumeSupported:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setAvrcpAbsoluteVolume:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setCodecConfigPreference:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setOptionalCodecsEnabled:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothA2dp$Stub;->TRANSACTION_supportsOptionalCodecs:I
-Landroid/bluetooth/IBluetoothA2dp;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothA2dp;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothA2dp;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus;
-Landroid/bluetooth/IBluetoothA2dp;->getOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dp;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp;->isAvrcpAbsoluteVolumeSupported()Z
-Landroid/bluetooth/IBluetoothA2dp;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dp;->setAvrcpAbsoluteVolume(I)V
-Landroid/bluetooth/IBluetoothA2dp;->setCodecConfigPreference(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothCodecConfig;)V
-Landroid/bluetooth/IBluetoothA2dp;->setOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothA2dp;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dp;->supportsOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothA2dpSink;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getAudioConfig:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_isA2dpPlaying:I
-Landroid/bluetooth/IBluetoothA2dpSink$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothA2dpSink;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->getAudioConfig(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAudioConfig;
-Landroid/bluetooth/IBluetoothA2dpSink;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothA2dpSink;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothA2dpSink;->isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothA2dpSink;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub$Proxy;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothAvrcpController;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_getPlayerSettings:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_sendGroupNavigationCmd:I
-Landroid/bluetooth/IBluetoothAvrcpController$Stub;->TRANSACTION_setPlayerApplicationSetting:I
-Landroid/bluetooth/IBluetoothAvrcpController;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothAvrcpController;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothAvrcpController;->getPlayerSettings(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothAvrcpPlayerSettings;
-Landroid/bluetooth/IBluetoothAvrcpController;->sendGroupNavigationCmd(Landroid/bluetooth/BluetoothDevice;II)V
-Landroid/bluetooth/IBluetoothAvrcpController;->setPlayerApplicationSetting(Landroid/bluetooth/BluetoothAvrcpPlayerSettings;)Z
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub$Proxy;->sendVolumeChanged(I)V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothAvrcpTarget;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothAvrcpTarget$Stub;->TRANSACTION_sendVolumeChanged:I
-Landroid/bluetooth/IBluetoothAvrcpTarget;->sendVolumeChanged(I)V
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothCallback$Stub$Proxy;->onBluetoothStateChange(II)V
-Landroid/bluetooth/IBluetoothCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothCallback;
-Landroid/bluetooth/IBluetoothCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothCallback$Stub;->TRANSACTION_onBluetoothStateChange:I
-Landroid/bluetooth/IBluetoothCallback;->onBluetoothStateChange(II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->addService(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->beginReliableWrite(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clearServices(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientConnect(ILjava/lang/String;ZIZI)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->clientSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->configureMTU(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->connectionParameterUpdate(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->disconnectAll()V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->discoverServiceByUuid(ILjava/lang/String;Landroid/os/ParcelUuid;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->discoverServices(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->enableAdvertisingSet(IZII)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->endReliableWrite(ILjava/lang/String;Z)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->flushPendingBatchResults(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->getOwnAddress(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->leConnectionUpdate(ILjava/lang/String;IIIIII)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->numHwTrackFiltersAvailable()I
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readCharacteristic(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readDescriptor(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readRemoteRssi(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->readUsingCharacteristicUuid(ILjava/lang/String;Landroid/os/ParcelUuid;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->refreshDevice(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerClient(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerForNotification(ILjava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerScanner(Landroid/bluetooth/le/IScannerCallback;Landroid/os/WorkSource;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerServer(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattServerCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->removeService(II)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->sendNotification(ILjava/lang/String;IZ[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->sendResponse(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverConnect(ILjava/lang/String;ZI)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->serverSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setAdvertisingParameters(ILandroid/bluetooth/le/AdvertisingSetParameters;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingEnable(IZ)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setPeriodicAdvertisingParameters(ILandroid/bluetooth/le/PeriodicAdvertisingParameters;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->setScanResponseData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startScan(ILandroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->startScanForIntent(Landroid/app/PendingIntent;Landroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopAdvertisingSet(Landroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopScan(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->stopScanForIntent(Landroid/app/PendingIntent;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregAll()V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterClient(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterScanner(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterServer(I)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->unregisterSync(Landroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->writeCharacteristic(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;->writeDescriptor(ILjava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGatt$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGatt$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/IBluetoothGatt$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_addService:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_beginReliableWrite:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clearServices:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientConnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientDisconnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientReadPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_clientSetPreferredPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_configureMTU:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_connectionParameterUpdate:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_disconnectAll:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_discoverServiceByUuid:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_discoverServices:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_enableAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_endReliableWrite:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_flushPendingBatchResults:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_getOwnAddress:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_leConnectionUpdate:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_numHwTrackFiltersAvailable:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readCharacteristic:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readDescriptor:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readRemoteRssi:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_readUsingCharacteristicUuid:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_refreshDevice:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerClient:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerForNotification:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerScanner:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerServer:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_registerSync:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_removeService:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_sendNotification:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_sendResponse:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverConnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverDisconnect:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverReadPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_serverSetPreferredPhy:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setAdvertisingData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setAdvertisingParameters:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingEnable:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setPeriodicAdvertisingParameters:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_setScanResponseData:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startScan:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_startScanForIntent:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopAdvertisingSet:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopScan:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_stopScanForIntent:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregAll:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterClient:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterScanner:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterServer:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_unregisterSync:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_writeCharacteristic:I
-Landroid/bluetooth/IBluetoothGatt$Stub;->TRANSACTION_writeDescriptor:I
-Landroid/bluetooth/IBluetoothGatt;->addService(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGatt;->beginReliableWrite(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clearServices(I)V
-Landroid/bluetooth/IBluetoothGatt;->clientConnect(ILjava/lang/String;ZIZI)V
-Landroid/bluetooth/IBluetoothGatt;->clientDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clientReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->clientSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt;->configureMTU(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt;->connectionParameterUpdate(ILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGatt;->disconnectAll()V
-Landroid/bluetooth/IBluetoothGatt;->discoverServiceByUuid(ILjava/lang/String;Landroid/os/ParcelUuid;)V
-Landroid/bluetooth/IBluetoothGatt;->discoverServices(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->enableAdvertisingSet(IZII)V
-Landroid/bluetooth/IBluetoothGatt;->endReliableWrite(ILjava/lang/String;Z)V
-Landroid/bluetooth/IBluetoothGatt;->flushPendingBatchResults(I)V
-Landroid/bluetooth/IBluetoothGatt;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothGatt;->getOwnAddress(I)V
-Landroid/bluetooth/IBluetoothGatt;->leConnectionUpdate(ILjava/lang/String;IIIIII)V
-Landroid/bluetooth/IBluetoothGatt;->numHwTrackFiltersAvailable()I
-Landroid/bluetooth/IBluetoothGatt;->readCharacteristic(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt;->readDescriptor(ILjava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGatt;->readRemoteRssi(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->readUsingCharacteristicUuid(ILjava/lang/String;Landroid/os/ParcelUuid;III)V
-Landroid/bluetooth/IBluetoothGatt;->refreshDevice(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->registerForNotification(ILjava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGatt;->registerScanner(Landroid/bluetooth/le/IScannerCallback;Landroid/os/WorkSource;)V
-Landroid/bluetooth/IBluetoothGatt;->registerServer(Landroid/os/ParcelUuid;Landroid/bluetooth/IBluetoothGattServerCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->removeService(II)V
-Landroid/bluetooth/IBluetoothGatt;->sendNotification(ILjava/lang/String;IZ[B)V
-Landroid/bluetooth/IBluetoothGatt;->sendResponse(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt;->serverConnect(ILjava/lang/String;ZI)V
-Landroid/bluetooth/IBluetoothGatt;->serverDisconnect(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->serverReadPhy(ILjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->serverSetPreferredPhy(ILjava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGatt;->setAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->setAdvertisingParameters(ILandroid/bluetooth/le/AdvertisingSetParameters;)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingEnable(IZ)V
-Landroid/bluetooth/IBluetoothGatt;->setPeriodicAdvertisingParameters(ILandroid/bluetooth/le/PeriodicAdvertisingParameters;)V
-Landroid/bluetooth/IBluetoothGatt;->setScanResponseData(ILandroid/bluetooth/le/AdvertiseData;)V
-Landroid/bluetooth/IBluetoothGatt;->startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->startScan(ILandroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->startScanForIntent(Landroid/app/PendingIntent;Landroid/bluetooth/le/ScanSettings;Ljava/util/List;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->stopAdvertisingSet(Landroid/bluetooth/le/IAdvertisingSetCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->stopScan(I)V
-Landroid/bluetooth/IBluetoothGatt;->stopScanForIntent(Landroid/app/PendingIntent;Ljava/lang/String;)V
-Landroid/bluetooth/IBluetoothGatt;->unregAll()V
-Landroid/bluetooth/IBluetoothGatt;->unregisterScanner(I)V
-Landroid/bluetooth/IBluetoothGatt;->unregisterServer(I)V
-Landroid/bluetooth/IBluetoothGatt;->unregisterSync(Landroid/bluetooth/le/IPeriodicAdvertisingCallback;)V
-Landroid/bluetooth/IBluetoothGatt;->writeCharacteristic(ILjava/lang/String;III[B)V
-Landroid/bluetooth/IBluetoothGatt;->writeDescriptor(ILjava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onCharacteristicRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onCharacteristicWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onClientConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onClientRegistered(II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onConfigureMTU(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onDescriptorRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onDescriptorWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onExecuteWrite(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onNotify(Ljava/lang/String;I[B)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onReadRemoteRssi(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;->onSearchComplete(Ljava/lang/String;Ljava/util/List;I)V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onCharacteristicRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onCharacteristicWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onClientConnectionState:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onClientRegistered:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onConfigureMTU:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onConnectionUpdated:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onDescriptorRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onDescriptorWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onExecuteWrite:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onNotify:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onPhyRead:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onPhyUpdate:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onReadRemoteRssi:I
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->TRANSACTION_onSearchComplete:I
-Landroid/bluetooth/IBluetoothGattCallback;->onCharacteristicRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onCharacteristicWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onClientConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattCallback;->onClientRegistered(II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onConfigureMTU(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattCallback;->onDescriptorRead(Ljava/lang/String;II[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onDescriptorWrite(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onExecuteWrite(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattCallback;->onNotify(Ljava/lang/String;I[B)V
-Landroid/bluetooth/IBluetoothGattCallback;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattCallback;->onReadRemoteRssi(Ljava/lang/String;II)V
-Landroid/bluetooth/IBluetoothGattCallback;->onSearchComplete(Ljava/lang/String;Ljava/util/List;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onCharacteristicReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onCharacteristicWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onDescriptorReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onDescriptorWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onExecuteWrite(Ljava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onMtuChanged(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onNotificationSent(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServerConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServerRegistered(II)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;->onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGattServerCallback;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onCharacteristicReadRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onCharacteristicWriteRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onConnectionUpdated:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onDescriptorReadRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onDescriptorWriteRequest:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onExecuteWrite:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onMtuChanged:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onNotificationSent:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onPhyRead:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onPhyUpdate:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServerConnectionState:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServerRegistered:I
-Landroid/bluetooth/IBluetoothGattServerCallback$Stub;->TRANSACTION_onServiceAdded:I
-Landroid/bluetooth/IBluetoothGattServerCallback;->onCharacteristicReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onCharacteristicWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onConnectionUpdated(Ljava/lang/String;IIII)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onDescriptorReadRequest(Ljava/lang/String;IIZI)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onDescriptorWriteRequest(Ljava/lang/String;IIIZZI[B)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onExecuteWrite(Ljava/lang/String;IZ)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onMtuChanged(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onNotificationSent(Ljava/lang/String;I)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onPhyRead(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onPhyUpdate(Ljava/lang/String;III)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServerConnectionState(IIZLjava/lang/String;)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServerRegistered(II)V
-Landroid/bluetooth/IBluetoothGattServerCallback;->onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->connectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->disconnectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getAudioRouteAllowed()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isAudioOn()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->isInbandRingingEnabled()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->phoneStateChanged(IIILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setForceScoAudio(Z)V
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->startScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->stopScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadset$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_clccResponse:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_connectAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_disconnectAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getActiveDevice:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getAudioState:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isAudioConnected:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isAudioOn:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_isInbandRingingEnabled:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_phoneStateChanged:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_sendVendorSpecificResultCode:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setForceScoAudio:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_startScoUsingVirtualVoiceCall:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_startVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_stopScoUsingVirtualVoiceCall:I
-Landroid/bluetooth/IBluetoothHeadset$Stub;->TRANSACTION_stopVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadset;->clccResponse(IIIIZLjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset;->connectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset;->disconnectAudio()Z
-Landroid/bluetooth/IBluetoothHeadset;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothHeadset;->getAudioRouteAllowed()Z
-Landroid/bluetooth/IBluetoothHeadset;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadset;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadset;->isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->isAudioOn()Z
-Landroid/bluetooth/IBluetoothHeadset;->isInbandRingingEnabled()Z
-Landroid/bluetooth/IBluetoothHeadset;->phoneStateChanged(IIILjava/lang/String;I)V
-Landroid/bluetooth/IBluetoothHeadset;->sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHeadset;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->setAudioRouteAllowed(Z)V
-Landroid/bluetooth/IBluetoothHeadset;->setForceScoAudio(Z)V
-Landroid/bluetooth/IBluetoothHeadset;->startScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadset;->stopScoUsingVirtualVoiceCall()Z
-Landroid/bluetooth/IBluetoothHeadset;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->acceptCall(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->rejectCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub$Proxy;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadsetClient;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_acceptCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_connectAudio:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_dial:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_disconnectAudio:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_enterPrivateMode:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_explicitCallTransfer:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getAudioState:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentAgEvents:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentAgFeatures:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getCurrentCalls:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getLastVoiceTagNumber:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_holdCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_rejectCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_sendDTMF:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_setAudioRouteAllowed:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_startVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_stopVoiceRecognition:I
-Landroid/bluetooth/IBluetoothHeadsetClient$Stub;->TRANSACTION_terminateCall:I
-Landroid/bluetooth/IBluetoothHeadsetClient;->acceptCall(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->connectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->dial(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Landroid/bluetooth/BluetoothHeadsetClientCall;
-Landroid/bluetooth/IBluetoothHeadsetClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->disconnectAudio(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->enterPrivateMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->explicitCallTransfer(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getAudioState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentAgEvents(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentAgFeatures(Landroid/bluetooth/BluetoothDevice;)Landroid/os/Bundle;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getCurrentCalls(Landroid/bluetooth/BluetoothDevice;)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHeadsetClient;->getLastVoiceTagNumber(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHeadsetClient;->holdCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->rejectCall(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->sendDTMF(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->setAudioRouteAllowed(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHeadsetClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHeadsetClient;->terminateCall(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHeadsetClientCall;)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->answerCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->cdmaSetSecondCallState(Z)V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->cdmaSwapSecondCallState()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getNetworkOperator()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->getSubscriberNumber()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->hangupCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->listCurrentCalls()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->processChld(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->queryPhoneState()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->sendDtmf(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub$Proxy;->updateBtHandsfreeAfterRadioTechnologyChange()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadsetPhone;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_answerCall:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_cdmaSetSecondCallState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_cdmaSwapSecondCallState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_getNetworkOperator:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_getSubscriberNumber:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_hangupCall:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_listCurrentCalls:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_processChld:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_queryPhoneState:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_sendDtmf:I
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;->TRANSACTION_updateBtHandsfreeAfterRadioTechnologyChange:I
-Landroid/bluetooth/IBluetoothHeadsetPhone;->answerCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSetSecondCallState(Z)V
-Landroid/bluetooth/IBluetoothHeadsetPhone;->cdmaSwapSecondCallState()V
-Landroid/bluetooth/IBluetoothHeadsetPhone;->getNetworkOperator()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone;->getSubscriberNumber()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHeadsetPhone;->hangupCall()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->listCurrentCalls()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->processChld(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->queryPhoneState()Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->sendDtmf(I)Z
-Landroid/bluetooth/IBluetoothHeadsetPhone;->updateBtHandsfreeAfterRadioTechnologyChange()V
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getConnectedHealthDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getHealthDeviceConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getHealthDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->registerAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/IBluetoothHealthCallback;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub$Proxy;->unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHealth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHealth;
-Landroid/bluetooth/IBluetoothHealth$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_connectChannelToSink:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_connectChannelToSource:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_disconnectChannel:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getConnectedHealthDevices:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getHealthDeviceConnectionState:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getHealthDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_getMainChannelFd:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_registerAppConfiguration:I
-Landroid/bluetooth/IBluetoothHealth$Stub;->TRANSACTION_unregisterAppConfiguration:I
-Landroid/bluetooth/IBluetoothHealth;->connectChannelToSink(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth;->connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealth;->disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z
-Landroid/bluetooth/IBluetoothHealth;->getConnectedHealthDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth;->getHealthDeviceConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHealth;->getHealthDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHealth;->getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothHealth;->registerAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/IBluetoothHealthCallback;)Z
-Landroid/bluetooth/IBluetoothHealth;->unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub$Proxy;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHealthCallback;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->TRANSACTION_onHealthAppConfigurationStatusChange:I
-Landroid/bluetooth/IBluetoothHealthCallback$Stub;->TRANSACTION_onHealthChannelStateChange:I
-Landroid/bluetooth/IBluetoothHealthCallback;->onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V
-Landroid/bluetooth/IBluetoothHealthCallback;->onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->adjustVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getActiveDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->getVolume()I
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHearingAid$Stub$Proxy;->setVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHearingAid;
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_adjustVolume:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getActiveDevices:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDeviceMode:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDeviceSide:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getHiSyncId:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_getVolume:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setActiveDevice:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHearingAid$Stub;->TRANSACTION_setVolume:I
-Landroid/bluetooth/IBluetoothHearingAid;->adjustVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->getActiveDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDeviceMode(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDeviceSide(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHearingAid;->getHiSyncId(Landroid/bluetooth/BluetoothDevice;)J
-Landroid/bluetooth/IBluetoothHearingAid;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHearingAid;->getVolume()I
-Landroid/bluetooth/IBluetoothHearingAid;->HI_SYNC_ID_INVALID:I
-Landroid/bluetooth/IBluetoothHearingAid;->MODE_BINAURAL:I
-Landroid/bluetooth/IBluetoothHearingAid;->MODE_MONAURAL:I
-Landroid/bluetooth/IBluetoothHearingAid;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHearingAid;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHearingAid;->setVolume(I)V
-Landroid/bluetooth/IBluetoothHearingAid;->SIDE_LEFT:I
-Landroid/bluetooth/IBluetoothHearingAid;->SIDE_RIGHT:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->registerApp(Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/IBluetoothHidDeviceCallback;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->replyReport(Landroid/bluetooth/BluetoothDevice;BB[B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->reportError(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->sendReport(Landroid/bluetooth/BluetoothDevice;I[B)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->unplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;->unregisterApp()Z
-Landroid/bluetooth/IBluetoothHidDevice$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidDevice;
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_getUserAppName:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_registerApp:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_replyReport:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_reportError:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_sendReport:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_unplug:I
-Landroid/bluetooth/IBluetoothHidDevice$Stub;->TRANSACTION_unregisterApp:I
-Landroid/bluetooth/IBluetoothHidDevice;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidDevice;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidDevice;->getUserAppName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDevice;->registerApp(Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;Landroid/bluetooth/IBluetoothHidDeviceCallback;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->replyReport(Landroid/bluetooth/BluetoothDevice;BB[B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->reportError(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->sendReport(Landroid/bluetooth/BluetoothDevice;I[B)Z
-Landroid/bluetooth/IBluetoothHidDevice;->unplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidDevice;->unregisterApp()Z
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidDeviceCallback;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onAppStatusChanged:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onConnectionStateChanged:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onGetReport:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onInterruptData:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onSetProtocol:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onSetReport:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;->TRANSACTION_onVirtualCableUnplug:I
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onAppStatusChanged(Landroid/bluetooth/BluetoothDevice;Z)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onConnectionStateChanged(Landroid/bluetooth/BluetoothDevice;I)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onGetReport(Landroid/bluetooth/BluetoothDevice;BBI)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onInterruptData(Landroid/bluetooth/BluetoothDevice;B[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onSetProtocol(Landroid/bluetooth/BluetoothDevice;B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onSetReport(Landroid/bluetooth/BluetoothDevice;BB[B)V
-Landroid/bluetooth/IBluetoothHidDeviceCallback;->onVirtualCableUnplug(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothHidHost$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHidHost;
-Landroid/bluetooth/IBluetoothHidHost$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getIdleTime:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getProtocolMode:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_getReport:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_sendData:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setIdleTime:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setProtocolMode:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_setReport:I
-Landroid/bluetooth/IBluetoothHidHost$Stub;->TRANSACTION_virtualUnplug:I
-Landroid/bluetooth/IBluetoothHidHost;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothHidHost;->getIdleTime(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothHidHost;->getProtocolMode(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothHidHost;->getReport(Landroid/bluetooth/BluetoothDevice;BBI)Z
-Landroid/bluetooth/IBluetoothHidHost;->sendData(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost;->setIdleTime(Landroid/bluetooth/BluetoothDevice;B)Z
-Landroid/bluetooth/IBluetoothHidHost;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost;->setProtocolMode(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothHidHost;->setReport(Landroid/bluetooth/BluetoothDevice;BLjava/lang/String;)Z
-Landroid/bluetooth/IBluetoothHidHost;->virtualUnplug(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->disable(Ljava/lang/String;Z)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->enable(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->enableNoAutoConnect(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isBleAppPresent()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isBleScanAlwaysAvailable()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->isEnabled()Z
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->registerStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unbindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unregisterAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->unregisterStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
-Landroid/bluetooth/IBluetoothManager$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_bindBluetoothProfileService:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_disable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_enableNoAutoConnect:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getAddress:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getBluetoothGatt:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getName:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isBleAppPresent:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isBleScanAlwaysAvailable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_isEnabled:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_registerAdapter:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_registerStateChangeCallback:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unbindBluetoothProfileService:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unregisterAdapter:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_unregisterStateChangeCallback:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_updateBleAppCount:I
-Landroid/bluetooth/IBluetoothManager;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
-Landroid/bluetooth/IBluetoothManager;->disable(Ljava/lang/String;Z)Z
-Landroid/bluetooth/IBluetoothManager;->enable(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager;->enableNoAutoConnect(Ljava/lang/String;)Z
-Landroid/bluetooth/IBluetoothManager;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager;->getName()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManager;->getState()I
-Landroid/bluetooth/IBluetoothManager;->isBleAppPresent()Z
-Landroid/bluetooth/IBluetoothManager;->isBleScanAlwaysAvailable()Z
-Landroid/bluetooth/IBluetoothManager;->isEnabled()Z
-Landroid/bluetooth/IBluetoothManager;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothManager;->unbindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)V
-Landroid/bluetooth/IBluetoothManager;->unregisterAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)V
-Landroid/bluetooth/IBluetoothManager;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBluetoothServiceDown()V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBluetoothServiceUp(Landroid/bluetooth/IBluetooth;)V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;->onBrEdrDown()V
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBluetoothServiceDown:I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBluetoothServiceUp:I
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;->TRANSACTION_onBrEdrDown:I
-Landroid/bluetooth/IBluetoothManagerCallback;->onBluetoothServiceDown()V
-Landroid/bluetooth/IBluetoothManagerCallback;->onBluetoothServiceUp(Landroid/bluetooth/IBluetooth;)V
-Landroid/bluetooth/IBluetoothManagerCallback;->onBrEdrDown()V
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothMap$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothMap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothMap;
-Landroid/bluetooth/IBluetoothMap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getClient:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothMap$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothMap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothMap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMap;->getState()I
-Landroid/bluetooth/IBluetoothMap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothMapClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothMapClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothMapClient;
-Landroid/bluetooth/IBluetoothMapClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_getUnreadMessages:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_sendMessage:I
-Landroid/bluetooth/IBluetoothMapClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothMapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothMapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothMapClient;->getUnreadMessages(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
-Landroid/bluetooth/IBluetoothMapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->isTetheringOn()Z
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPan$Stub$Proxy;->setBluetoothTethering(Z)V
-Landroid/bluetooth/IBluetoothPan$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPan$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPan;
-Landroid/bluetooth/IBluetoothPan$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_isTetheringOn:I
-Landroid/bluetooth/IBluetoothPan$Stub;->TRANSACTION_setBluetoothTethering:I
-Landroid/bluetooth/IBluetoothPan;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPan;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPan;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPan;->isTetheringOn()Z
-Landroid/bluetooth/IBluetoothPan;->setBluetoothTethering(Z)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPbap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPbap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPbap;->disconnect(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothPbap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothPbapClient$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothPbapClient$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPbapClient;
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothPbapClient$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothPbapClient;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothPbapClient;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothPbapClient;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothPbapClient;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;->onServiceDisconnected(Landroid/content/ComponentName;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothProfileServiceConnection;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->TRANSACTION_onServiceConnected:I
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;->TRANSACTION_onServiceDisconnected:I
-Landroid/bluetooth/IBluetoothProfileServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothProfileServiceConnection;->onServiceDisconnected(Landroid/content/ComponentName;)V
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->getState()I
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothSap$Stub$Proxy;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothSap$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothSap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSap;
-Landroid/bluetooth/IBluetoothSap$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_connect:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_disconnect:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getClient:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getConnectedDevices:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getConnectionState:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getDevicesMatchingConnectionStates:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getPriority:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_getState:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_isConnected:I
-Landroid/bluetooth/IBluetoothSap$Stub;->TRANSACTION_setPriority:I
-Landroid/bluetooth/IBluetoothSap;->connect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->getClient()Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/IBluetoothSap;->getConnectedDevices()Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap;->getDevicesMatchingConnectionStates([I)Ljava/util/List;
-Landroid/bluetooth/IBluetoothSap;->getPriority(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetoothSap;->getState()I
-Landroid/bluetooth/IBluetoothSap;->isConnected(Landroid/bluetooth/BluetoothDevice;)Z
-Landroid/bluetooth/IBluetoothSap;->setPriority(Landroid/bluetooth/BluetoothDevice;I)Z
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->connectSocket(Landroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->createSocketChannel(ILjava/lang/String;Landroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothSocketManager$Stub$Proxy;->requestMaximumTxDataLength(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothSocketManager$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothSocketManager;
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_connectSocket:I
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_createSocketChannel:I
-Landroid/bluetooth/IBluetoothSocketManager$Stub;->TRANSACTION_requestMaximumTxDataLength:I
-Landroid/bluetooth/IBluetoothSocketManager;->connectSocket(Landroid/bluetooth/BluetoothDevice;ILandroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager;->createSocketChannel(ILjava/lang/String;Landroid/os/ParcelUuid;II)Landroid/os/ParcelFileDescriptor;
-Landroid/bluetooth/IBluetoothSocketManager;->requestMaximumTxDataLength(Landroid/bluetooth/BluetoothDevice;)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;->TRANSACTION_onBluetoothStateChange:I
-Landroid/bluetooth/IBluetoothStateChangeCallback;->onBluetoothStateChange(Z)V
-Landroid/bluetooth/le/AdvertiseCallback;->ADVERTISE_SUCCESS:I
-Landroid/bluetooth/le/AdvertiseData$Builder;->mIncludeDeviceName:Z
-Landroid/bluetooth/le/AdvertiseData$Builder;->mIncludeTxPowerLevel:Z
-Landroid/bluetooth/le/AdvertiseData$Builder;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/AdvertiseData$Builder;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/AdvertiseData$Builder;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/AdvertiseData;-><init>(Ljava/util/List;Landroid/util/SparseArray;Ljava/util/Map;ZZ)V
-Landroid/bluetooth/le/AdvertiseData;->mIncludeDeviceName:Z
-Landroid/bluetooth/le/AdvertiseData;->mIncludeTxPowerLevel:Z
-Landroid/bluetooth/le/AdvertiseData;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/AdvertiseData;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/AdvertiseData;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mConnectable:Z
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mMode:I
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mTimeoutMillis:I
-Landroid/bluetooth/le/AdvertiseSettings$Builder;->mTxPowerLevel:I
-Landroid/bluetooth/le/AdvertiseSettings;-><init>(IIZI)V
-Landroid/bluetooth/le/AdvertiseSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/AdvertiseSettings;->LIMITED_ADVERTISING_MAX_MILLIS:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseConnectable:Z
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseMode:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseTimeoutMillis:I
-Landroid/bluetooth/le/AdvertiseSettings;->mAdvertiseTxPowerLevel:I
-Landroid/bluetooth/le/AdvertisingSet;-><init>(ILandroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/AdvertisingSet;->getAdvertiserId()I
-Landroid/bluetooth/le/AdvertisingSet;->getOwnAddress()V
-Landroid/bluetooth/le/AdvertisingSet;->mAdvertiserId:I
-Landroid/bluetooth/le/AdvertisingSet;->mGatt:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/le/AdvertisingSet;->setAdvertiserId(I)V
-Landroid/bluetooth/le/AdvertisingSet;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/AdvertisingSetCallback;->onOwnAddressRead(Landroid/bluetooth/le/AdvertisingSet;ILjava/lang/String;)V
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mConnectable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIncludeTxPower:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mInterval:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIsAnonymous:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mIsLegacy:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mPrimaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mScannable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mSecondaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters$Builder;->mTxPowerLevel:I
-Landroid/bluetooth/le/AdvertisingSetParameters;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/AdvertisingSetParameters;-><init>(ZZZZZIIII)V
-Landroid/bluetooth/le/AdvertisingSetParameters;->LIMITED_ADVERTISING_MAX_MILLIS:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mConnectable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIncludeTxPower:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mInterval:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIsAnonymous:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mIsLegacy:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mPrimaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mScannable:Z
-Landroid/bluetooth/le/AdvertisingSetParameters;->mSecondaryPhy:I
-Landroid/bluetooth/le/AdvertisingSetParameters;->mTxPowerLevel:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->byteLength([B)I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->cleanup()V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->FLAGS_FIELD_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mAdvertisingSets:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MANUFACTURER_SPECIFIC_DATA_LENGTH:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MAX_ADVERTISING_DATA_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->MAX_LEGACY_ADVERTISING_DATA_BYTES:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mCallbackWrappers:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->mLegacyAdvertisers:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->OVERHEAD_BYTES_PER_FIELD:I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartFailure(Landroid/bluetooth/le/AdvertiseCallback;I)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartSetFailure(Landroid/os/Handler;Landroid/bluetooth/le/AdvertisingSetCallback;I)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->postStartSuccess(Landroid/bluetooth/le/AdvertiseCallback;Landroid/bluetooth/le/AdvertiseSettings;)V
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->totalBytes(Landroid/bluetooth/le/AdvertiseData;Z)I
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->wrap(Landroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)Landroid/bluetooth/le/IAdvertisingSetCallback;
-Landroid/bluetooth/le/BluetoothLeAdvertiser;->wrapOldCallback(Landroid/bluetooth/le/AdvertiseCallback;Landroid/bluetooth/le/AdvertiseSettings;)Landroid/bluetooth/le/AdvertisingSetCallback;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->flushPendingBatchResults()V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mBluetoothGatt:Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mFilters:Ljava/util/List;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mResultStorages:Ljava/util/List;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mScanCallback:Landroid/bluetooth/le/ScanCallback;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mScannerId:I
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mSettings:Landroid/bluetooth/le/ScanSettings;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->mWorkSource:Landroid/os/WorkSource;
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScannerRegistered(II)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->REGISTRATION_CALLBACK_TIMEOUT_MILLIS:I
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->startRegistration()V
-Landroid/bluetooth/le/BluetoothLeScanner$BleScanCallbackWrapper;->stopLeScan()V
-Landroid/bluetooth/le/BluetoothLeScanner;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/BluetoothLeScanner;->cleanup()V
-Landroid/bluetooth/le/BluetoothLeScanner;->DBG:Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isHardwareResourcesAvailableForScan(Landroid/bluetooth/le/ScanSettings;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isSettingsAndFilterComboAllowed(Landroid/bluetooth/le/ScanSettings;Ljava/util/List;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->isSettingsConfigAllowedForScan(Landroid/bluetooth/le/ScanSettings;)Z
-Landroid/bluetooth/le/BluetoothLeScanner;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/BluetoothLeScanner;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/BluetoothLeScanner;->mHandler:Landroid/os/Handler;
-Landroid/bluetooth/le/BluetoothLeScanner;->mLeScanClients:Ljava/util/Map;
-Landroid/bluetooth/le/BluetoothLeScanner;->postCallbackError(Landroid/bluetooth/le/ScanCallback;I)V
-Landroid/bluetooth/le/BluetoothLeScanner;->postCallbackErrorOrReturn(Landroid/bluetooth/le/ScanCallback;I)I
-Landroid/bluetooth/le/BluetoothLeScanner;->startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/os/WorkSource;Landroid/bluetooth/le/ScanCallback;Landroid/app/PendingIntent;Ljava/util/List;)I
-Landroid/bluetooth/le/BluetoothLeScanner;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeScanner;->VDBG:Z
-Landroid/bluetooth/le/BluetoothLeUtils;-><init>()V
-Landroid/bluetooth/le/BluetoothLeUtils;->checkAdapterStateOn(Landroid/bluetooth/BluetoothAdapter;)V
-Landroid/bluetooth/le/BluetoothLeUtils;->equals(Landroid/util/SparseArray;Landroid/util/SparseArray;)Z
-Landroid/bluetooth/le/BluetoothLeUtils;->equals(Ljava/util/Map;Ljava/util/Map;)Z
-Landroid/bluetooth/le/BluetoothLeUtils;->toString(Landroid/util/SparseArray;)Ljava/lang/String;
-Landroid/bluetooth/le/BluetoothLeUtils;->toString(Ljava/util/Map;)Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingParametersUpdated(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingSetStarted(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onAdvertisingSetStopped(I)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onOwnAddressRead(IILjava/lang/String;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onPeriodicAdvertisingParametersUpdated(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;->onScanResponseDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IAdvertisingSetCallback;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingEnabled:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingParametersUpdated:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingSetStarted:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onAdvertisingSetStopped:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onOwnAddressRead:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingEnabled:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onPeriodicAdvertisingParametersUpdated:I
-Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;->TRANSACTION_onScanResponseDataSet:I
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingParametersUpdated(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingSetStarted(III)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onAdvertisingSetStopped(I)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onOwnAddressRead(IILjava/lang/String;)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingDataSet(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingEnabled(IZI)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onPeriodicAdvertisingParametersUpdated(II)V
-Landroid/bluetooth/le/IAdvertisingSetCallback;->onScanResponseDataSet(II)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;->onSyncLost(I)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IPeriodicAdvertisingCallback;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onPeriodicAdvertisingReport:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onSyncEstablished:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;->TRANSACTION_onSyncLost:I
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/IPeriodicAdvertisingCallback;->onSyncLost(I)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->getInterfaceDescriptor()Ljava/lang/String;
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScannerRegistered(II)V
-Landroid/bluetooth/le/IScannerCallback$Stub$Proxy;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback$Stub;-><init>()V
-Landroid/bluetooth/le/IScannerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/le/IScannerCallback;
-Landroid/bluetooth/le/IScannerCallback$Stub;->DESCRIPTOR:Ljava/lang/String;
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onBatchScanResults:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onFoundOrLost:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScanManagerErrorCallback:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScannerRegistered:I
-Landroid/bluetooth/le/IScannerCallback$Stub;->TRANSACTION_onScanResult:I
-Landroid/bluetooth/le/IScannerCallback;->onBatchScanResults(Ljava/util/List;)V
-Landroid/bluetooth/le/IScannerCallback;->onFoundOrLost(ZLandroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/IScannerCallback;->onScanManagerErrorCallback(I)V
-Landroid/bluetooth/le/IScannerCallback;->onScannerRegistered(II)V
-Landroid/bluetooth/le/IScannerCallback;->onScanResult(Landroid/bluetooth/le/ScanResult;)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;-><init>()V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onPeriodicAdvertisingReport(Landroid/bluetooth/le/PeriodicAdvertisingReport;)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onSyncEstablished(ILandroid/bluetooth/BluetoothDevice;IIII)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->onSyncLost(I)V
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_NO_RESOURCES:I
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_NO_RESPONSE:I
-Landroid/bluetooth/le/PeriodicAdvertisingCallback;->SYNC_SUCCESS:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;-><init>(Landroid/bluetooth/IBluetoothManager;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mBluetoothAdapter:Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mBluetoothManager:Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->mCallbackWrappers:Ljava/util/Map;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/PeriodicAdvertisingCallback;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->registerSync(Landroid/bluetooth/le/ScanResult;IILandroid/bluetooth/le/PeriodicAdvertisingCallback;Landroid/os/Handler;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SKIP_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SKIP_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->SYNC_STARTING:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TIMEOUT_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->TIMEOUT_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->unregisterSync(Landroid/bluetooth/le/PeriodicAdvertisingCallback;)V
-Landroid/bluetooth/le/PeriodicAdvertisingManager;->wrap(Landroid/bluetooth/le/PeriodicAdvertisingCallback;Landroid/os/Handler;)Landroid/bluetooth/le/IPeriodicAdvertisingCallback;
-Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;->mIncludeTxPower:Z
-Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;->mInterval:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;-><init>(ZI)V
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->INTERVAL_MAX:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->INTERVAL_MIN:I
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->mIncludeTxPower:Z
-Landroid/bluetooth/le/PeriodicAdvertisingParameters;->mInterval:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;-><init>(IIIILandroid/bluetooth/le/ScanRecord;)V
-Landroid/bluetooth/le/PeriodicAdvertisingReport;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->DATA_COMPLETE:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->DATA_INCOMPLETE_TRUNCATED:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getData()Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getDataStatus()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getRssi()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getSyncHandle()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getTimestampNanos()J
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->getTxPower()I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mData:Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mDataStatus:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mRssi:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mSyncHandle:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mTimestampNanos:J
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->mTxPower:I
-Landroid/bluetooth/le/PeriodicAdvertisingReport;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ResultStorageDescriptor;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ResultStorageDescriptor;->mLength:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->mOffset:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->mType:I
-Landroid/bluetooth/le/ResultStorageDescriptor;->ReadFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanCallback;->NO_ERROR:I
-Landroid/bluetooth/le/ScanCallback;->SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES:I
-Landroid/bluetooth/le/ScanCallback;->SCAN_FAILED_SCANNING_TOO_FREQUENTLY:I
-Landroid/bluetooth/le/ScanFilter$Builder;->mDeviceAddress:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter$Builder;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerData:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerDataMask:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mManufacturerId:I
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceData:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceDataMask:[B
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceDataUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter$Builder;->mServiceUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter$Builder;->mUuidMask:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;[B[BI[B[B)V
-Landroid/bluetooth/le/ScanFilter;->EMPTY:Landroid/bluetooth/le/ScanFilter;
-Landroid/bluetooth/le/ScanFilter;->isAllFieldsEmpty()Z
-Landroid/bluetooth/le/ScanFilter;->matchesPartialData([B[B[B)Z
-Landroid/bluetooth/le/ScanFilter;->matchesServiceUuid(Ljava/util/UUID;Ljava/util/UUID;Ljava/util/UUID;)Z
-Landroid/bluetooth/le/ScanFilter;->matchesServiceUuids(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;Ljava/util/List;)Z
-Landroid/bluetooth/le/ScanFilter;->mDeviceAddress:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanFilter;->mManufacturerData:[B
-Landroid/bluetooth/le/ScanFilter;->mManufacturerDataMask:[B
-Landroid/bluetooth/le/ScanFilter;->mManufacturerId:I
-Landroid/bluetooth/le/ScanFilter;->mServiceData:[B
-Landroid/bluetooth/le/ScanFilter;->mServiceDataMask:[B
-Landroid/bluetooth/le/ScanFilter;->mServiceDataUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;->mServiceUuid:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanFilter;->mServiceUuidMask:Landroid/os/ParcelUuid;
-Landroid/bluetooth/le/ScanRecord;-><init>(Ljava/util/List;Landroid/util/SparseArray;Ljava/util/Map;IILjava/lang/String;[B)V
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_FLAGS:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_LOCAL_NAME_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_LOCAL_NAME_SHORT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_MANUFACTURER_SPECIFIC_DATA:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_128_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_16_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_DATA_32_BIT:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_128_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_128_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_16_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_16_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_32_BIT_COMPLETE:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_SERVICE_UUIDS_32_BIT_PARTIAL:I
-Landroid/bluetooth/le/ScanRecord;->DATA_TYPE_TX_POWER_LEVEL:I
-Landroid/bluetooth/le/ScanRecord;->extractBytes([BII)[B
-Landroid/bluetooth/le/ScanRecord;->mAdvertiseFlags:I
-Landroid/bluetooth/le/ScanRecord;->mBytes:[B
-Landroid/bluetooth/le/ScanRecord;->mDeviceName:Ljava/lang/String;
-Landroid/bluetooth/le/ScanRecord;->mManufacturerSpecificData:Landroid/util/SparseArray;
-Landroid/bluetooth/le/ScanRecord;->mServiceData:Ljava/util/Map;
-Landroid/bluetooth/le/ScanRecord;->mServiceUuids:Ljava/util/List;
-Landroid/bluetooth/le/ScanRecord;->mTxPowerLevel:I
-Landroid/bluetooth/le/ScanRecord;->parseServiceUuid([BIIILjava/util/List;)I
-Landroid/bluetooth/le/ScanRecord;->TAG:Ljava/lang/String;
-Landroid/bluetooth/le/ScanResult;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanResult;->ET_CONNECTABLE_MASK:I
-Landroid/bluetooth/le/ScanResult;->ET_LEGACY_MASK:I
-Landroid/bluetooth/le/ScanResult;->mAdvertisingSid:I
-Landroid/bluetooth/le/ScanResult;->mDevice:Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/le/ScanResult;->mEventType:I
-Landroid/bluetooth/le/ScanResult;->mPeriodicAdvertisingInterval:I
-Landroid/bluetooth/le/ScanResult;->mPrimaryPhy:I
-Landroid/bluetooth/le/ScanResult;->mRssi:I
-Landroid/bluetooth/le/ScanResult;->mScanRecord:Landroid/bluetooth/le/ScanRecord;
-Landroid/bluetooth/le/ScanResult;->mSecondaryPhy:I
-Landroid/bluetooth/le/ScanResult;->mTimestampNanos:J
-Landroid/bluetooth/le/ScanResult;->mTxPower:I
-Landroid/bluetooth/le/ScanResult;->readFromParcel(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanSettings$Builder;->isValidCallbackType(I)Z
-Landroid/bluetooth/le/ScanSettings$Builder;->mCallbackType:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mLegacy:Z
-Landroid/bluetooth/le/ScanSettings$Builder;->mMatchMode:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mNumOfMatchesPerFilter:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mPhy:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mReportDelayMillis:J
-Landroid/bluetooth/le/ScanSettings$Builder;->mScanMode:I
-Landroid/bluetooth/le/ScanSettings$Builder;->mScanResultType:I
-Landroid/bluetooth/le/ScanSettings;-><init>(IIIJIIZI)V
-Landroid/bluetooth/le/ScanSettings;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/le/ScanSettings;->getMatchMode()I
-Landroid/bluetooth/le/ScanSettings;->getNumOfMatches()I
-Landroid/bluetooth/le/ScanSettings;->mCallbackType:I
-Landroid/bluetooth/le/ScanSettings;->mLegacy:Z
-Landroid/bluetooth/le/ScanSettings;->mMatchMode:I
-Landroid/bluetooth/le/ScanSettings;->mNumOfMatchesPerFilter:I
-Landroid/bluetooth/le/ScanSettings;->mPhy:I
-Landroid/bluetooth/le/ScanSettings;->mReportDelayMillis:J
-Landroid/bluetooth/le/ScanSettings;->mScanMode:I
-Landroid/bluetooth/le/ScanSettings;->mScanResultType:I
-Landroid/bluetooth/le/TruncatedFilter;->mFilter:Landroid/bluetooth/le/ScanFilter;
-Landroid/bluetooth/le/TruncatedFilter;->mStorageDescriptors:Ljava/util/List;
-Landroid/bluetooth/OobData;-><init>()V
-Landroid/bluetooth/OobData;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/OobData;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/OobData;->getLeBluetoothDeviceAddress()[B
-Landroid/bluetooth/OobData;->getLeSecureConnectionsConfirmation()[B
-Landroid/bluetooth/OobData;->getLeSecureConnectionsRandom()[B
-Landroid/bluetooth/OobData;->getSecurityManagerTk()[B
-Landroid/bluetooth/OobData;->mLeBluetoothDeviceAddress:[B
-Landroid/bluetooth/OobData;->mLeSecureConnectionsConfirmation:[B
-Landroid/bluetooth/OobData;->mLeSecureConnectionsRandom:[B
-Landroid/bluetooth/OobData;->mSecurityManagerTk:[B
-Landroid/bluetooth/OobData;->setLeBluetoothDeviceAddress([B)V
-Landroid/bluetooth/OobData;->setLeSecureConnectionsConfirmation([B)V
-Landroid/bluetooth/OobData;->setLeSecureConnectionsRandom([B)V
-Landroid/bluetooth/OobData;->setSecurityManagerTk([B)V
-Landroid/bluetooth/SdpMasRecord$MessageType;-><init>()V
-Landroid/bluetooth/SdpMasRecord$MessageType;->EMAIL:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->MMS:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->SMS_CDMA:I
-Landroid/bluetooth/SdpMasRecord$MessageType;->SMS_GSM:I
-Landroid/bluetooth/SdpMasRecord;-><init>(IIIIIILjava/lang/String;)V
-Landroid/bluetooth/SdpMasRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpMasRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpMasRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpMasRecord;->getMasInstanceId()I
-Landroid/bluetooth/SdpMasRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpMasRecord;->getRfcommCannelNumber()I
-Landroid/bluetooth/SdpMasRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpMasRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpMasRecord;->getSupportedMessageTypes()I
-Landroid/bluetooth/SdpMasRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpMasRecord;->mMasInstanceId:I
-Landroid/bluetooth/SdpMasRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpMasRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpMasRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpMasRecord;->msgSupported(I)Z
-Landroid/bluetooth/SdpMasRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpMasRecord;->mSupportedMessageTypes:I
-Landroid/bluetooth/SdpMnsRecord;-><init>(IIIILjava/lang/String;)V
-Landroid/bluetooth/SdpMnsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpMnsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpMnsRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpMnsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpMnsRecord;->getRfcommChannelNumber()I
-Landroid/bluetooth/SdpMnsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpMnsRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpMnsRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpMnsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpMnsRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpMnsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpMnsRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpOppOpsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpOppOpsRecord;-><init>(Ljava/lang/String;III[B)V
-Landroid/bluetooth/SdpOppOpsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpOppOpsRecord;->getFormatsList()[B
-Landroid/bluetooth/SdpOppOpsRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpOppOpsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpOppOpsRecord;->getRfcommChannel()I
-Landroid/bluetooth/SdpOppOpsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpOppOpsRecord;->mFormatsList:[B
-Landroid/bluetooth/SdpOppOpsRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpOppOpsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpOppOpsRecord;->mRfcommChannel:I
-Landroid/bluetooth/SdpOppOpsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;-><init>(IIIIILjava/lang/String;)V
-Landroid/bluetooth/SdpPseRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpPseRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpPseRecord;->getL2capPsm()I
-Landroid/bluetooth/SdpPseRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpPseRecord;->getRfcommChannelNumber()I
-Landroid/bluetooth/SdpPseRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;->getSupportedFeatures()I
-Landroid/bluetooth/SdpPseRecord;->getSupportedRepositories()I
-Landroid/bluetooth/SdpPseRecord;->mL2capPsm:I
-Landroid/bluetooth/SdpPseRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpPseRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpPseRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/SdpPseRecord;->mSupportedFeatures:I
-Landroid/bluetooth/SdpPseRecord;->mSupportedRepositories:I
-Landroid/bluetooth/SdpRecord;-><init>(I[B)V
-Landroid/bluetooth/SdpRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpRecord;->getRawData()[B
-Landroid/bluetooth/SdpRecord;->getRawSize()I
-Landroid/bluetooth/SdpRecord;->mRawData:[B
-Landroid/bluetooth/SdpRecord;->mRawSize:I
-Landroid/bluetooth/SdpSapsRecord;-><init>(IILjava/lang/String;)V
-Landroid/bluetooth/SdpSapsRecord;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/SdpSapsRecord;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/SdpSapsRecord;->getProfileVersion()I
-Landroid/bluetooth/SdpSapsRecord;->getRfcommCannelNumber()I
-Landroid/bluetooth/SdpSapsRecord;->getServiceName()Ljava/lang/String;
-Landroid/bluetooth/SdpSapsRecord;->mProfileVersion:I
-Landroid/bluetooth/SdpSapsRecord;->mRfcommChannelNumber:I
-Landroid/bluetooth/SdpSapsRecord;->mServiceName:Ljava/lang/String;
-Landroid/bluetooth/UidTraffic;-><init>(I)V
-Landroid/bluetooth/UidTraffic;-><init>(IJJ)V
-Landroid/bluetooth/UidTraffic;-><init>(Landroid/os/Parcel;)V
-Landroid/bluetooth/UidTraffic;->addRxBytes(J)V
-Landroid/bluetooth/UidTraffic;->addTxBytes(J)V
-Landroid/bluetooth/UidTraffic;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/bluetooth/UidTraffic;->getRxBytes()J
-Landroid/bluetooth/UidTraffic;->getTxBytes()J
-Landroid/bluetooth/UidTraffic;->getUid()I
-Landroid/bluetooth/UidTraffic;->mAppUid:I
-Landroid/bluetooth/UidTraffic;->mRxBytes:J
-Landroid/bluetooth/UidTraffic;->mTxBytes:J
-Landroid/bluetooth/UidTraffic;->setRxBytes(J)V
-Landroid/bluetooth/UidTraffic;->setTxBytes(J)V
Landroid/companion/AssociationRequest$Builder;->mDeviceFilters:Ljava/util/ArrayList;
Landroid/companion/AssociationRequest$Builder;->mSingleDevice:Z
Landroid/companion/AssociationRequest;-><init>(Landroid/os/Parcel;)V
diff --git a/boot/hiddenapi/hiddenapi-max-target-p.txt b/boot/hiddenapi/hiddenapi-max-target-p.txt
index 351e71d..4a66a7c 100644
--- a/boot/hiddenapi/hiddenapi-max-target-p.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-p.txt
@@ -1,8 +1,6 @@
Landroid/app/IInstrumentationWatcher$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstrumentationWatcher;
Landroid/app/ISearchManager$Stub;-><init>()V
Landroid/app/IUiModeManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUiModeManager;
-Landroid/bluetooth/IBluetooth$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothA2dp$Stub;-><init>()V
Landroid/content/IIntentReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentReceiver;
Landroid/content/IIntentSender$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentSender;
Landroid/os/storage/IObbActionListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IObbActionListener;
diff --git a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
index 20d7cc0..dbc3b51 100644
--- a/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
+++ b/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt
@@ -3,9 +3,6 @@
Landroid/app/IActivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityManager;
Landroid/app/IInstrumentationWatcher$Stub;-><init>()V
Landroid/app/INotificationManager$Stub;->TRANSACTION_enqueueNotificationWithTag:I
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
-Landroid/bluetooth/IBluetooth$Stub;->TRANSACTION_enable:I
-Landroid/bluetooth/IBluetoothManager$Stub;->TRANSACTION_enable:I
Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
Landroid/content/om/IOverlayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/om/IOverlayManager;
Landroid/content/pm/IPackageManager$Stub;->TRANSACTION_getApplicationInfo:I
diff --git a/boot/hiddenapi/hiddenapi-unsupported.txt b/boot/hiddenapi/hiddenapi-unsupported.txt
index 033afb6..f619913 100644
--- a/boot/hiddenapi/hiddenapi-unsupported.txt
+++ b/boot/hiddenapi/hiddenapi-unsupported.txt
@@ -62,19 +62,6 @@
Landroid/app/job/IJobService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobService;
Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/usage/IUsageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IUsageStatsManager;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
-Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothA2dp$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothA2dp;
-Landroid/bluetooth/IBluetoothCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothGattCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothGattCallback;
-Landroid/bluetooth/IBluetoothHeadset$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothHeadset;
-Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/bluetooth/IBluetoothManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;-><init>()V
-Landroid/bluetooth/IBluetoothPbap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPbap;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;-><init>()V
Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard;
Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
diff --git a/core/api/current.txt b/core/api/current.txt
index aa7d171..698c1ce 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -3248,7 +3248,7 @@
method public int getNonInteractiveUiTimeoutMillis();
method public android.content.pm.ResolveInfo getResolveInfo();
method public String getSettingsActivityName();
- method @Nullable public String getTileServiceClassName();
+ method @Nullable public String getTileServiceName();
method public boolean isAccessibilityTool();
method public String loadDescription(android.content.pm.PackageManager);
method @Nullable public CharSequence loadIntro(@NonNull android.content.pm.PackageManager);
@@ -7390,12 +7390,12 @@
method @NonNull public java.util.List<java.lang.String> getDelegatedScopes(@Nullable android.content.ComponentName, @NonNull String);
method @Nullable public String getDeviceManagerRoleHolderPackageName();
method public CharSequence getDeviceOwnerLockScreenInfo();
- method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
- method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
+ method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
+ method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
- method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, int, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
- method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.concurrent.Callable<android.graphics.drawable.Drawable>);
+ method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
+ method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method public CharSequence getEndUserSessionMessage(@NonNull android.content.ComponentName);
method @NonNull public String getEnrollmentSpecificId();
method @Nullable public android.app.admin.FactoryResetProtectionPolicy getFactoryResetProtectionPolicy(@Nullable android.content.ComponentName);
@@ -10329,7 +10329,6 @@
field public static final String ACTION_VIEW_LOCUS = "android.intent.action.VIEW_LOCUS";
field @RequiresPermission(android.Manifest.permission.START_VIEW_PERMISSION_USAGE) public static final String ACTION_VIEW_PERMISSION_USAGE = "android.intent.action.VIEW_PERMISSION_USAGE";
field @RequiresPermission(android.Manifest.permission.START_VIEW_PERMISSION_USAGE) public static final String ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD = "android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD";
- field @RequiresPermission("android.permission.MANAGE_SENSOR_PRIVACY") public static final String ACTION_VIEW_SAFETY_HUB = "android.intent.action.VIEW_SAFETY_HUB";
field public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
field @Deprecated public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
field public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index e294955..76cac5f 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1059,10 +1059,10 @@
ctor public DevicePolicyDrawableResource(@NonNull android.content.Context, @NonNull String, @NonNull String, @NonNull String, @DrawableRes int);
ctor public DevicePolicyDrawableResource(@NonNull android.content.Context, @NonNull String, @NonNull String, @DrawableRes int);
method public int describeContents();
- method @DrawableRes public int getCallingPackageResourceId();
method @NonNull public String getDrawableId();
method @NonNull public String getDrawableSource();
method @NonNull public String getDrawableStyle();
+ method @DrawableRes public int getResourceIdInCallingPackage();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.admin.DevicePolicyDrawableResource> CREATOR;
}
@@ -1088,8 +1088,8 @@
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_ADMIN_POLICY}) public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
method @Nullable public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS}) public String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
- method @Nullable public String getString(@NonNull String, @NonNull java.util.concurrent.Callable<java.lang.String>);
- method @Nullable public String getString(@NonNull String, @NonNull java.util.concurrent.Callable<java.lang.String>, @NonNull java.lang.Object...);
+ method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>);
+ method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>, @NonNull java.lang.Object...);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS}) public int getUserProvisioningState();
method public boolean isDeviceManaged();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioned();
@@ -1239,7 +1239,7 @@
public final class DevicePolicyStringResource implements android.os.Parcelable {
ctor public DevicePolicyStringResource(@NonNull android.content.Context, @NonNull String, @StringRes int);
method public int describeContents();
- method public int getCallingPackageResourceId();
+ method public int getResourceIdInCallingPackage();
method @NonNull public String getStringId();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.admin.DevicePolicyStringResource> CREATOR;
@@ -2823,11 +2823,14 @@
public final class VirtualDeviceParams implements android.os.Parcelable {
method public int describeContents();
- method @Nullable public java.util.Set<android.content.ComponentName> getAllowedActivities();
- method @Nullable public java.util.Set<android.content.ComponentName> getBlockedActivities();
+ method @NonNull public java.util.Set<android.content.ComponentName> getAllowedActivities();
+ method @NonNull public java.util.Set<android.content.ComponentName> getBlockedActivities();
+ method public int getDefaultActivityPolicy();
method public int getLockState();
method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts();
method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field public static final int ACTIVITY_POLICY_DEFAULT_ALLOWED = 0; // 0x0
+ field public static final int ACTIVITY_POLICY_DEFAULT_BLOCKED = 1; // 0x1
field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.VirtualDeviceParams> CREATOR;
field public static final int LOCK_STATE_ALWAYS_UNLOCKED = 1; // 0x1
field public static final int LOCK_STATE_DEFAULT = 0; // 0x0
@@ -2836,8 +2839,8 @@
public static final class VirtualDeviceParams.Builder {
ctor public VirtualDeviceParams.Builder();
method @NonNull public android.companion.virtual.VirtualDeviceParams build();
- method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAllowedActivities(@Nullable java.util.Set<android.content.ComponentName>);
- method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@Nullable java.util.Set<android.content.ComponentName>);
+ method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setAllowedActivities(@NonNull java.util.Set<android.content.ComponentName>);
+ method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@NonNull java.util.Set<android.content.ComponentName>);
method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int);
method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>);
}
@@ -3035,6 +3038,7 @@
field public static final String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
field public static final String ACTION_USER_SWITCHED = "android.intent.action.USER_SWITCHED";
field @RequiresPermission(android.Manifest.permission.START_VIEW_APP_FEATURES) public static final String ACTION_VIEW_APP_FEATURES = "android.intent.action.VIEW_APP_FEATURES";
+ field @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public static final String ACTION_VIEW_SAFETY_CENTER_QS = "android.intent.action.VIEW_SAFETY_CENTER_QS";
field public static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
field public static final String CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS";
field public static final String EXTRA_CALLING_PACKAGE = "android.intent.extra.CALLING_PACKAGE";
@@ -5908,16 +5912,16 @@
method @IntRange(from=0, to=1023) public int getIssueOfDataClock();
method @IntRange(from=0, to=255) public int getIssueOfDataEphemeris();
method @Nullable public android.location.SatellitePvt.PositionEcef getPositionEcef();
- method @IntRange(from=0) public long getTimeOfClock();
- method @IntRange(from=0) public long getTimeOfEphemeris();
+ method @IntRange(from=0) public long getTimeOfClockSeconds();
+ method @IntRange(from=0) public long getTimeOfEphemerisSeconds();
method @FloatRange public double getTropoDelayMeters();
method @Nullable public android.location.SatellitePvt.VelocityEcef getVelocityEcef();
method public boolean hasIono();
method public boolean hasIssueOfDataClock();
method public boolean hasIssueOfDataEphemeris();
method public boolean hasPositionVelocityClockInfo();
- method public boolean hasTimeOfClock();
- method public boolean hasTimeOfEphemeris();
+ method public boolean hasTimeOfClockSeconds();
+ method public boolean hasTimeOfEphemerisSeconds();
method public boolean hasTropo();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.location.SatellitePvt> CREATOR;
@@ -5936,8 +5940,8 @@
method @NonNull public android.location.SatellitePvt.Builder setIssueOfDataClock(@IntRange(from=0, to=1023) int);
method @NonNull public android.location.SatellitePvt.Builder setIssueOfDataEphemeris(@IntRange(from=0, to=255) int);
method @NonNull public android.location.SatellitePvt.Builder setPositionEcef(@NonNull android.location.SatellitePvt.PositionEcef);
- method @NonNull public android.location.SatellitePvt.Builder setTimeOfClock(@IntRange(from=0) long);
- method @NonNull public android.location.SatellitePvt.Builder setTimeOfEphemeris(@IntRange(from=0) int);
+ method @NonNull public android.location.SatellitePvt.Builder setTimeOfClockSeconds(@IntRange(from=0) long);
+ method @NonNull public android.location.SatellitePvt.Builder setTimeOfEphemerisSeconds(@IntRange(from=0) long);
method @NonNull public android.location.SatellitePvt.Builder setTropoDelayMeters(@FloatRange(from=0.0f, to=100.0f) double);
method @NonNull public android.location.SatellitePvt.Builder setVelocityEcef(@NonNull android.location.SatellitePvt.VelocityEcef);
}
@@ -10318,6 +10322,7 @@
field public static final String NAMESPACE_RUNTIME_NATIVE = "runtime_native";
field public static final String NAMESPACE_RUNTIME_NATIVE_BOOT = "runtime_native_boot";
field public static final String NAMESPACE_SCHEDULER = "scheduler";
+ field public static final String NAMESPACE_SDK_SANDBOX = "sdk_sandbox";
field public static final String NAMESPACE_STATSD_JAVA = "statsd_java";
field public static final String NAMESPACE_STATSD_JAVA_BOOT = "statsd_java_boot";
field public static final String NAMESPACE_STATSD_NATIVE = "statsd_native";
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index e64392b..22637ca 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1073,7 +1073,7 @@
field public static final int DIALOG = 3; // 0x3
field public static final int OTHER = 5; // 0x5
field public static final int QS_TILE = 1; // 0x1
- field public static final int SAFETY_HUB = 6; // 0x6
+ field public static final int SAFETY_CENTER = 6; // 0x6
field public static final int SETTINGS = 2; // 0x2
field public static final int SHELL = 4; // 0x4
}
@@ -2962,6 +2962,7 @@
public final class AutofillManager {
field public static final String DEVICE_CONFIG_AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "compat_mode_allowed_packages";
+ field public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED = "autofill_dialog_enabled";
field public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES = "smart_suggestion_supported_modes";
field public static final int FLAG_SMART_SUGGESTION_OFF = 0; // 0x0
field public static final int FLAG_SMART_SUGGESTION_SYSTEM = 1; // 0x1
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 8af68d7..530de0f 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -83,11 +83,13 @@
* @attr ref android.R.styleable#AccessibilityService_canRequestFilterKeyEvents
* @attr ref android.R.styleable#AccessibilityService_canRequestTouchExplorationMode
* @attr ref android.R.styleable#AccessibilityService_canRetrieveWindowContent
+ * @attr ref android.R.styleable#AccessibilityService_intro
* @attr ref android.R.styleable#AccessibilityService_description
* @attr ref android.R.styleable#AccessibilityService_summary
* @attr ref android.R.styleable#AccessibilityService_notificationTimeout
* @attr ref android.R.styleable#AccessibilityService_packageNames
* @attr ref android.R.styleable#AccessibilityService_settingsActivity
+ * @attr ref android.R.styleable#AccessibilityService_tileService
* @attr ref android.R.styleable#AccessibilityService_nonInteractiveUiTimeout
* @attr ref android.R.styleable#AccessibilityService_interactiveUiTimeout
* @attr ref android.R.styleable#AccessibilityService_canTakeScreenshot
@@ -547,11 +549,11 @@
private String mSettingsActivityName;
/**
- * The class name of {@link android.service.quicksettings.TileService} is associated with this
+ * The name of {@link android.service.quicksettings.TileService} is associated with this
* accessibility service for one to one mapping. It is used by system settings to remind users
* this accessibility service has a {@link android.service.quicksettings.TileService}.
*/
- private String mTileServiceClassName;
+ private String mTileServiceName;
/**
* Bit mask with capabilities of this service.
@@ -740,7 +742,7 @@
}
mIsAccessibilityTool = asAttributes.getBoolean(
R.styleable.AccessibilityService_isAccessibilityTool, false);
- mTileServiceClassName = asAttributes.getString(
+ mTileServiceName = asAttributes.getString(
com.android.internal.R.styleable.AccessibilityService_tileService);
peekedValue = asAttributes.peekValue(
com.android.internal.R.styleable.AccessibilityService_intro);
@@ -850,14 +852,14 @@
}
/**
- * Gets the class name of {@link android.service.quicksettings.TileService} is associated with
+ * Gets the name of {@link android.service.quicksettings.TileService} is associated with
* this accessibility service.
*
- * @return The class names of {@link android.service.quicksettings.TileService}.
+ * @return The name of {@link android.service.quicksettings.TileService}.
*/
@Nullable
- public String getTileServiceClassName() {
- return mTileServiceClassName;
+ public String getTileServiceName() {
+ return mTileServiceName;
}
/**
@@ -1146,7 +1148,7 @@
parcel.writeInt(mHtmlDescriptionRes);
parcel.writeString(mNonLocalizedDescription);
parcel.writeBoolean(mIsAccessibilityTool);
- parcel.writeString(mTileServiceClassName);
+ parcel.writeString(mTileServiceName);
parcel.writeInt(mIntroResId);
}
@@ -1170,7 +1172,7 @@
mHtmlDescriptionRes = parcel.readInt();
mNonLocalizedDescription = parcel.readString();
mIsAccessibilityTool = parcel.readBoolean();
- mTileServiceClassName = parcel.readString();
+ mTileServiceName = parcel.readString();
mIntroResId = parcel.readInt();
}
@@ -1224,7 +1226,7 @@
stringBuilder.append(", ");
stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName);
stringBuilder.append(", ");
- stringBuilder.append("tileServiceClassName: ").append(mTileServiceClassName);
+ stringBuilder.append("tileServiceName: ").append(mTileServiceName);
stringBuilder.append(", ");
stringBuilder.append("summary: ").append(mNonLocalizedSummary);
stringBuilder.append(", ");
diff --git a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
index 9a73219..4e6cfb35 100644
--- a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java
@@ -101,11 +101,11 @@
private String mSettingsActivityName;
/**
- * The class name of {@link android.service.quicksettings.TileService} is associated with this
+ * The name of {@link android.service.quicksettings.TileService} is associated with this
* accessibility shortcut target for one to one mapping. It is used by system settings to remind
* users this accessibility service has a {@link android.service.quicksettings.TileService}.
*/
- private String mTileServiceClassName;
+ private String mTileServiceName;
/**
* Creates a new instance.
@@ -163,7 +163,7 @@
mSettingsActivityName = asAttributes.getString(
com.android.internal.R.styleable.AccessibilityShortcutTarget_settingsActivity);
// Get tile service class name
- mTileServiceClassName = asAttributes.getString(
+ mTileServiceName = asAttributes.getString(
com.android.internal.R.styleable.AccessibilityShortcutTarget_tileService);
// Gets intro
mIntroResId = asAttributes.getResourceId(
@@ -287,14 +287,14 @@
}
/**
- * Gets the class name of {@link android.service.quicksettings.TileService} is associated with
+ * Gets the name of {@link android.service.quicksettings.TileService} is associated with
* this accessibility shortcut target.
*
- * @return The class names of {@link android.service.quicksettings.TileService}.
+ * @return The class name of {@link android.service.quicksettings.TileService}.
*/
@Nullable
- public String getTileServiceClassName() {
- return mTileServiceClassName;
+ public String getTileServiceName() {
+ return mTileServiceName;
}
/**
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 11663a5..bc979fc 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -7416,7 +7416,6 @@
} else {
mDumpableContainer.listDumpables(prefix, writer);
}
- mDumpableContainer.listDumpables(prefix, writer);
return;
case DUMP_ARG_DUMP_DUMPABLE:
if (args.length == 1) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 61d1865..64f0301 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4469,12 +4469,6 @@
// we are back active so skip it.
unscheduleGcIdler();
- // To investigate "duplciate Application objects" bug (b/185177290)
- if (UserHandle.myUserId() != UserHandle.getUserId(data.info.applicationInfo.uid)) {
- Slog.wtf(TAG, "handleCreateService called with wrong appinfo UID: myUserId="
- + UserHandle.myUserId() + " appinfo.uid=" + data.info.applicationInfo.uid);
- }
-
LoadedApk packageInfo = getPackageInfoNoCheck(
data.info.applicationInfo, data.compatInfo);
Service service = null;
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index 9eb3e8f..7c337a4 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -29,14 +29,12 @@
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
-import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
import android.view.autofill.AutofillManager;
-import com.android.internal.annotations.GuardedBy;
-
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Base class for maintaining global application state. You can provide your own
@@ -74,12 +72,8 @@
@UnsupportedAppUsage
public LoadedApk mLoadedApk;
- @GuardedBy("sInstances")
- private static final ArrayMap<Class<?>, Application> sInstances =
- DEBUG_DUP_APP_INSTANCES ? new ArrayMap<>(1) : null;
-
- // Only set when DEBUG_DUP_APP_INSTANCES is true.
- private StackTrace mConstructorStackTrace;
+ private static final AtomicReference<StackTrace> sConstructorStackTrace =
+ new AtomicReference<>();
public interface ActivityLifecycleCallbacks {
@@ -252,28 +246,20 @@
}
private void checkDuplicateInstances() {
- final Class<?> myClass = this.getClass();
-
- // We only activate this check for custom application classes.
- // Otherwise, it'd misfire if multiple apps share the same process, if all of them use
- // the same Application class (on the same classloader).
- if (myClass == Application.class) {
+ // STOPSHIP: Delete this check b/221248960
+ // Only run this check for gms-core.
+ if (!"com.google.android.gms".equals(ActivityThread.currentOpPackageName())) {
return;
}
- synchronized (sInstances) {
- final Application firstInstance = sInstances.get(myClass);
- if (firstInstance == null) {
- this.mConstructorStackTrace = new StackTrace("First ctor was called here");
- sInstances.put(myClass, this);
- return;
- }
- final StackTrace currentStackTrace = new StackTrace("Current ctor was called here",
- firstInstance.mConstructorStackTrace);
- this.mConstructorStackTrace = currentStackTrace;
- Slog.wtf(TAG, "Application ctor called twice for " + myClass
- + " first LoadedApk=" + firstInstance.getLoadedApkInfo(),
- currentStackTrace);
+
+ final StackTrace previousStackTrace = sConstructorStackTrace.getAndSet(
+ new StackTrace("Previous stack trace"));
+ if (previousStackTrace == null) {
+ // This is the first call.
+ return;
}
+ Slog.wtf(TAG, "Application ctor called twice for " + this.getClass(),
+ new StackTrace("Current stack trace", previousStackTrace));
}
private String getLoadedApkInfo() {
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index 490afc1..ef9a2f2 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -299,7 +299,7 @@
* a short predefined amount of time.
*/
void registerRemoteAnimationForNextActivityStart(in String packageName,
- in RemoteAnimationAdapter adapter);
+ in RemoteAnimationAdapter adapter, in IBinder launchCookie);
/**
* Registers remote animations for a display.
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 99a523a..cf259e57 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -160,6 +160,13 @@
private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
= new ArrayMap<>();
private AppComponentFactory mAppComponentFactory;
+
+ /**
+ * We cache the instantiated application object for each package on this process here.
+ */
+ @GuardedBy("sApplications")
+ private static final ArrayMap<String, Application> sApplications = new ArrayMap<>(4);
+
private final Object mLock = new Object();
Application getApplication() {
@@ -1345,14 +1352,6 @@
return mResources;
}
- /**
- * Used to investigate "duplicate app objects" bug (b/185177290).
- * makeApplication() should only be called on the main thread, so no synchronization should
- * be needed, but syncing anyway just in case.
- */
- @GuardedBy("sApplicationCache")
- private static final ArrayMap<String, Application> sApplicationCache = new ArrayMap<>(4);
-
@UnsupportedAppUsage
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
@@ -1361,15 +1360,8 @@
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication");
- // For b/185177290.
- final boolean wrongUser =
- UserHandle.myUserId() != UserHandle.getUserId(mApplicationInfo.uid);
- if (wrongUser) {
- Slog.wtf(TAG, "makeApplication called with wrong appinfo UID: myUserId="
- + UserHandle.myUserId() + " appinfo.uid=" + mApplicationInfo.uid);
- }
- synchronized (sApplicationCache) {
- final Application cached = sApplicationCache.get(mPackageName);
+ synchronized (sApplications) {
+ final Application cached = sApplications.get(mPackageName);
if (cached != null) {
// Looks like this is always happening for the system server, because
// the LoadedApk created in systemMain() -> attach() isn't cached properly?
@@ -1377,8 +1369,8 @@
Slog.wtf(TAG, "App instance already created for package=" + mPackageName
+ " instance=" + cached);
}
- // TODO Return the cached one, unles it's for the wrong user?
- // For now, we just add WTF checks.
+ mApplication = cached;
+ return cached;
}
}
@@ -1429,8 +1421,8 @@
}
mActivityThread.mAllApplications.add(app);
mApplication = app;
- synchronized (sApplicationCache) {
- sApplicationCache.put(mPackageName, app);
+ synchronized (sApplications) {
+ sApplications.put(mPackageName, app);
}
if (instrumentation != null) {
diff --git a/core/java/android/app/admin/DevicePolicyDrawableResource.java b/core/java/android/app/admin/DevicePolicyDrawableResource.java
index 61ff11b..7fd8e89 100644
--- a/core/java/android/app/admin/DevicePolicyDrawableResource.java
+++ b/core/java/android/app/admin/DevicePolicyDrawableResource.java
@@ -38,7 +38,7 @@
@NonNull private final @DevicePolicyResources.UpdatableDrawableId String mDrawableId;
@NonNull private final @DevicePolicyResources.UpdatableDrawableStyle String mDrawableStyle;
@NonNull private final @DevicePolicyResources.UpdatableDrawableSource String mDrawableSource;
- private final @DrawableRes int mCallingPackageResourceId;
+ private final @DrawableRes int mResourceIdInCallingPackage;
@NonNull private ParcelableResource mResource;
/**
@@ -47,25 +47,25 @@
*
* <p>It will be used to update the drawable defined by {@code drawableId} with style
* {@code drawableStyle} located in source {@code drawableSource} to the drawable with ID
- * {@code callingPackageResourceId} in the calling package</p>
+ * {@code resourceIdInCallingPackage} in the calling package</p>
*
* @param drawableId The ID of the drawable to update.
* @param drawableStyle The style of the drawable to update.
* @param drawableSource The source of the drawable to update.
- * @param callingPackageResourceId The ID of the drawable resource in the calling package to
+ * @param resourceIdInCallingPackage The ID of the drawable resource in the calling package to
* use as an updated resource.
*
* @throws IllegalStateException if the resource with ID
- * {@code callingPackageResourceId} doesn't exist in the {@code context} package.
+ * {@code resourceIdInCallingPackage} doesn't exist in the {@code context} package.
*/
public DevicePolicyDrawableResource(
@NonNull Context context,
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
@NonNull @DevicePolicyResources.UpdatableDrawableSource String drawableSource,
- @DrawableRes int callingPackageResourceId) {
- this(drawableId, drawableStyle, drawableSource, callingPackageResourceId,
- new ParcelableResource(context, callingPackageResourceId,
+ @DrawableRes int resourceIdInCallingPackage) {
+ this(drawableId, drawableStyle, drawableSource, resourceIdInCallingPackage,
+ new ParcelableResource(context, resourceIdInCallingPackage,
ParcelableResource.RESOURCE_TYPE_DRAWABLE));
}
@@ -73,7 +73,7 @@
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
@NonNull @DevicePolicyResources.UpdatableDrawableSource String drawableSource,
- @DrawableRes int callingPackageResourceId,
+ @DrawableRes int resourceIdInCallingPackage,
@NonNull ParcelableResource resource) {
Objects.requireNonNull(drawableId);
@@ -84,7 +84,7 @@
this.mDrawableId = drawableId;
this.mDrawableStyle = drawableStyle;
this.mDrawableSource = drawableSource;
- this.mCallingPackageResourceId = callingPackageResourceId;
+ this.mResourceIdInCallingPackage = resourceIdInCallingPackage;
this.mResource = resource;
}
@@ -92,24 +92,24 @@
* Creates an object containing the required information for updating an enterprise drawable
* resource using {@link DevicePolicyManager#setDrawables}.
* <p>It will be used to update the drawable defined by {@code drawableId} with style
- * {@code drawableStyle} to the drawable with ID {@code callingPackageResourceId} in the
+ * {@code drawableStyle} to the drawable with ID {@code resourceIdInCallingPackage} in the
* calling package</p>
*
* @param drawableId The ID of the drawable to update.
* @param drawableStyle The style of the drawable to update.
- * @param callingPackageResourceId The ID of the drawable resource in the calling package to
+ * @param resourceIdInCallingPackage The ID of the drawable resource in the calling package to
* use as an updated resource.
*
* @throws IllegalStateException if the resource with ID
- * {@code callingPackageResourceId} doesn't exist in the calling package.
+ * {@code resourceIdInCallingPackage} doesn't exist in the calling package.
*/
public DevicePolicyDrawableResource(
@NonNull Context context,
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
- @DrawableRes int callingPackageResourceId) {
+ @DrawableRes int resourceIdInCallingPackage) {
this(context, drawableId, drawableStyle, Drawables.Source.UNDEFINED,
- callingPackageResourceId);
+ resourceIdInCallingPackage);
}
/**
@@ -144,8 +144,8 @@
* resource.
*/
@DrawableRes
- public int getCallingPackageResourceId() {
- return mCallingPackageResourceId;
+ public int getResourceIdInCallingPackage() {
+ return mResourceIdInCallingPackage;
}
/**
@@ -166,14 +166,14 @@
return mDrawableId.equals(other.mDrawableId)
&& mDrawableStyle.equals(other.mDrawableStyle)
&& mDrawableSource.equals(other.mDrawableSource)
- && mCallingPackageResourceId == other.mCallingPackageResourceId
+ && mResourceIdInCallingPackage == other.mResourceIdInCallingPackage
&& mResource.equals(other.mResource);
}
@Override
public int hashCode() {
- return Objects.hash(
- mDrawableId, mDrawableStyle, mDrawableSource, mCallingPackageResourceId, mResource);
+ return Objects.hash(mDrawableId, mDrawableStyle, mDrawableSource,
+ mResourceIdInCallingPackage, mResource);
}
@Override
@@ -186,7 +186,7 @@
dest.writeString(mDrawableId);
dest.writeString(mDrawableStyle);
dest.writeString(mDrawableSource);
- dest.writeInt(mCallingPackageResourceId);
+ dest.writeInt(mResourceIdInCallingPackage);
dest.writeTypedObject(mResource, flags);
}
@@ -197,11 +197,11 @@
String drawableId = in.readString();
String drawableStyle = in.readString();
String drawableSource = in.readString();
- int callingPackageResourceId = in.readInt();
+ int resourceIdInCallingPackage = in.readInt();
ParcelableResource resource = in.readTypedObject(ParcelableResource.CREATOR);
return new DevicePolicyDrawableResource(
- drawableId, drawableStyle, drawableSource, callingPackageResourceId,
+ drawableId, drawableStyle, drawableSource, resourceIdInCallingPackage,
resource);
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index f0a7bfc..b944468 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -132,11 +132,11 @@
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
+import java.util.function.Supplier;
// TODO(b/172376923) - add CarDevicePolicyManager examples below (or remove reference to it).
/**
@@ -7027,10 +7027,10 @@
* management app can use {@link #ID_TYPE_BASE_INFO} to request inclusion of the general device
* information including manufacturer, model, brand, device and product in the attestation
* record.
- * Only device owner, profile owner on an organization-owned device and their delegated
- * certificate installers can use {@link #ID_TYPE_SERIAL}, {@link #ID_TYPE_IMEI} and
- * {@link #ID_TYPE_MEID} to request unique device identifiers to be attested (the serial number,
- * IMEI and MEID correspondingly), if supported by the device
+ * Only device owner, profile owner on an organization-owned device or affiliated user, and
+ * their delegated certificate installers can use {@link #ID_TYPE_SERIAL}, {@link #ID_TYPE_IMEI}
+ * and {@link #ID_TYPE_MEID} to request unique device identifiers to be attested (the serial
+ * number, IMEI and MEID correspondingly), if supported by the device
* (see {@link #isDeviceIdAttestationSupported()}).
* Additionally, device owner, profile owner on an organization-owned device and their delegated
* certificate installers can also request the attestation record to be signed using an
@@ -15134,7 +15134,7 @@
* the combination of {@link DevicePolicyDrawableResource#getDrawableId()} and
* {@link DevicePolicyDrawableResource#getDrawableStyle()}, (see
* {@link DevicePolicyResources.Drawables} and {@link DevicePolicyResources.Drawables.Style}) to
- * the drawable with ID {@link DevicePolicyDrawableResource#getCallingPackageResourceId()},
+ * the drawable with ID {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()},
* meaning any system UI surface calling {@link #getDrawable}
* with {@code drawableId} and {@code drawableStyle} will get the new resource after this API
* is called.
@@ -15149,12 +15149,12 @@
* <p>Important notes to consider when using this API:
* <ul>
* <li>{@link #getDrawable} references the resource
- * {@link DevicePolicyDrawableResource#getCallingPackageResourceId()} in the
+ * {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} in the
* calling package each time it gets called. You have to ensure that the resource is always
* available in the calling package as long as it is used as an updated resource.
* <li>You still have to re-call {@code setDrawables} even if you only make changes to the
* content of the resource with ID
- * {@link DevicePolicyDrawableResource#getCallingPackageResourceId()} as the content might be
+ * {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} as the content might be
* cached and would need updating.
* </ul>
*
@@ -15215,7 +15215,7 @@
*
* <p>This API uses the screen density returned from {@link Resources#getConfiguration()}, to
* set a different value use
- * {@link #getDrawableForDensity(String, String, int, Callable)}.
+ * {@link #getDrawableForDensity(String, String, int, Supplier)}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
@@ -15232,16 +15232,16 @@
public Drawable getDrawable(
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
- @NonNull Callable<Drawable> defaultDrawableLoader) {
+ @NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawable(
drawableId, drawableStyle, Drawables.Source.UNDEFINED, defaultDrawableLoader);
}
/**
- * Similar to {@link #getDrawable(String, String, Callable)}, but also accepts
+ * Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* a {@code drawableSource} (see {@link DevicePolicyResources.Drawables.Source}) which
* could result in returning a different drawable than
- * {@link #getDrawable(String, String, Callable)}
+ * {@link #getDrawable(String, String, Supplier)}
* if an override was set for that specific source.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
@@ -15261,7 +15261,7 @@
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
@NonNull @DevicePolicyResources.UpdatableDrawableSource String drawableSource,
- @NonNull Callable<Drawable> defaultDrawableLoader) {
+ @NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
@@ -15296,7 +15296,7 @@
}
/**
- * Similar to {@link #getDrawable(String, String, Callable)}, but also accepts
+ * Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
@@ -15318,7 +15318,7 @@
@NonNull @DevicePolicyResources.UpdatableDrawableId String drawableId,
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
int density,
- @NonNull Callable<Drawable> defaultDrawableLoader) {
+ @NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawableForDensity(
drawableId,
drawableStyle,
@@ -15328,7 +15328,7 @@
}
/**
- * Similar to {@link #getDrawable(String, String, String, Callable)}, but also accepts
+ * Similar to {@link #getDrawable(String, String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
@@ -15352,7 +15352,7 @@
@NonNull @DevicePolicyResources.UpdatableDrawableStyle String drawableStyle,
@NonNull @DevicePolicyResources.UpdatableDrawableSource String drawableSource,
int density,
- @NonNull Callable<Drawable> defaultDrawableLoader) {
+ @NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
@@ -15383,7 +15383,7 @@
}
/**
- * Similar to {@link #getDrawable(String, String, String, Callable)} but returns an
+ * Similar to {@link #getDrawable(String, String, String, Supplier)} but returns an
* {@link Icon} instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
@@ -15425,7 +15425,7 @@
}
/**
- * Similar to {@link #getDrawable(String, String, Callable)} but returns an {@link Icon}
+ * Similar to {@link #getDrawable(String, String, Supplier)} but returns an {@link Icon}
* instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
@@ -15531,7 +15531,7 @@
@Nullable
public String getString(
@NonNull @DevicePolicyResources.UpdatableStringId String stringId,
- @NonNull Callable<String> defaultStringLoader) {
+ @NonNull Supplier<String> defaultStringLoader) {
Objects.requireNonNull(stringId, "stringId can't be null");
Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
@@ -15558,7 +15558,7 @@
}
/**
- * Similar to {@link #getString(String, Callable)} but accepts {@code formatArgs} and returns a
+ * Similar to {@link #getString(String, Supplier)} but accepts {@code formatArgs} and returns a
* localized formatted string, substituting the format arguments as defined in
* {@link java.util.Formatter} and {@link java.lang.String#format}, (see
* {@link Resources#getString(int, Object...)}).
@@ -15578,7 +15578,7 @@
@SuppressLint("SamShouldBeLast")
public String getString(
@NonNull @DevicePolicyResources.UpdatableStringId String stringId,
- @NonNull Callable<String> defaultStringLoader,
+ @NonNull Supplier<String> defaultStringLoader,
@NonNull Object... formatArgs) {
Objects.requireNonNull(stringId, "stringId can't be null");
diff --git a/core/java/android/app/admin/DevicePolicyStringResource.java b/core/java/android/app/admin/DevicePolicyStringResource.java
index 5f09bfd..b36f1408 100644
--- a/core/java/android/app/admin/DevicePolicyStringResource.java
+++ b/core/java/android/app/admin/DevicePolicyStringResource.java
@@ -35,7 +35,7 @@
@SystemApi
public final class DevicePolicyStringResource implements Parcelable {
@NonNull private final @DevicePolicyResources.UpdatableStringId String mStringId;
- private final @StringRes int mCallingPackageResourceId;
+ private final @StringRes int mResourceIdInCallingPackage;
@NonNull private ParcelableResource mResource;
/**
@@ -43,32 +43,32 @@
* resource using {@link DevicePolicyManager#setStrings}.
*
* <p>It will be used to update the string defined by {@code stringId} to the string with ID
- * {@code callingPackageResourceId} in the calling package</p>
+ * {@code resourceIdInCallingPackage} in the calling package</p>
*
* @param stringId The ID of the string to update.
- * @param callingPackageResourceId The ID of the {@link StringRes} in the calling package to
+ * @param resourceIdInCallingPackage The ID of the {@link StringRes} in the calling package to
* use as an updated resource.
*
- * @throws IllegalStateException if the resource with ID {@code callingPackageResourceId}
+ * @throws IllegalStateException if the resource with ID {@code resourceIdInCallingPackage}
* doesn't exist in the {@code context} package.
*/
public DevicePolicyStringResource(
@NonNull Context context,
@NonNull @DevicePolicyResources.UpdatableStringId String stringId,
- @StringRes int callingPackageResourceId) {
- this(stringId, callingPackageResourceId, new ParcelableResource(
- context, callingPackageResourceId, ParcelableResource.RESOURCE_TYPE_STRING));
+ @StringRes int resourceIdInCallingPackage) {
+ this(stringId, resourceIdInCallingPackage, new ParcelableResource(
+ context, resourceIdInCallingPackage, ParcelableResource.RESOURCE_TYPE_STRING));
}
private DevicePolicyStringResource(
@NonNull @DevicePolicyResources.UpdatableStringId String stringId,
- @StringRes int callingPackageResourceId,
+ @StringRes int resourceIdInCallingPackage,
@NonNull ParcelableResource resource) {
Objects.requireNonNull(stringId, "stringId must be provided.");
Objects.requireNonNull(resource, "ParcelableResource must be provided.");
this.mStringId = stringId;
- this.mCallingPackageResourceId = callingPackageResourceId;
+ this.mResourceIdInCallingPackage = resourceIdInCallingPackage;
this.mResource = resource;
}
@@ -85,8 +85,8 @@
* Returns the ID of the {@link StringRes} in the calling package to use as an updated
* resource.
*/
- public int getCallingPackageResourceId() {
- return mCallingPackageResourceId;
+ public int getResourceIdInCallingPackage() {
+ return mResourceIdInCallingPackage;
}
/**
@@ -105,13 +105,13 @@
if (o == null || getClass() != o.getClass()) return false;
DevicePolicyStringResource other = (DevicePolicyStringResource) o;
return mStringId == other.mStringId
- && mCallingPackageResourceId == other.mCallingPackageResourceId
+ && mResourceIdInCallingPackage == other.mResourceIdInCallingPackage
&& mResource.equals(other.mResource);
}
@Override
public int hashCode() {
- return Objects.hash(mStringId, mCallingPackageResourceId, mResource);
+ return Objects.hash(mStringId, mResourceIdInCallingPackage, mResource);
}
@Override
@@ -122,7 +122,7 @@
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString(mStringId);
- dest.writeInt(mCallingPackageResourceId);
+ dest.writeInt(mResourceIdInCallingPackage);
dest.writeTypedObject(mResource, flags);
}
@@ -131,10 +131,10 @@
@Override
public DevicePolicyStringResource createFromParcel(Parcel in) {
String stringId = in.readString();
- int callingPackageResourceId = in.readInt();
+ int resourceIdInCallingPackage = in.readInt();
ParcelableResource resource = in.readTypedObject(ParcelableResource.CREATOR);
- return new DevicePolicyStringResource(stringId, callingPackageResourceId, resource);
+ return new DevicePolicyStringResource(stringId, resourceIdInCallingPackage, resource);
}
@Override
diff --git a/core/java/android/app/admin/ParcelableResource.java b/core/java/android/app/admin/ParcelableResource.java
index 0b1b166..bcae284 100644
--- a/core/java/android/app/admin/ParcelableResource.java
+++ b/core/java/android/app/admin/ParcelableResource.java
@@ -39,7 +39,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
-import java.util.concurrent.Callable;
+import java.util.function.Supplier;
/**
* Used to store the required information to load a resource that was updated using
@@ -179,7 +179,7 @@
public Drawable getDrawable(
Context context,
int density,
- @NonNull Callable<Drawable> defaultDrawableLoader) {
+ @NonNull Supplier<Drawable> defaultDrawableLoader) {
// TODO(b/203548565): properly handle edge case when the device manager role holder is
// unavailable because it's being updated.
try {
@@ -203,7 +203,7 @@
@Nullable
public String getString(
Context context,
- @NonNull Callable<String> defaultStringLoader) {
+ @NonNull Supplier<String> defaultStringLoader) {
// TODO(b/203548565): properly handle edge case when the device manager role holder is
// unavailable because it's being updated.
try {
@@ -227,7 +227,7 @@
@Nullable
public String getString(
Context context,
- @NonNull Callable<String> defaultStringLoader,
+ @NonNull Supplier<String> defaultStringLoader,
@NonNull Object... formatArgs) {
// TODO(b/203548565): properly handle edge case when the device manager role holder is
// unavailable because it's being updated.
@@ -268,26 +268,18 @@
* returns the {@link Drawable} loaded from calling {@code defaultDrawableLoader}.
*/
@Nullable
- public static Drawable loadDefaultDrawable(@NonNull Callable<Drawable> defaultDrawableLoader) {
- try {
- Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
- return defaultDrawableLoader.call();
- } catch (Exception e) {
- throw new RuntimeException("Couldn't load default drawable: ", e);
- }
+ public static Drawable loadDefaultDrawable(@NonNull Supplier<Drawable> defaultDrawableLoader) {
+ Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
+ return defaultDrawableLoader.get();
}
/**
* returns the {@link String} loaded from calling {@code defaultStringLoader}.
*/
@Nullable
- public static String loadDefaultString(@NonNull Callable<String> defaultStringLoader) {
- try {
- Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
- return defaultStringLoader.call();
- } catch (Exception e) {
- throw new RuntimeException("Couldn't load default string: ", e);
- }
+ public static String loadDefaultString(@NonNull Supplier<String> defaultStringLoader) {
+ Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
+ return defaultStringLoader.get();
}
/**
diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java
index 45d0ad5..41b1a1f 100644
--- a/core/java/android/companion/virtual/VirtualDeviceParams.java
+++ b/core/java/android/companion/virtual/VirtualDeviceParams.java
@@ -20,9 +20,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.content.ComponentName;
import android.os.Parcel;
@@ -64,20 +62,43 @@
*/
public static final int LOCK_STATE_ALWAYS_UNLOCKED = 1;
+ /** @hide */
+ @IntDef(prefix = "ACTIVITY_POLICY_",
+ value = {ACTIVITY_POLICY_DEFAULT_ALLOWED, ACTIVITY_POLICY_DEFAULT_BLOCKED})
+ @Retention(RetentionPolicy.SOURCE)
+ @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
+ public @interface ActivityPolicy {}
+
+ /**
+ * Indicates that activities are allowed by default on this virtual device, unless they are
+ * explicitly blocked by {@link Builder#setBlockedActivities}.
+ */
+ public static final int ACTIVITY_POLICY_DEFAULT_ALLOWED = 0;
+
+ /**
+ * Indicates that activities are blocked by default on this virtual device, unless they are
+ * allowed by {@link Builder#setAllowedActivities}.
+ */
+ public static final int ACTIVITY_POLICY_DEFAULT_BLOCKED = 1;
+
private final int mLockState;
private final ArraySet<UserHandle> mUsersWithMatchingAccounts;
- @Nullable private final ArraySet<ComponentName> mAllowedActivities;
- @Nullable private final ArraySet<ComponentName> mBlockedActivities;
+ @NonNull private final ArraySet<ComponentName> mAllowedActivities;
+ @NonNull private final ArraySet<ComponentName> mBlockedActivities;
+ @ActivityPolicy
+ private final int mDefaultActivityPolicy;
private VirtualDeviceParams(
@LockState int lockState,
@NonNull Set<UserHandle> usersWithMatchingAccounts,
- @Nullable Set<ComponentName> allowedActivities,
- @Nullable Set<ComponentName> blockedActivities) {
+ @NonNull Set<ComponentName> allowedActivities,
+ @NonNull Set<ComponentName> blockedActivities,
+ @ActivityPolicy int defaultActivityPolicy) {
mLockState = lockState;
mUsersWithMatchingAccounts = new ArraySet<>(usersWithMatchingAccounts);
mAllowedActivities = allowedActivities == null ? null : new ArraySet<>(allowedActivities);
mBlockedActivities = blockedActivities == null ? null : new ArraySet<>(blockedActivities);
+ mDefaultActivityPolicy = defaultActivityPolicy;
}
@SuppressWarnings("unchecked")
@@ -86,6 +107,7 @@
mUsersWithMatchingAccounts = (ArraySet<UserHandle>) parcel.readArraySet(null);
mAllowedActivities = (ArraySet<ComponentName>) parcel.readArraySet(null);
mBlockedActivities = (ArraySet<ComponentName>) parcel.readArraySet(null);
+ mDefaultActivityPolicy = parcel.readInt();
}
/**
@@ -113,12 +135,10 @@
*
* @see Builder#setAllowedActivities(Set)
*/
- // Null and empty have different semantics - Null allows all activities to be streamed
- @SuppressLint("NullableCollection")
- @Nullable
+ @NonNull
public Set<ComponentName> getAllowedActivities() {
if (mAllowedActivities == null) {
- return null;
+ return Collections.emptySet();
}
return Collections.unmodifiableSet(mAllowedActivities);
}
@@ -129,16 +149,27 @@
*
* @see Builder#setBlockedActivities(Set)
*/
- // Allowing null to enforce that at most one of allowed / blocked activities can be non-null
- @SuppressLint("NullableCollection")
- @Nullable
+ @NonNull
public Set<ComponentName> getBlockedActivities() {
if (mBlockedActivities == null) {
- return null;
+ return Collections.emptySet();
}
return Collections.unmodifiableSet(mBlockedActivities);
}
+ /**
+ * Returns {@link #ACTIVITY_POLICY_DEFAULT_ALLOWED} if activities are allowed to launch on this
+ * virtual device by default, or {@link #ACTIVITY_POLICY_DEFAULT_BLOCKED} if activities must be
+ * allowed by {@link Builder#setAllowedActivities} to launch here.
+ *
+ * @see Builder#setBlockedActivities
+ * @see Builder#setAllowedActivities
+ */
+ @ActivityPolicy
+ public int getDefaultActivityPolicy() {
+ return mDefaultActivityPolicy;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -150,6 +181,7 @@
dest.writeArraySet(mUsersWithMatchingAccounts);
dest.writeArraySet(mAllowedActivities);
dest.writeArraySet(mBlockedActivities);
+ dest.writeInt(mDefaultActivityPolicy);
}
@Override
@@ -164,12 +196,15 @@
return mLockState == that.mLockState
&& mUsersWithMatchingAccounts.equals(that.mUsersWithMatchingAccounts)
&& Objects.equals(mAllowedActivities, that.mAllowedActivities)
- && Objects.equals(mBlockedActivities, that.mBlockedActivities);
+ && Objects.equals(mBlockedActivities, that.mBlockedActivities)
+ && mDefaultActivityPolicy == that.mDefaultActivityPolicy;
}
@Override
public int hashCode() {
- return Objects.hash(mLockState, mUsersWithMatchingAccounts);
+ return Objects.hash(
+ mLockState, mUsersWithMatchingAccounts, mAllowedActivities, mBlockedActivities,
+ mDefaultActivityPolicy);
}
@Override
@@ -180,6 +215,7 @@
+ " mUsersWithMatchingAccounts=" + mUsersWithMatchingAccounts
+ " mAllowedActivities=" + mAllowedActivities
+ " mBlockedActivities=" + mBlockedActivities
+ + " mDefaultActivityPolicy=" + mDefaultActivityPolicy
+ ")";
}
@@ -202,8 +238,11 @@
private @LockState int mLockState = LOCK_STATE_DEFAULT;
private Set<UserHandle> mUsersWithMatchingAccounts;
- @Nullable private Set<ComponentName> mBlockedActivities;
- @Nullable private Set<ComponentName> mAllowedActivities;
+ @NonNull private Set<ComponentName> mBlockedActivities = Collections.emptySet();
+ @NonNull private Set<ComponentName> mAllowedActivities = Collections.emptySet();
+ @ActivityPolicy
+ private int mDefaultActivityPolicy = ACTIVITY_POLICY_DEFAULT_ALLOWED;
+ private boolean mDefaultActivityPolicyConfigured = false;
/**
* Sets the lock state of the device. The permission {@code ADD_ALWAYS_UNLOCKED_DISPLAY}
@@ -248,53 +287,53 @@
}
/**
- * Sets the activities allowed to be launched in the virtual device. If
- * {@code allowedActivities} is non-null, all activities other than the ones in the set will
- * be blocked from launching.
+ * Sets the activities allowed to be launched in the virtual device. Calling this method
+ * will cause {@link #getDefaultActivityPolicy()} to be
+ * {@link #ACTIVITY_POLICY_DEFAULT_BLOCKED}, meaning activities not in
+ * {@code allowedActivities} will be blocked from launching here.
*
- * <p>{@code allowedActivities} and the set in {@link #setBlockedActivities(Set)} cannot
- * both be non-null at the same time.
+ * <p>This method must not be called if {@link #setBlockedActivities(Set)} has been called.
*
- * @throws IllegalArgumentException if {@link #setBlockedActivities(Set)} has been set to a
- * non-null value.
+ * @throws IllegalArgumentException if {@link #setBlockedActivities(Set)} has been called.
*
* @param allowedActivities A set of activity {@link ComponentName} allowed to be launched
* in the virtual device.
*/
- // Null and empty have different semantics - Null allows all activities to be streamed
- @SuppressLint("NullableCollection")
@NonNull
- public Builder setAllowedActivities(@Nullable Set<ComponentName> allowedActivities) {
- if (mBlockedActivities != null && allowedActivities != null) {
+ public Builder setAllowedActivities(@NonNull Set<ComponentName> allowedActivities) {
+ if (mDefaultActivityPolicyConfigured
+ && mDefaultActivityPolicy != ACTIVITY_POLICY_DEFAULT_BLOCKED) {
throw new IllegalArgumentException(
"Allowed activities and Blocked activities cannot both be set.");
}
+ mDefaultActivityPolicy = ACTIVITY_POLICY_DEFAULT_BLOCKED;
+ mDefaultActivityPolicyConfigured = true;
mAllowedActivities = allowedActivities;
return this;
}
/**
- * Sets the activities blocked from launching in the virtual device. If the {@code
- * blockedActivities} is non-null, activities in the set are blocked from launching in the
- * virtual device.
+ * Sets the activities blocked from launching in the virtual device. Calling this method
+ * will cause {@link #getDefaultActivityPolicy()} to be
+ * {@link #ACTIVITY_POLICY_DEFAULT_ALLOWED}, meaning activities are allowed to launch here
+ * unless they are in {@code blockedActivities}.
*
- * {@code blockedActivities} and the set in {@link #setAllowedActivities(Set)} cannot both
- * be non-null at the same time.
+ * <p>This method must not be called if {@link #setAllowedActivities(Set)} has been called.
*
- * @throws IllegalArgumentException if {@link #setAllowedActivities(Set)} has been set to a
- * non-null value.
+ * @throws IllegalArgumentException if {@link #setAllowedActivities(Set)} has been called.
*
* @param blockedActivities A set of {@link ComponentName} to be blocked launching from
* virtual device.
*/
- // Allowing null to enforce that at most one of allowed / blocked activities can be non-null
- @SuppressLint("NullableCollection")
@NonNull
- public Builder setBlockedActivities(@Nullable Set<ComponentName> blockedActivities) {
- if (mAllowedActivities != null && blockedActivities != null) {
+ public Builder setBlockedActivities(@NonNull Set<ComponentName> blockedActivities) {
+ if (mDefaultActivityPolicyConfigured
+ && mDefaultActivityPolicy != ACTIVITY_POLICY_DEFAULT_ALLOWED) {
throw new IllegalArgumentException(
"Allowed activities and Blocked activities cannot both be set.");
}
+ mDefaultActivityPolicy = ACTIVITY_POLICY_DEFAULT_ALLOWED;
+ mDefaultActivityPolicyConfigured = true;
mBlockedActivities = blockedActivities;
return this;
}
@@ -307,13 +346,12 @@
if (mUsersWithMatchingAccounts == null) {
mUsersWithMatchingAccounts = Collections.emptySet();
}
- if (mAllowedActivities != null && mBlockedActivities != null) {
- // Should never reach here because the setters block this as well.
- throw new IllegalStateException(
- "Allowed activities and Blocked activities cannot both be set.");
- }
- return new VirtualDeviceParams(mLockState, mUsersWithMatchingAccounts,
- mAllowedActivities, mBlockedActivities);
+ return new VirtualDeviceParams(
+ mLockState,
+ mUsersWithMatchingAccounts,
+ mAllowedActivities,
+ mBlockedActivities,
+ mDefaultActivityPolicy);
}
}
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 8f82a0a..2bda020 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3571,11 +3571,11 @@
* <li>{@link #BIND_INCLUDE_CAPABILITIES}
* </ul>
*
- * @return {@code true} if the system is in the process of bringing up a
- * service that your client has permission to bind to; {@code false}
- * if the system couldn't find the service or if your client doesn't
- * have permission to bind to it. You should call {@link #unbindService}
- * to release the connection even if this method returned {@code false}.
+ * @return {@code true} if the system is in the process of bringing up a
+ * service that your client has permission to bind to; {@code false}
+ * if the system couldn't find the service or if your client doesn't
+ * have permission to bind to it. Regardless of the return value, you
+ * should later call {@link #unbindService} to release the connection.
*
* @throws SecurityException If the caller does not have permission to
* access the service or the service cannot be found. Call
@@ -3589,10 +3589,16 @@
@NonNull ServiceConnection conn, @BindServiceFlags int flags);
/**
- * Same as {@link #bindService(Intent, ServiceConnection, int)} with executor to control
- * ServiceConnection callbacks.
+ * Same as {@link #bindService(Intent, ServiceConnection, int)
+ * bindService(Intent, ServiceConnection, int)} with executor to control ServiceConnection
+ * callbacks.
+ *
* @param executor Callbacks on ServiceConnection will be called on executor. Must use same
* instance for the same instance of ServiceConnection.
+ *
+ * @return The result of the binding as described in
+ * {@link #bindService(Intent, ServiceConnection, int)
+ * bindService(Intent, ServiceConnection, int)}.
*/
public boolean bindService(@RequiresPermission @NonNull Intent service,
@BindServiceFlags int flags, @NonNull @CallbackExecutor Executor executor,
@@ -3618,12 +3624,13 @@
* @param instanceName Unique identifier for the service instance. Each unique
* name here will result in a different service instance being created. Identifiers
* must only contain ASCII letters, digits, underscores, and periods.
- * @return Returns success of binding as per {@link #bindService}.
* @param executor Callbacks on ServiceConnection will be called on executor.
* Must use same instance for the same instance of ServiceConnection.
* @param conn Receives information as the service is started and stopped.
* This must be a valid ServiceConnection object; it must not be null.
*
+ * @return Returns success of binding as per {@link #bindService}.
+ *
* @throws SecurityException If the caller does not have permission to access the service
* @throws IllegalArgumentException If the instanceName is invalid.
*
@@ -3638,8 +3645,7 @@
}
/**
- * Binds to a service in the given {@code user} in the same manner as
- * {@link #bindService(Intent, ServiceConnection, int)}.
+ * Binds to a service in the given {@code user} in the same manner as {@link #bindService}.
*
* <p>Requires that one of the following conditions are met:
* <ul>
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 0aa25ef..478befd 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2054,7 +2054,7 @@
"android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD";
/**
- * Activity action: Launch the Safety Hub UI.
+ * Activity action: Launch the Safety Center Quick Settings UI.
*
* <p>
* Input: Nothing.
@@ -2062,11 +2062,14 @@
* <p>
* Output: Nothing.
* </p>
+ *
+ * @hide
*/
+ @SystemApi
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY)
- public static final String ACTION_VIEW_SAFETY_HUB =
- "android.intent.action.VIEW_SAFETY_HUB";
+ public static final String ACTION_VIEW_SAFETY_CENTER_QS =
+ "android.intent.action.VIEW_SAFETY_CENTER_QS";
/**
* Activity action: Launch UI to manage a default app.
diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index a3cc01c..0460e58 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -136,9 +136,9 @@
public static final int OTHER = SensorPrivacyToggleSourceProto.OTHER;
/**
- * Constant for SAFETY_HUB.
+ * Constant for SAFETY_CENTER.
*/
- public static final int SAFETY_HUB = SensorPrivacyToggleSourceProto.SAFETY_HUB;
+ public static final int SAFETY_CENTER = SensorPrivacyToggleSourceProto.SAFETY_CENTER;
/**
* Source for toggling sensors
@@ -151,7 +151,7 @@
DIALOG,
SHELL,
OTHER,
- SAFETY_HUB
+ SAFETY_CENTER
})
@Retention(RetentionPolicy.SOURCE)
public @interface Source {}
@@ -652,7 +652,7 @@
String packageName = mContext.getOpPackageName();
if (Objects.equals(packageName,
mContext.getPackageManager().getPermissionControllerPackageName())) {
- return Sources.SAFETY_HUB;
+ return Sources.SAFETY_CENTER;
}
return Sources.OTHER;
}
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 944b717..a3b836a 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -674,10 +674,12 @@
}
try {
if (!rs.allocateSpaceForUpdate(packageFile)) {
+ rs.clearBcb();
throw new IOException("Failed to allocate space for update "
+ packageFile.getAbsolutePath());
}
} catch (RemoteException e) {
+ rs.clearBcb();
e.rethrowAsRuntimeException();
}
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index 87f4489..afd1283 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -407,6 +407,13 @@
public static final String NAMESPACE_SCHEDULER = "scheduler";
/**
+ * Namespace for all SdkSandbox related features.
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_SDK_SANDBOX = "sdk_sandbox";
+
+ /**
* Namespace for settings statistics features.
*
* @hide
@@ -586,7 +593,7 @@
@NonNull
private static final List<String> PUBLIC_NAMESPACES =
Arrays.asList(NAMESPACE_TEXTCLASSIFIER, NAMESPACE_RUNTIME, NAMESPACE_STATSD_JAVA,
- NAMESPACE_STATSD_JAVA_BOOT, NAMESPACE_SELECTION_TOOLBAR);
+ NAMESPACE_STATSD_JAVA_BOOT, NAMESPACE_SELECTION_TOOLBAR, NAMESPACE_AUTOFILL);
/**
* Privacy related properties definitions.
*
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 528156f..8feff16 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9948,6 +9948,14 @@
public static final String LOCKSCREEN_SHOW_CONTROLS = "lockscreen_show_controls";
/**
+ * Whether trivial home controls can be used without authentication
+ *
+ * @hide
+ */
+ public static final String LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS =
+ "lockscreen_allow_trivial_controls";
+
+ /**
* Whether wallet should be accessible from the lockscreen
*
* @hide
@@ -9963,6 +9971,13 @@
"lockscreen_use_double_line_clock";
/**
+ * Whether to show the vibrate icon in the Status Bar (default off)
+ *
+ * @hide
+ */
+ public static final String STATUS_BAR_SHOW_VIBRATE_ICON = "status_bar_show_vibrate_icon";
+
+ /**
* Specifies whether the web action API is enabled.
*
* @hide
diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java
index 542de3f..c1fcd66 100644
--- a/core/java/android/telephony/TelephonyRegistryManager.java
+++ b/core/java/android/telephony/TelephonyRegistryManager.java
@@ -239,8 +239,10 @@
* @param events Events
* @param notifyNow Whether to notify instantly
*/
- public void listenFromListener(int subId, @NonNull String pkg, @NonNull String featureId,
- @NonNull PhoneStateListener listener, @NonNull int events, boolean notifyNow) {
+ public void listenFromListener(int subId, @NonNull boolean renounceFineLocationAccess,
+ @NonNull boolean renounceCoarseLocationAccess, @NonNull String pkg,
+ @NonNull String featureId, @NonNull PhoneStateListener listener,
+ @NonNull int events, boolean notifyNow) {
if (listener == null) {
throw new IllegalStateException("telephony service is null.");
}
@@ -257,8 +259,8 @@
} else if (listener.mSubId != null) {
subId = listener.mSubId;
}
- sRegistry.listenWithEventList(false, false, subId, pkg, featureId,
- listener.callback, eventsList, notifyNow);
+ sRegistry.listenWithEventList(renounceFineLocationAccess, renounceCoarseLocationAccess,
+ subId, pkg, featureId, listener.callback, eventsList, notifyNow);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 632af23..64f5668 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -248,6 +248,7 @@
private static native void nativeSetFixedTransformHint(long transactionObj, long nativeObject,
int transformHint);
+ private static native void nativeRemoveCurrentInputFocus(long nativeObject, int displayId);
private static native void nativeSetFocusedWindow(long transactionObj, IBinder toToken,
String windowName, IBinder focusedToken, String focusedWindowName, int displayId);
private static native void nativeSetFrameTimelineVsync(long transactionObj,
@@ -264,6 +265,8 @@
private static native void nativeAddTransactionCommittedListener(long nativeObject,
TransactionCommittedListener listener);
private static native void nativeSanitize(long transactionObject);
+ private static native void nativeSetDestinationFrame(long transactionObj, long nativeObject,
+ int l, int t, int r, int b);
/**
* Transforms that can be applied to buffers as they are displayed to a window.
@@ -3657,6 +3660,17 @@
}
/**
+ * Removes the input focus from the current window which is having the input focus. Should
+ * only be called when the current focused app is not responding and the current focused
+ * window is not beloged to the current focused app.
+ * @hide
+ */
+ public Transaction removeCurrentInputFocus(int displayId) {
+ nativeRemoveCurrentInputFocus(mNativeObject, displayId);
+ return this;
+ }
+
+ /**
* Adds or removes the flag SKIP_SCREENSHOT of the surface. Setting the flag is equivalent
* to creating the Surface with the {@link #SKIP_SCREENSHOT} flag.
*
@@ -3838,6 +3852,26 @@
}
/**
+ * @hide
+ */
+ public Transaction setDesintationFrame(SurfaceControl sc, @NonNull Rect destinationFrame) {
+ checkPreconditions(sc);
+ nativeSetDestinationFrame(mNativeObject, sc.mNativeObject,
+ destinationFrame.left, destinationFrame.top, destinationFrame.right,
+ destinationFrame.bottom);
+ return this;
+ }
+
+ /**
+ * @hide
+ */
+ public Transaction setDesintationFrame(SurfaceControl sc, int width, int height) {
+ checkPreconditions(sc);
+ nativeSetDestinationFrame(mNativeObject, sc.mNativeObject, 0, 0, width, height);
+ return this;
+ }
+
+ /**
* Merge the other transaction into this transaction, clearing the
* other transaction as if it had been applied.
*
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 1a458ce..55300b3 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -133,9 +133,8 @@
private boolean mDisableBackgroundLayer = false;
/**
- * We use this lock to protect access to mSurfaceControl and
- * SurfaceViewPositionUpdateListener#mPositionChangedTransaction. Both are accessed on the UI
- * thread and the render thread.
+ * We use this lock to protect access to mSurfaceControl. Both are accessed on the UI
+ * thread and the render thread via RenderNode.PositionUpdateListener#positionLost.
*/
final Object mSurfaceControlLock = new Object();
final Rect mTmpRect = new Rect();
@@ -224,12 +223,6 @@
private final SurfaceControl.Transaction mFrameCallbackTransaction =
new SurfaceControl.Transaction();
- /**
- * A temporary transaction holder that should only be used when applying right away. There
- * should be no assumption about thread safety for this transaction.
- */
- private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
-
private int mParentSurfaceSequenceId;
private RemoteAccessibilityController mRemoteAccessibilityController =
@@ -760,7 +753,7 @@
mBlastBufferQueue = null;
}
- Transaction transaction = new Transaction();
+ final Transaction transaction = new Transaction();
if (mSurfaceControl != null) {
transaction.remove(mSurfaceControl);
mSurfaceControl = null;
@@ -790,22 +783,18 @@
// synchronously otherwise we may see flickers.
// When the listener is updated, we will get at least a single position update call so we can
// guarantee any changes we post will be applied.
- private void replacePositionUpdateListener(int surfaceWidth, int surfaceHeight,
- Transaction geometryTransaction) {
+ private void replacePositionUpdateListener(int surfaceWidth, int surfaceHeight) {
if (mPositionListener != null) {
mRenderNode.removePositionUpdateListener(mPositionListener);
- synchronized (mSurfaceControlLock) {
- geometryTransaction = mPositionListener.getTransaction().merge(geometryTransaction);
- }
}
mPositionListener = new SurfaceViewPositionUpdateListener(surfaceWidth, surfaceHeight,
- geometryTransaction);
+ mSurfaceControl);
mRenderNode.addPositionUpdateListener(mPositionListener);
}
private boolean performSurfaceTransaction(ViewRootImpl viewRoot, Translator translator,
boolean creating, boolean sizeChanged, boolean hintChanged,
- Transaction geometryTransaction) {
+ Transaction surfaceUpdateTransaction) {
boolean realSizeChanged = false;
mSurfaceLock.lock();
@@ -820,56 +809,60 @@
// SurfaceChangedCallback to update the relative z. This is needed so that
// we do not change the relative z before the server is ready to swap the
// parent surface.
- if (creating || (mParentSurfaceSequenceId == viewRoot.getSurfaceSequenceId())) {
- updateRelativeZ(mTmpTransaction);
+ if (creating) {
+ updateRelativeZ(surfaceUpdateTransaction);
+ if (mSurfacePackage != null) {
+ reparentSurfacePackage(surfaceUpdateTransaction, mSurfacePackage);
+ }
}
mParentSurfaceSequenceId = viewRoot.getSurfaceSequenceId();
if (mViewVisibility) {
- geometryTransaction.show(mSurfaceControl);
+ surfaceUpdateTransaction.show(mSurfaceControl);
} else {
- geometryTransaction.hide(mSurfaceControl);
+ surfaceUpdateTransaction.hide(mSurfaceControl);
}
- if (mSurfacePackage != null) {
- reparentSurfacePackage(mTmpTransaction, mSurfacePackage);
- }
- updateBackgroundVisibility(mTmpTransaction);
- updateBackgroundColor(mTmpTransaction);
+
+ updateBackgroundVisibility(surfaceUpdateTransaction);
+ updateBackgroundColor(surfaceUpdateTransaction);
if (mUseAlpha) {
float alpha = getFixedAlpha();
- mTmpTransaction.setAlpha(mSurfaceControl, alpha);
+ surfaceUpdateTransaction.setAlpha(mSurfaceControl, alpha);
mSurfaceAlpha = alpha;
}
- geometryTransaction.setCornerRadius(mSurfaceControl, mCornerRadius);
+ surfaceUpdateTransaction.setCornerRadius(mSurfaceControl, mCornerRadius);
if ((sizeChanged || hintChanged) && !creating) {
- setBufferSize(geometryTransaction);
+ setBufferSize(surfaceUpdateTransaction);
}
if (sizeChanged || creating || !isHardwareAccelerated()) {
- onSetSurfacePositionAndScaleRT(geometryTransaction, mSurfaceControl,
- mScreenRect.left, /*positionLeft*/
- mScreenRect.top /*positionTop*/ ,
- mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/,
- mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/);
// Set a window crop when creating the surface or changing its size to
// crop the buffer to the surface size since the buffer producer may
// use SCALING_MODE_SCALE and submit a larger size than the surface
// size.
if (mClipSurfaceToBounds && mClipBounds != null) {
- geometryTransaction.setWindowCrop(mSurfaceControl, mClipBounds);
+ surfaceUpdateTransaction.setWindowCrop(mSurfaceControl, mClipBounds);
} else {
- geometryTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth,
+ surfaceUpdateTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth,
mSurfaceHeight);
}
+ surfaceUpdateTransaction.setDesintationFrame(mBlastSurfaceControl, mSurfaceWidth,
+ mSurfaceHeight);
+
if (isHardwareAccelerated()) {
// This will consume the passed in transaction and the transaction will be
// applied on a render worker thread.
- replacePositionUpdateListener(mSurfaceWidth, mSurfaceHeight,
- geometryTransaction);
+ replacePositionUpdateListener(mSurfaceWidth, mSurfaceHeight);
+ } else {
+ onSetSurfacePositionAndScale(surfaceUpdateTransaction, mSurfaceControl,
+ mScreenRect.left /*positionLeft*/,
+ mScreenRect.top /*positionTop*/,
+ mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/,
+ mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/);
}
if (DEBUG_POSITION) {
Log.d(TAG, String.format(
@@ -881,8 +874,7 @@
mScreenRect.bottom, mSurfaceWidth, mSurfaceHeight));
}
}
- mTmpTransaction.merge(geometryTransaction);
- mTmpTransaction.apply();
+ applyTransactionOnVriDraw(surfaceUpdateTransaction);
updateEmbeddedAccessibilityMatrix();
mSurfaceFrame.left = 0;
@@ -990,17 +982,17 @@
mScreenRect.offset(surfaceInsets.left, surfaceInsets.top);
// Collect all geometry changes and apply these changes on the RenderThread worker
// via the RenderNode.PositionUpdateListener.
- final Transaction geometryTransaction = new Transaction();
+ final Transaction surfaceUpdateTransaction = new Transaction();
if (creating) {
updateOpaqueFlag();
final String name = "SurfaceView[" + viewRoot.getTitle().toString() + "]";
- createBlastSurfaceControls(viewRoot, name, geometryTransaction);
+ createBlastSurfaceControls(viewRoot, name, surfaceUpdateTransaction);
} else if (mSurfaceControl == null) {
return;
}
final boolean realSizeChanged = performSurfaceTransaction(viewRoot,
- translator, creating, sizeChanged, hintChanged, geometryTransaction);
+ translator, creating, sizeChanged, hintChanged, surfaceUpdateTransaction);
final boolean redrawNeeded = sizeChanged || creating || hintChanged
|| (mVisible && !mDrawFinished);
@@ -1107,7 +1099,7 @@
mBlastSurfaceControl.setTransformHint(mTransformHint);
if (mBlastBufferQueue != null) {
mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight,
- mFormat, transaction);
+ mFormat);
}
}
@@ -1136,7 +1128,7 @@
*
*/
private void createBlastSurfaceControls(ViewRootImpl viewRoot, String name,
- Transaction geometryTransaction) {
+ Transaction surfaceUpdateTransaction) {
if (mSurfaceControl == null) {
mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
.setName(name)
@@ -1159,11 +1151,10 @@
.build();
} else {
// update blast layer
- mTmpTransaction
+ surfaceUpdateTransaction
.setOpaque(mBlastSurfaceControl, (mSurfaceFlags & SurfaceControl.OPAQUE) != 0)
.setSecure(mBlastSurfaceControl, (mSurfaceFlags & SurfaceControl.SECURE) != 0)
- .show(mBlastSurfaceControl)
- .apply();
+ .show(mBlastSurfaceControl);
}
if (mBackgroundControl == null) {
@@ -1184,9 +1175,8 @@
}
mTransformHint = viewRoot.getBufferTransformHint();
mBlastSurfaceControl.setTransformHint(mTransformHint);
- mBlastBufferQueue = new BLASTBufferQueue(name);
- mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat,
- geometryTransaction);
+ mBlastBufferQueue = new BLASTBufferQueue(name, false /* updateDestinationFrame */);
+ mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat);
}
private void onDrawFinished(Transaction t) {
@@ -1211,7 +1201,7 @@
*
* @hide
*/
- protected void onSetSurfacePositionAndScaleRT(@NonNull Transaction transaction,
+ protected void onSetSurfacePositionAndScale(@NonNull Transaction transaction,
@NonNull SurfaceControl surface, int positionLeft, int positionTop,
float postScaleX, float postScaleY) {
transaction.setPosition(surface, positionLeft, positionTop);
@@ -1224,12 +1214,14 @@
if (mSurfaceControl == null) {
return;
}
- onSetSurfacePositionAndScaleRT(mTmpTransaction, mSurfaceControl,
+ final Transaction transaction = new Transaction();
+ onSetSurfacePositionAndScale(transaction, mSurfaceControl,
mScreenRect.left, /*positionLeft*/
mScreenRect.top/*positionTop*/ ,
mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/,
mScreenRect.height() / (float) mSurfaceHeight /*postScaleY*/);
- mTmpTransaction.apply();
+ applyTransactionOnVriDraw(transaction);
+ invalidate();
}
/**
@@ -1251,66 +1243,57 @@
}
}
- private Rect mRTLastReportedPosition = new Rect();
- private Point mRTLastReportedSurfaceSize = new Point();
+ private final Rect mRTLastReportedPosition = new Rect();
+ private final Point mRTLastReportedSurfaceSize = new Point();
private class SurfaceViewPositionUpdateListener implements RenderNode.PositionUpdateListener {
- int mRtSurfaceWidth = -1;
- int mRtSurfaceHeight = -1;
+ private final int mRtSurfaceWidth;
+ private final int mRtSurfaceHeight;
private final SurfaceControl.Transaction mPositionChangedTransaction =
new SurfaceControl.Transaction();
- boolean mPendingTransaction = false;
+ private final SurfaceControl mRtSurfaceControl = new SurfaceControl();
SurfaceViewPositionUpdateListener(int surfaceWidth, int surfaceHeight,
- @Nullable Transaction t) {
+ SurfaceControl surfaceControl) {
mRtSurfaceWidth = surfaceWidth;
mRtSurfaceHeight = surfaceHeight;
- if (t != null) {
- mPositionChangedTransaction.merge(t);
- mPendingTransaction = true;
- }
+ mRtSurfaceControl.copyFrom(surfaceControl, "SurfaceViewPositionUpdateListener");
}
@Override
public void positionChanged(long frameNumber, int left, int top, int right, int bottom) {
- synchronized(mSurfaceControlLock) {
- if (mSurfaceControl == null) {
- return;
+ if (mRTLastReportedPosition.left == left
+ && mRTLastReportedPosition.top == top
+ && mRTLastReportedPosition.right == right
+ && mRTLastReportedPosition.bottom == bottom
+ && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth
+ && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight) {
+ return;
+ }
+ try {
+ if (DEBUG_POSITION) {
+ Log.d(TAG, String.format(
+ "%d updateSurfacePosition RenderWorker, frameNr = %d, "
+ + "position = [%d, %d, %d, %d] surfaceSize = %dx%d",
+ System.identityHashCode(SurfaceView.this), frameNumber,
+ left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight));
}
- if (mRTLastReportedPosition.left == left
- && mRTLastReportedPosition.top == top
- && mRTLastReportedPosition.right == right
- && mRTLastReportedPosition.bottom == bottom
- && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth
- && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight
- && !mPendingTransaction) {
- return;
+ mRTLastReportedPosition.set(left, top, right, bottom);
+ mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight);
+ onSetSurfacePositionAndScale(mPositionChangedTransaction, mRtSurfaceControl,
+ mRTLastReportedPosition.left /*positionLeft*/,
+ mRTLastReportedPosition.top /*positionTop*/,
+ mRTLastReportedPosition.width()
+ / (float) mRtSurfaceWidth /*postScaleX*/,
+ mRTLastReportedPosition.height()
+ / (float) mRtSurfaceHeight /*postScaleY*/);
+ if (mViewVisibility) {
+ // b/131239825
+ mPositionChangedTransaction.show(mRtSurfaceControl);
}
- try {
- if (DEBUG_POSITION) {
- Log.d(TAG, String.format(
- "%d updateSurfacePosition RenderWorker, frameNr = %d, "
- + "position = [%d, %d, %d, %d] surfaceSize = %dx%d",
- System.identityHashCode(SurfaceView.this), frameNumber,
- left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight));
- }
- mRTLastReportedPosition.set(left, top, right, bottom);
- mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight);
- onSetSurfacePositionAndScaleRT(mPositionChangedTransaction, mSurfaceControl,
- mRTLastReportedPosition.left /*positionLeft*/,
- mRTLastReportedPosition.top /*positionTop*/,
- mRTLastReportedPosition.width()
- / (float) mRtSurfaceWidth /*postScaleX*/,
- mRTLastReportedPosition.height()
- / (float) mRtSurfaceHeight /*postScaleY*/);
- if (mViewVisibility) {
- mPositionChangedTransaction.show(mSurfaceControl);
- }
- applyOrMergeTransaction(mPositionChangedTransaction, frameNumber);
- mPendingTransaction = false;
- } catch (Exception ex) {
- Log.e(TAG, "Exception from repositionChild", ex);
- }
+ applyOrMergeTransaction(mPositionChangedTransaction, frameNumber);
+ } catch (Exception ex) {
+ Log.e(TAG, "Exception from repositionChild", ex);
}
}
@@ -1319,7 +1302,7 @@
float vecX, float vecY, float maxStretchX, float maxStretchY,
float childRelativeLeft, float childRelativeTop, float childRelativeRight,
float childRelativeBottom) {
- mRtTransaction.setStretchEffect(mSurfaceControl, width, height, vecX, vecY,
+ mRtTransaction.setStretchEffect(mRtSurfaceControl, width, height, vecX, vecY,
maxStretchX, maxStretchY, childRelativeLeft, childRelativeTop,
childRelativeRight, childRelativeBottom);
applyOrMergeTransaction(mRtTransaction, frameNumber);
@@ -1334,28 +1317,14 @@
mRTLastReportedPosition.setEmpty();
mRTLastReportedSurfaceSize.set(-1, -1);
- /**
- * positionLost can be called while UI thread is un-paused so we
- * need to hold the lock here.
- */
+ // positionLost can be called while UI thread is un-paused.
synchronized (mSurfaceControlLock) {
- if (mPendingTransaction) {
- Log.w(TAG, System.identityHashCode(SurfaceView.this)
- + "Pending transaction cleared.");
- mPositionChangedTransaction.clear();
- mPendingTransaction = false;
- }
- if (mSurfaceControl == null) {
- return;
- }
+ if (mSurfaceControl == null) return;
+ // b/131239825
mRtTransaction.hide(mSurfaceControl);
applyOrMergeTransaction(mRtTransaction, frameNumber);
}
}
-
- public Transaction getTransaction() {
- return mPositionChangedTransaction;
- }
}
private SurfaceViewPositionUpdateListener mPositionListener = null;
@@ -1402,8 +1371,10 @@
* @hide
*/
public void setResizeBackgroundColor(int bgColor) {
- setResizeBackgroundColor(mTmpTransaction, bgColor);
- mTmpTransaction.apply();
+ final SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
+ setResizeBackgroundColor(transaction, bgColor);
+ applyTransactionOnVriDraw(transaction);
+ invalidate();
}
/**
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 1566f9e..785735c 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -184,6 +184,7 @@
*/
public static final String DEBUG_FORCE_DARK = "debug.hwui.force_dark";
+ public static int EGL_CONTEXT_PRIORITY_REALTIME_NV = 0x3357;
public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101;
public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102;
public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 34a1386..553c537 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -8226,9 +8226,25 @@
*/
public void setAccessibilityPaneTitle(@Nullable CharSequence accessibilityPaneTitle) {
if (!TextUtils.equals(accessibilityPaneTitle, mAccessibilityPaneTitle)) {
+ boolean currentPaneTitleEmpty = mAccessibilityPaneTitle == null;
+ boolean newPaneTitleEmpty = accessibilityPaneTitle == null;
mAccessibilityPaneTitle = accessibilityPaneTitle;
- notifyViewAccessibilityStateChangedIfNeeded(
- AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE);
+ // Make explicitly important as nulled titles need to be important for DISAPPEARED
+ // events.
+ if (mAccessibilityPaneTitle != null
+ && getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+ if (currentPaneTitleEmpty) {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED);
+ } else if (newPaneTitleEmpty) {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED);
+ } else {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE);
+ }
}
}
@@ -14168,9 +14184,12 @@
}
// Changes to views with a pane title count as window state changes, as the pane title
- // marks them as significant parts of the UI.
+ // marks them as significant parts of the UI. A visible view with a nulled title may send
+ // a disappeared event.
if ((changeType != AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE)
- && isAccessibilityPane()) {
+ && (isAccessibilityPane()
+ || (changeType == AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED)
+ && isAggregatedVisible())) {
// If the pane isn't visible, content changed events are sufficient unless we're
// reporting that the view just disappeared
if ((isAggregatedVisible())
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index cd8dd86..7e16531 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -592,6 +592,11 @@
/**
* Change type for {@link #TYPE_WINDOW_STATE_CHANGED} event:
* The node's pane title changed.
+ * <p>
+ * If this makes the pane appear, {@link #CONTENT_CHANGE_TYPE_PANE_APPEARED} is sent
+ * instead. If this makes the pane disappear, {@link #CONTENT_CHANGE_TYPE_PANE_DISAPPEARED}
+ * is sent.
+ *
*/
public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 0x00000008;
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index b7994db..a8cc114 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -58,6 +58,7 @@
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.provider.DeviceConfig;
import android.service.autofill.AutofillService;
import android.service.autofill.FillCallback;
import android.service.autofill.FillEventHistory;
@@ -491,6 +492,15 @@
public static final String DEVICE_CONFIG_AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES =
"compat_mode_allowed_packages";
+ /**
+ * Sets the fill dialog feature enabled or not.
+ *
+ * @hide
+ */
+ @TestApi
+ public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED =
+ "autofill_dialog_enabled";
+
/** @hide */
public static final int RESULT_OK = 0;
/** @hide */
@@ -539,7 +549,7 @@
*/
public static final int NO_SESSION = Integer.MAX_VALUE;
- private static final boolean HAS_FILL_DIALOG_UI_FEATURE = false;
+ private static final boolean HAS_FILL_DIALOG_UI_FEATURE_DEFAULT = false;
private final IAutoFillManager mService;
@@ -655,6 +665,8 @@
@Nullable private List<AutofillId> mFillDialogTriggerIds;
+ private final boolean mIsFillDialogEnabled;
+
/** @hide */
public interface AutofillClient {
/**
@@ -795,6 +807,14 @@
mIsFillRequested = false;
mRequireAutofill = false;
+ mIsFillDialogEnabled = DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_AUTOFILL,
+ DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED,
+ HAS_FILL_DIALOG_UI_FEATURE_DEFAULT);
+ if (sDebug) {
+ Log.d(TAG, "Fill dialog is enabled:" + mIsFillDialogEnabled);
+ }
+
if (mOptions != null) {
sDebug = (mOptions.loggingLevel & FLAG_ADD_CLIENT_DEBUG) != 0;
sVerbose = (mOptions.loggingLevel & FLAG_ADD_CLIENT_VERBOSE) != 0;
@@ -1081,7 +1101,7 @@
}
private boolean hasFillDialogUiFeature() {
- return HAS_FILL_DIALOG_UI_FEATURE;
+ return mIsFillDialogEnabled;
}
/**
@@ -3012,6 +3032,7 @@
}
pw.print(pfx); pw.print("compat mode enabled: ");
synchronized (mLock) {
+ pw.print(pfx); pw.print("fill dialog enabled: "); pw.println(mIsFillDialogEnabled);
if (mCompatibilityBridge != null) {
final String pfx2 = pfx + " ";
pw.println("true");
diff --git a/core/java/android/widget/inline/InlineContentView.java b/core/java/android/widget/inline/InlineContentView.java
index 9712311..e4f483a 100644
--- a/core/java/android/widget/inline/InlineContentView.java
+++ b/core/java/android/widget/inline/InlineContentView.java
@@ -230,8 +230,9 @@
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mSurfaceView = new SurfaceView(context, attrs, defStyleAttr, defStyleRes) {
+ // b/219807628
@Override
- protected void onSetSurfacePositionAndScaleRT(
+ protected void onSetSurfacePositionAndScale(
@NonNull SurfaceControl.Transaction transaction,
@NonNull SurfaceControl surface, int positionLeft, int positionTop,
float postScaleX, float postScaleY) {
@@ -248,7 +249,7 @@
postScaleX = InlineContentView.this.getScaleX();
postScaleY = InlineContentView.this.getScaleY();
- super.onSetSurfacePositionAndScaleRT(transaction, surface, positionLeft,
+ super.onSetSurfacePositionAndScale(transaction, surface, positionLeft,
positionTop, postScaleX, postScaleY);
}
};
diff --git a/core/java/android/window/ProxyOnBackInvokedDispatcher.java b/core/java/android/window/ProxyOnBackInvokedDispatcher.java
index 4de977a..cdbd078 100644
--- a/core/java/android/window/ProxyOnBackInvokedDispatcher.java
+++ b/core/java/android/window/ProxyOnBackInvokedDispatcher.java
@@ -81,6 +81,10 @@
}
synchronized (mLock) {
mCallbacks.removeIf((p) -> p.first.equals(callback));
+ if (mActualDispatcherOwner != null) {
+ mActualDispatcherOwner.getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(
+ callback);
+ }
}
}
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java
index 4745220e..346aa33 100644
--- a/core/java/android/window/WindowContainerTransaction.java
+++ b/core/java/android/window/WindowContainerTransaction.java
@@ -571,6 +571,24 @@
}
/**
+ * If `container` was brought to front as a transient-launch (eg. recents), this will reorder
+ * the container back to where it was prior to the transient-launch. This way if a transient
+ * launch is "aborted", the z-ordering of containers in WM should be restored to before the
+ * launch.
+ * @hide
+ */
+ @NonNull
+ public WindowContainerTransaction restoreTransientOrder(
+ @NonNull WindowContainerToken container) {
+ final HierarchyOp hierarchyOp =
+ new HierarchyOp.Builder(HierarchyOp.HIERARCHY_OP_TYPE_RESTORE_TRANSIENT_ORDER)
+ .setContainer(container.asBinder())
+ .build();
+ mHierarchyOps.add(hierarchyOp);
+ return this;
+ }
+
+ /**
* When this {@link WindowContainerTransaction} failed to finish on the server side, it will
* trigger callback with this {@param errorCallbackToken}.
* @param errorCallbackToken client provided token that will be passed back as parameter in
@@ -974,6 +992,7 @@
public static final int HIERARCHY_OP_TYPE_PENDING_INTENT = 12;
public static final int HIERARCHY_OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS = 13;
public static final int HIERARCHY_OP_TYPE_START_SHORTCUT = 14;
+ public static final int HIERARCHY_OP_TYPE_RESTORE_TRANSIENT_ORDER = 15;
// The following key(s) are for use with mLaunchOptions:
// When launching a task (eg. from recents), this is the taskId to be launched.
diff --git a/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java b/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java
index 615e4b79..a03bac4 100644
--- a/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java
+++ b/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java
@@ -29,22 +29,66 @@
private static final ArrayMap<String, PathClassLoader> sLoadedPaths = new ArrayMap<>();
/**
- * Creates and caches a ClassLoader for the jar at the given path, or returns a cached
- * ClassLoader if it exists.
+ * Creates and caches a ClassLoader for the jar at the given path.
+ *
+ * This method should only be called by ZygoteInit to prefetch jars. For other users, use
+ * {@link getOrCreateClassLoader} instead.
*
* The parent class loader should always be the system server class loader. Changing it has
* implications that require discussion with the mainline team.
*
* @hide for internal use only
*/
- public static PathClassLoader getOrCreateClassLoader(String path, ClassLoader parent) {
- PathClassLoader pathClassLoader = sLoadedPaths.get(path);
- if (pathClassLoader == null) {
- pathClassLoader = (PathClassLoader) ClassLoaderFactory.createClassLoader(
- path, /*librarySearchPath=*/null, /*libraryPermittedPath=*/null, parent,
- Build.VERSION.SDK_INT, /*isNamespaceShared=*/true , /*classLoaderName=*/null);
- sLoadedPaths.put(path, pathClassLoader);
+ /* package */ static PathClassLoader createClassLoader(String path, ClassLoader parent) {
+ if (sLoadedPaths.containsKey(path)) {
+ throw new IllegalStateException("A ClassLoader for " + path + " already exists");
}
+ PathClassLoader pathClassLoader = (PathClassLoader) ClassLoaderFactory.createClassLoader(
+ path, /*librarySearchPath=*/null, /*libraryPermittedPath=*/null, parent,
+ Build.VERSION.SDK_INT, /*isNamespaceShared=*/true , /*classLoaderName=*/null);
+ sLoadedPaths.put(path, pathClassLoader);
return pathClassLoader;
}
+
+ /**
+ * Returns a cached ClassLoader to be used at runtime for the jar at the given path. Or, creates
+ * one if it is not prefetched and is allowed to be created at runtime.
+ *
+ * The parent class loader should always be the system server class loader. Changing it has
+ * implications that require discussion with the mainline team.
+ *
+ * @hide for internal use only
+ */
+ public static PathClassLoader getOrCreateClassLoader(
+ String path, ClassLoader parent, boolean isTestOnly) {
+ PathClassLoader pathClassLoader = sLoadedPaths.get(path);
+ if (pathClassLoader != null) {
+ return pathClassLoader;
+ }
+ if (!allowClassLoaderCreation(path, isTestOnly)) {
+ throw new RuntimeException("Creating a ClassLoader from " + path + " is not allowed. "
+ + "Please make sure that the jar is listed in "
+ + "`PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS` in the Makefile and added as a "
+ + "`standalone_contents` of a `systemserverclasspath_fragment` in "
+ + "`Android.bp`.");
+ }
+ return createClassLoader(path, parent);
+ }
+
+ /**
+ * Returns whether a class loader for the jar is allowed to be created at runtime.
+ */
+ private static boolean allowClassLoaderCreation(String path, boolean isTestOnly) {
+ // Currently, we only enforce prefetching for APEX jars.
+ if (!path.startsWith("/apex/")) {
+ return true;
+ }
+ // APEXes for testing only are okay to ignore.
+ if (isTestOnly) {
+ return true;
+ }
+ return false;
+ }
+
+
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 3d24aa2d..ca1ae19 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -586,7 +586,7 @@
}
for (String jar : envStr.split(":")) {
try {
- SystemServerClassLoaderFactory.getOrCreateClassLoader(
+ SystemServerClassLoaderFactory.createClassLoader(
jar, getOrCreateSystemServerClassLoader());
} catch (Error e) {
// We don't want the process to crash for this error because prefetching is just an
diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp
index 4f13a9c..3be0eb8 100644
--- a/core/jni/android_graphics_BLASTBufferQueue.cpp
+++ b/core/jni/android_graphics_BLASTBufferQueue.cpp
@@ -35,9 +35,10 @@
jmethodID ctor;
} gTransactionClassInfo;
-static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring jName) {
+static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring jName,
+ jboolean updateDestinationFrame) {
ScopedUtfChars name(env, jName);
- sp<BLASTBufferQueue> queue = new BLASTBufferQueue(name.c_str());
+ sp<BLASTBufferQueue> queue = new BLASTBufferQueue(name.c_str(), updateDestinationFrame);
queue->incStrong((void*)nativeCreate);
return reinterpret_cast<jlong>(queue.get());
}
@@ -62,11 +63,9 @@
}
static void nativeUpdate(JNIEnv* env, jclass clazz, jlong ptr, jlong surfaceControl, jlong width,
- jlong height, jint format, jlong transactionPtr) {
+ jlong height, jint format) {
sp<BLASTBufferQueue> queue = reinterpret_cast<BLASTBufferQueue*>(ptr);
- auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionPtr);
- queue->update(reinterpret_cast<SurfaceControl*>(surfaceControl), width, height, format,
- transaction);
+ queue->update(reinterpret_cast<SurfaceControl*>(surfaceControl), width, height, format);
}
static void nativeMergeWithNextTransaction(JNIEnv*, jclass clazz, jlong ptr, jlong transactionPtr,
@@ -102,11 +101,11 @@
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// clang-format off
- {"nativeCreate", "(Ljava/lang/String;)J", (void*)nativeCreate},
+ {"nativeCreate", "(Ljava/lang/String;Z)J", (void*)nativeCreate},
{"nativeGetSurface", "(JZ)Landroid/view/Surface;", (void*)nativeGetSurface},
{"nativeDestroy", "(J)V", (void*)nativeDestroy},
{"nativeSetSyncTransaction", "(JJZ)V", (void*)nativeSetSyncTransaction},
- {"nativeUpdate", "(JJJJIJ)V", (void*)nativeUpdate},
+ {"nativeUpdate", "(JJJJI)V", (void*)nativeUpdate},
{"nativeMergeWithNextTransaction", "(JJJ)V", (void*)nativeMergeWithNextTransaction},
{"nativeGetLastAcquiredFrameNum", "(J)J", (void*)nativeGetLastAcquiredFrameNum},
{"nativeApplyPendingTransactions", "(JJ)V", (void*)nativeApplyPendingTransactions},
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index fb5b5ff..68025a8 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -62,6 +62,7 @@
namespace android {
+using gui::CaptureArgs;
using gui::FocusRequest;
static void doThrowNPE(JNIEnv* env) {
@@ -961,6 +962,14 @@
transaction->sanitize();
}
+static void nativeSetDestinationFrame(JNIEnv* env, jclass clazz, jlong transactionObj,
+ jlong nativeObject, jint l, jint t, jint r, jint b) {
+ auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+ SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
+ Rect crop(l, t, r, b);
+ transaction->setDestinationFrame(ctrl, crop);
+}
+
static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) {
const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
jlongArray array = env->NewLongArray(displayIds.size());
@@ -1833,6 +1842,15 @@
return reinterpret_cast<jlong>(surfaceControl->getHandle().get());
}
+static void nativeRemoveCurrentInputFocus(JNIEnv* env, jclass clazz, jlong transactionObj,
+ jint displayId) {
+ auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+ FocusRequest request;
+ request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
+ request.displayId = displayId;
+ transaction->setFocusedWindow(request);
+}
+
static void nativeSetFocusedWindow(JNIEnv* env, jclass clazz, jlong transactionObj,
jobject toTokenObj, jstring windowNameJstr,
jobject focusedTokenObj, jstring focusedWindowNameJstr,
@@ -2167,6 +2185,8 @@
(void*)nativeSetFixedTransformHint},
{"nativeSetFocusedWindow", "(JLandroid/os/IBinder;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I)V",
(void*)nativeSetFocusedWindow},
+ {"nativeRemoveCurrentInputFocus", "(JI)V",
+ (void*)nativeRemoveCurrentInputFocus},
{"nativeSetFrameTimelineVsync", "(JJ)V",
(void*)nativeSetFrameTimelineVsync },
{"nativeAddJankDataListener", "(JJ)V",
@@ -2190,7 +2210,9 @@
{"nativeAddTransactionCommittedListener", "(JLandroid/view/SurfaceControl$TransactionCommittedListener;)V",
(void*) nativeAddTransactionCommittedListener },
{"nativeSanitize", "(J)V",
- (void*) nativeSanitize }
+ (void*) nativeSanitize },
+ {"nativeSetDestinationFrame", "(JJIIII)V",
+ (void*)nativeSetDestinationFrame },
// clang-format on
};
diff --git a/core/proto/android/hardware/sensorprivacy.proto b/core/proto/android/hardware/sensorprivacy.proto
index 97870a1..9359528 100644
--- a/core/proto/android/hardware/sensorprivacy.proto
+++ b/core/proto/android/hardware/sensorprivacy.proto
@@ -128,7 +128,7 @@
DIALOG = 3;
SHELL = 4;
OTHER = 5;
- SAFETY_HUB = 6;
+ SAFETY_CENTER = 6;
}
// Source for which sensor privacy was toggled.
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 689d37c..da5f899 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3932,12 +3932,12 @@
<!-- Has flag {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_INPUT_METHOD_EDITOR}. -->
<flag name="flagInputMethodEditor" value="0x0008000" />
</attr>
- <!-- Component name of an activity that allows the user to modify
- the settings for this service. This setting cannot be changed at runtime. -->
+ <!-- Fully qualified class name of an activity that allows the user to modify the settings
+ for this service. This setting cannot be changed at runtime. -->
<attr name="settingsActivity" />
- <!-- Component name of {@link android.service.quicksettings.TileService} is associated
- with this accessibility service for one to one mapping. It is used by system settings
- to remind users this accessibility service has a
+ <!-- Fully qualified class name of {@link android.service.quicksettings.TileService} is
+ associated with this accessibility service for one to one mapping. It is used by system
+ settings to remind users this accessibility service has a
{@link android.service.quicksettings.TileService}. -->
<attr name="tileService" format="string" />
<!-- Attribute whether the accessibility service wants to be able to retrieve the
@@ -4026,12 +4026,12 @@
<!-- Html description of the target of accessibility shortcut usage, availability, or
limitations (e.g. isn't supported by all apps). -->
<attr name="htmlDescription" format="reference"/>
- <!-- Component name of an activity that allows the user to modify the settings for this
- target of accessibility shortcut. -->
+ <!-- Fully qualified class name of an activity that allows the user to modify the settings
+ for this target of accessibility shortcut. -->
<attr name="settingsActivity" />
- <!-- Component name of {@link android.service.quicksettings.TileService} is associated
- with this accessibility shortcut target for one to one mapping. It is used by system
- settings to remind users this accessibility service has a
+ <!-- Fully qualified class name of {@link android.service.quicksettings.TileService} is
+ associated with this accessibility shortcut target for one to one mapping. It is used
+ by system settings to remind users this accessibility service has a
{@link android.service.quicksettings.TileService}. -->
<attr name="tileService" format="string" />
<!-- Detailed intro of the target of accessibility shortcut purpose or behavior. -->
diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml
index bccd2b6..29eb0c0 100644
--- a/core/res/res/values/ids.xml
+++ b/core/res/res/values/ids.xml
@@ -62,8 +62,9 @@
<!-- View id for the action of text editor inside of an extracted text
{@link InputMethodService#onCreateExtractTextView IME extract view}. -->
<item type="id" name="inputExtractAction" />
- <!-- View id for the accessories of text editor inside of an extracted text
- {@link InputMethodService#onCreateExtractTextView IME extract view}. -->
+ <!-- View id for the accessories (such as the extracted input action button) of text editor
+ inside of an extracted text {@link InputMethodService#onCreateExtractTextView IME extract
+ view}. This layout must contain the {@link #inputExtractAction}. -->
<item type="id" name="inputExtractAccessories" />
<item type="id" name="selectAll" />
<item type="id" name="cut" />
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 60a3398..e543034 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1291,6 +1291,7 @@
<java-symbol type="array" name="vendor_required_apps_managed_profile" />
<java-symbol type="array" name="vendor_required_apps_managed_device" />
<java-symbol type="array" name="vendor_required_attestation_certificates" />
+ <java-symbol type="string" name="vendor_required_attestation_revocation_list_url" />
<java-symbol type="array" name="vendor_disallowed_apps_managed_user" />
<java-symbol type="array" name="vendor_disallowed_apps_managed_profile" />
<java-symbol type="array" name="vendor_disallowed_apps_managed_device" />
diff --git a/core/res/res/values/vendor_required_attestation_certificates.xml b/core/res/res/values/vendor_required_attestation_certificates.xml
index ce5660f..ff7313e 100644
--- a/core/res/res/values/vendor_required_attestation_certificates.xml
+++ b/core/res/res/values/vendor_required_attestation_certificates.xml
@@ -29,4 +29,10 @@
-->
<string-array translatable="false" name="vendor_required_attestation_certificates">
</string-array>
+
+ <!-- Url to mapping of revoked certificates' hex encoded serial numbers. Example format
+ can be found at:
+ https://developer.android.com/training/articles/security-key-attestation#certificate_status
+ -->
+ <string translatable="false" name="vendor_required_attestation_revocation_list_url"></string>
</resources>
diff --git a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
index f605a00..eebc578 100644
--- a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
+++ b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java
@@ -129,7 +129,7 @@
@Test
public void testTileService() {
assertThat("Tile service is not correct",
- mShortcutInfo.getTileServiceClassName(), is(TILE_SERVICE_NAME));
+ mShortcutInfo.getTileServiceName(), is(TILE_SERVICE_NAME));
}
diff --git a/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java b/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java
index d66cb71..0e09d56 100644
--- a/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java
+++ b/core/tests/coretests/src/android/companion/virtual/audio/VirtualAudioSessionTest.java
@@ -22,6 +22,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.testng.Assert.assertThrows;
@@ -168,7 +169,7 @@
mVirtualAudioSession.onPlaybackConfigChanged(configs);
- verify(mCallback).onPlaybackConfigChanged(configs);
+ verify(mCallback, timeout(2000)).onPlaybackConfigChanged(configs);
}
@Test
@@ -177,6 +178,6 @@
mVirtualAudioSession.onRecordingConfigChanged(configs);
- verify(mCallback).onRecordingConfigChanged(configs);
+ verify(mCallback, timeout(2000)).onRecordingConfigChanged(configs);
}
}
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 1779655..ed89869 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -3793,6 +3793,12 @@
"group": "WM_DEBUG_REMOTE_ANIMATIONS",
"at": "com\/android\/server\/wm\/NonAppWindowAnimationAdapter.java"
},
+ "2001473656": {
+ "message": "App %s is focused, but the window is not ready. Start a transaction to remove focus from the window of non-focused apps.",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_FOCUS_LIGHT",
+ "at": "com\/android\/server\/wm\/InputMonitor.java"
+ },
"2018454757": {
"message": "WS.removeImmediately: %s Already removed...",
"level": "VERBOSE",
diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java
index 2678c79d..369f20f 100644
--- a/graphics/java/android/graphics/BLASTBufferQueue.java
+++ b/graphics/java/android/graphics/BLASTBufferQueue.java
@@ -27,13 +27,13 @@
// Note: This field is accessed by native code.
public long mNativeObject; // BLASTBufferQueue*
- private static native long nativeCreate(String name);
+ private static native long nativeCreate(String name, boolean updateDestinationFrame);
private static native void nativeDestroy(long ptr);
private static native Surface nativeGetSurface(long ptr, boolean includeSurfaceControlHandle);
private static native void nativeSetSyncTransaction(long ptr, long transactionPtr,
boolean acquireSingleBuffer);
private static native void nativeUpdate(long ptr, long surfaceControl, long width, long height,
- int format, long transactionPtr);
+ int format);
private static native void nativeMergeWithNextTransaction(long ptr, long transactionPtr,
long frameNumber);
private static native long nativeGetLastAcquiredFrameNum(long ptr);
@@ -45,12 +45,12 @@
/** Create a new connection with the surface flinger. */
public BLASTBufferQueue(String name, SurfaceControl sc, int width, int height,
@PixelFormat.Format int format) {
- this(name);
+ this(name, false /* updateDestinationFrame */);
update(sc, width, height, format);
}
- public BLASTBufferQueue(String name) {
- mNativeObject = nativeCreate(name);
+ public BLASTBufferQueue(String name, boolean updateDestinationFrame) {
+ mNativeObject = nativeCreate(name, updateDestinationFrame);
}
public void destroy() {
@@ -101,15 +101,9 @@
* @param width The new width for the buffer.
* @param height The new height for the buffer.
* @param format The new format for the buffer.
- * @param t Adds destination frame changes to the passed in transaction.
*/
- public void update(SurfaceControl sc, int width, int height, @PixelFormat.Format int format,
- SurfaceControl.Transaction t) {
- nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format, t.mNativeObject);
- }
-
public void update(SurfaceControl sc, int width, int height, @PixelFormat.Format int format) {
- nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format, 0);
+ nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format);
}
@Override
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 02cdeef..4b367e0 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -1117,6 +1117,7 @@
intent, keyChainServiceConnection, Context.BIND_AUTO_CREATE, user);
}
if (!bindSucceed) {
+ context.unbindService(keyChainServiceConnection);
throw new AssertionError("could not bind to KeyChainService");
}
countDownLatch.await();
diff --git a/location/java/android/location/SatellitePvt.java b/location/java/android/location/SatellitePvt.java
index f140c68..f3e1508 100644
--- a/location/java/android/location/SatellitePvt.java
+++ b/location/java/android/location/SatellitePvt.java
@@ -144,8 +144,8 @@
private final ClockInfo mClockInfo;
private final double mIonoDelayMeters;
private final double mTropoDelayMeters;
- private final long mTimeOfClock;
- private final long mTimeOfEphemeris;
+ private final long mTimeOfClockSeconds;
+ private final long mTimeOfEphemerisSeconds;
private final int mIssueOfDataClock;
private final int mIssueOfDataEphemeris;
@EphemerisSource
@@ -457,8 +457,8 @@
@Nullable ClockInfo clockInfo,
double ionoDelayMeters,
double tropoDelayMeters,
- long timeOfClock,
- long timeOfEphemeris,
+ long timeOfClockSeconds,
+ long timeOfEphemerisSeconds,
int issueOfDataClock,
int issueOfDataEphemeris,
@EphemerisSource int ephemerisSource) {
@@ -468,8 +468,8 @@
mClockInfo = clockInfo;
mIonoDelayMeters = ionoDelayMeters;
mTropoDelayMeters = tropoDelayMeters;
- mTimeOfClock = timeOfClock;
- mTimeOfEphemeris = timeOfEphemeris;
+ mTimeOfClockSeconds = timeOfClockSeconds;
+ mTimeOfEphemerisSeconds = timeOfEphemerisSeconds;
mIssueOfDataClock = issueOfDataClock;
mIssueOfDataEphemeris = issueOfDataEphemeris;
mEphemerisSource = ephemerisSource;
@@ -545,31 +545,31 @@
}
/**
- * Time of Clock.
+ * Time of Clock in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
- * <p>This field is valid if {@link #hasTimeOfClock()} is true.
+ * <p>This field is valid if {@link #hasTimeOfClockSeconds()} is true.
*/
@IntRange(from = 0)
- public long getTimeOfClock() {
- return mTimeOfClock;
+ public long getTimeOfClockSeconds() {
+ return mTimeOfClockSeconds;
}
/**
- * Time of ephemeris.
+ * Time of ephemeris in seconds.
*
* <p>The value is in seconds since GPS epoch, regardless of the constellation.
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
- * <p>This field is valid if {@link #hasTimeOfEphemeris()} is true.
+ * <p>This field is valid if {@link #hasTimeOfEphemerisSeconds()} is true.
*/
@IntRange(from = 0)
- public long getTimeOfEphemeris() {
- return mTimeOfEphemeris;
+ public long getTimeOfEphemerisSeconds() {
+ return mTimeOfEphemerisSeconds;
}
/**
@@ -607,13 +607,13 @@
return (mFlags & HAS_ISSUE_OF_DATA_EPHEMERIS) != 0;
}
- /** Returns {@code true} if {@link #getTimeOfClock()} ()} is valid. */
- public boolean hasTimeOfClock() {
+ /** Returns {@code true} if {@link #getTimeOfClockSeconds()} ()} is valid. */
+ public boolean hasTimeOfClockSeconds() {
return (mFlags & HAS_TIME_OF_CLOCK) != 0;
}
- /** Returns {@code true} if {@link #getTimeOfEphemeris()} is valid. */
- public boolean hasTimeOfEphemeris() {
+ /** Returns {@code true} if {@link #getTimeOfEphemerisSeconds()} is valid. */
+ public boolean hasTimeOfEphemerisSeconds() {
return (mFlags & HAS_TIME_OF_EPHEMERIS) != 0;
}
@@ -671,8 +671,8 @@
parcel.writeParcelable(mClockInfo, flags);
parcel.writeDouble(mIonoDelayMeters);
parcel.writeDouble(mTropoDelayMeters);
- parcel.writeLong(mTimeOfClock);
- parcel.writeLong(mTimeOfEphemeris);
+ parcel.writeLong(mTimeOfClockSeconds);
+ parcel.writeLong(mTimeOfEphemerisSeconds);
parcel.writeInt(mIssueOfDataClock);
parcel.writeInt(mIssueOfDataEphemeris);
parcel.writeInt(mEphemerisSource);
@@ -687,8 +687,8 @@
+ ", ClockInfo=" + mClockInfo
+ ", IonoDelayMeters=" + mIonoDelayMeters
+ ", TropoDelayMeters=" + mTropoDelayMeters
- + ", TimeOfClock=" + mTimeOfClock
- + ", TimeOfEphemeris=" + mTimeOfEphemeris
+ + ", TimeOfClockSeconds=" + mTimeOfClockSeconds
+ + ", TimeOfEphemerisSeconds=" + mTimeOfEphemerisSeconds
+ ", IssueOfDataClock=" + mIssueOfDataClock
+ ", IssueOfDataEphemeris=" + mIssueOfDataEphemeris
+ ", EphemerisSource=" + mEphemerisSource
@@ -709,8 +709,8 @@
@Nullable private ClockInfo mClockInfo;
private double mIonoDelayMeters;
private double mTropoDelayMeters;
- private long mTimeOfClock;
- private long mTimeOfEphemeris;
+ private long mTimeOfClockSeconds;
+ private long mTimeOfEphemerisSeconds;
private int mIssueOfDataClock;
private int mIssueOfDataEphemeris;
@EphemerisSource
@@ -796,13 +796,13 @@
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
- * @param timeOfClock time of clock (seconds)
+ * @param timeOfClockSeconds time of clock (seconds)
* @return builder object
*/
@NonNull
- public Builder setTimeOfClock(@IntRange(from = 0) long timeOfClock) {
- Preconditions.checkArgumentNonnegative(timeOfClock);
- mTimeOfClock = timeOfClock;
+ public Builder setTimeOfClockSeconds(@IntRange(from = 0) long timeOfClockSeconds) {
+ Preconditions.checkArgumentNonnegative(timeOfClockSeconds);
+ mTimeOfClockSeconds = timeOfClockSeconds;
mFlags = (byte) (mFlags | HAS_TIME_OF_CLOCK);
return this;
}
@@ -814,13 +814,13 @@
*
* <p>The value is not encoded as in GPS ICD200 documentation.
*
- * @param timeOfEphemeris time of ephemeris (seconds)
+ * @param timeOfEphemerisSeconds time of ephemeris (seconds)
* @return builder object
*/
@NonNull
- public Builder setTimeOfEphemeris(@IntRange(from = 0) int timeOfEphemeris) {
- Preconditions.checkArgumentNonnegative(timeOfEphemeris);
- mTimeOfEphemeris = timeOfEphemeris;
+ public Builder setTimeOfEphemerisSeconds(@IntRange(from = 0) long timeOfEphemerisSeconds) {
+ Preconditions.checkArgumentNonnegative(timeOfEphemerisSeconds);
+ mTimeOfEphemerisSeconds = timeOfEphemerisSeconds;
mFlags = (byte) (mFlags | HAS_TIME_OF_EPHEMERIS);
return this;
}
@@ -879,7 +879,8 @@
@NonNull
public SatellitePvt build() {
return new SatellitePvt(mFlags, mPositionEcef, mVelocityEcef, mClockInfo,
- mIonoDelayMeters, mTropoDelayMeters, mTimeOfClock, mTimeOfEphemeris,
+ mIonoDelayMeters, mTropoDelayMeters, mTimeOfClockSeconds,
+ mTimeOfEphemerisSeconds,
mIssueOfDataClock, mIssueOfDataEphemeris,
mEphemerisSource);
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 8e35ee96..c7673aa 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -193,8 +193,10 @@
Settings.Secure.NOTIFICATION_BUBBLES,
Settings.Secure.LOCATION_TIME_ZONE_DETECTION_ENABLED,
Settings.Secure.LOCKSCREEN_SHOW_CONTROLS,
+ Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS,
Settings.Secure.LOCKSCREEN_SHOW_WALLET,
Settings.Secure.LOCK_SCREEN_SHOW_QR_CODE_SCANNER,
Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK,
+ Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON
};
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 5f549fd..42aa205 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -152,9 +152,11 @@
VALIDATORS.put(Secure.CONTROLS_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.POWER_MENU_LOCKED_SHOW_CONTENT, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.LOCKSCREEN_SHOW_CONTROLS, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.LOCKSCREEN_SHOW_WALLET, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.LOCK_SCREEN_SHOW_QR_CODE_SCANNER, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(Secure.STATUS_BAR_SHOW_VIBRATE_ICON, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_ALWAYS_ON, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_PICK_UP_GESTURE, BOOLEAN_VALIDATOR);
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 4b1d00b..7f8b2f5 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -154,7 +154,7 @@
<!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked -->
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
- <!-- Needed for WallpaperManager.getWallpaperDimAmount in StatusBar.updateTheme -->
+ <!-- Needed for WallpaperManager.getWallpaperDimAmount in CentralSurfaces.updateTheme -->
<uses-permission android:name="android.permission.SET_WALLPAPER_DIM_AMOUNT"/>
<!-- Wifi Display -->
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
index 0da60f0..74b759f 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
@@ -172,7 +172,7 @@
if (packageName != null && animationAdapter != null) {
try {
ActivityTaskManager.getService().registerRemoteAnimationForNextActivityStart(
- packageName, animationAdapter)
+ packageName, animationAdapter, null /* launchCookie */)
} catch (e: RemoteException) {
Log.w(TAG, "Unable to register the remote animation", e)
}
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index 6352f81..c97ebe8 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -3,7 +3,7 @@
-keep class com.android.systemui.recents.OverviewProxyRecentsImpl
-keep class com.android.systemui.statusbar.car.CarStatusBar
--keep class com.android.systemui.statusbar.phone.StatusBar
+-keep class com.android.systemui.statusbar.phone.CentralSurfaces
-keep class com.android.systemui.statusbar.tv.TvStatusBar
-keep class com.android.systemui.car.CarSystemUIFactory
-keep class com.android.systemui.SystemUIFactory
diff --git a/packages/SystemUI/res/drawable-mdpi/dream_preview_back_arrow.png b/packages/SystemUI/res/drawable-mdpi/dream_preview_back_arrow.png
new file mode 100644
index 0000000..2c2f94e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/dream_preview_back_arrow.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png b/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png
new file mode 100644
index 0000000..881b9af
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png b/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png
new file mode 100644
index 0000000..6063b42
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/notif_dungeon_bg_gradient.xml b/packages/SystemUI/res/drawable/notif_dungeon_bg_gradient.xml
deleted file mode 100644
index e456e29..0000000
--- a/packages/SystemUI/res/drawable/notif_dungeon_bg_gradient.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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.
- -->
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:angle="90"
- android:startColor="#ff000000"
- android:endColor="#00000000"
- android:type="linear" />
-</shape>
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_preview.xml b/packages/SystemUI/res/layout/dream_overlay_complication_preview.xml
index 37b8365..ca5c499 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_preview.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_preview.xml
@@ -24,6 +24,5 @@
android:shadowColor="@color/keyguard_shadow_color"
android:shadowRadius="?attr/shadowRadius"
android:gravity="center_vertical"
- android:drawableStart="@drawable/ic_arrow_back"
- android:drawablePadding="@dimen/dream_overlay_complication_preview_icon_padding"
- android:drawableTint="@android:color/white"/>
+ android:drawableStart="@drawable/dream_preview_back_arrow"
+ android:drawablePadding="@dimen/dream_overlay_complication_preview_icon_padding"/>
diff --git a/packages/SystemUI/res/layout/dream_overlay_status_bar_view.xml b/packages/SystemUI/res/layout/dream_overlay_status_bar_view.xml
index 813787e..1cbc3c2 100644
--- a/packages/SystemUI/res/layout/dream_overlay_status_bar_view.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_status_bar_view.xml
@@ -29,7 +29,6 @@
android:layout_width="@dimen/dream_overlay_notification_indicator_size"
android:layout_height="@dimen/dream_overlay_notification_indicator_size"
android:visibility="gone"
- android:contentDescription="@string/dream_overlay_status_bar_notification_indicator"
app:dotColor="@android:color/white"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
@@ -68,7 +67,7 @@
android:layout_width="@dimen/dream_overlay_status_bar_icon_size"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/dream_overlay_status_icon_margin"
- android:src="@drawable/ic_remove_circle"
+ android:src="@drawable/ic_qs_dnd_on"
android:tint="@android:color/white"
android:visibility="gone"
android:contentDescription="@string/dream_overlay_status_bar_priority_mode" />
diff --git a/packages/SystemUI/res/layout/foreground_service_dungeon.xml b/packages/SystemUI/res/layout/foreground_service_dungeon.xml
deleted file mode 100644
index d4e98e2..0000000
--- a/packages/SystemUI/res/layout/foreground_service_dungeon.xml
+++ /dev/null
@@ -1,61 +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.
- -->
-
-<com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/foreground_service_dungeon"
- android:layout_width="@dimen/qs_panel_width"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
- android:visibility="visible"
->
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:gravity="bottom"
- android:visibility="visible"
- android:background="@drawable/notif_dungeon_bg_gradient"
- >
-
- <!-- divider view -->
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="@color/GM2_grey_200"
- android:visibility="visible"
- />
-
- <TextView
- android:id="@+id/dungeon_title"
- android:layout_height="48dp"
- android:layout_width="match_parent"
- android:padding="8dp"
- android:text="Apps active in background"
- android:textColor="@color/GM2_grey_200"
- />
-
- <!-- List containing the actual foreground service notifications -->
- <LinearLayout
- android:id="@+id/entry_list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="bottom"
- android:orientation="vertical" >
- </LinearLayout>
-
- </LinearLayout>
-</com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView>
diff --git a/packages/SystemUI/res/layout/foreground_service_dungeon_row.xml b/packages/SystemUI/res/layout/foreground_service_dungeon_row.xml
deleted file mode 100644
index a6f1638..0000000
--- a/packages/SystemUI/res/layout/foreground_service_dungeon_row.xml
+++ /dev/null
@@ -1,43 +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.
- -->
-
-<com.android.systemui.statusbar.notification.row.DungeonRow
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/foreground_service_dungeon_row"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:padding="8dp"
- android:clickable="true"
- android:orientation="horizontal" >
-
- <com.android.systemui.statusbar.StatusBarIconView
- android:id="@+id/icon"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:padding="4dp" />
-
- <TextView
- android:id="@+id/app_name"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:paddingStart="4dp"
- android:gravity="center_vertical"
- android:layout_gravity="center_vertical"
- android:textColor="@color/GM2_grey_200"
- />
-
-</com.android.systemui.statusbar.notification.row.DungeonRow>
diff --git a/packages/SystemUI/res/layout/media_projection_dialog_title.xml b/packages/SystemUI/res/layout/media_projection_dialog_title.xml
deleted file mode 100644
index b9e39da..0000000
--- a/packages/SystemUI/res/layout/media_projection_dialog_title.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 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.
--->
-
-<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:theme="@style/Theme.SystemUI.MediaProjectionAlertDialog"
- android:paddingStart="?android:attr/dialogPreferredPadding"
- android:paddingEnd="?android:attr/dialogPreferredPadding"
- android:orientation="vertical">
- <ImageView
- android:id="@+id/dialog_icon"
- android:src="@drawable/ic_media_projection_permission"
- android:layout_height="24dp"
- android:layout_width="24dp"
- android:layout_marginTop="18dp"
- android:layout_marginBottom="12dp"
- android:layout_gravity="center_horizontal" />
- <TextView
- android:id="@+id/dialog_title"
- android:gravity="center"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:textColor="?android:attr/textColorPrimary"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title" />
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/media_ttt_chip.xml b/packages/SystemUI/res/layout/media_ttt_chip.xml
index a5fdcd9..a502d33 100644
--- a/packages/SystemUI/res/layout/media_ttt_chip.xml
+++ b/packages/SystemUI/res/layout/media_ttt_chip.xml
@@ -16,6 +16,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:id="@+id/media_ttt_sender_chip"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/layout/media_ttt_chip_receiver.xml b/packages/SystemUI/res/layout/media_ttt_chip_receiver.xml
index 88feacd..5e8b892 100644
--- a/packages/SystemUI/res/layout/media_ttt_chip_receiver.xml
+++ b/packages/SystemUI/res/layout/media_ttt_chip_receiver.xml
@@ -17,6 +17,7 @@
<!-- TODO(b/203800646): layout_marginTop doesn't seem to work on some large screens. -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/media_ttt_receiver_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/media_ttt_chip_background_receiver"
diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml
index 6bb6c2d..0f2d372 100644
--- a/packages/SystemUI/res/layout/user_switcher_fullscreen.xml
+++ b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml
@@ -55,16 +55,17 @@
<TextView
android:id="@+id/add"
- android:visibility="gone"
+ style="@style/Widget.Dialog.Button.BorderButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
- app:layout_constraintHeight_min="48dp"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
android:paddingHorizontal="@dimen/user_switcher_fullscreen_button_padding"
- android:textSize="@dimen/user_switcher_fullscreen_button_text_size"
+ android:text="@string/add"
android:textColor="?androidprv:attr/colorAccentPrimary"
- android:text="@string/add" />
+ android:textSize="@dimen/user_switcher_fullscreen_button_text_size"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHeight_min="48dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml
index a3d9a69..60e840c 100644
--- a/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml
+++ b/packages/SystemUI/res/layout/user_switcher_fullscreen_item.xml
@@ -13,21 +13,30 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<LinearLayout
+<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
- <ImageView
- android:id="@+id/user_switcher_icon"
- android:layout_gravity="center"
- android:layout_width="@dimen/bouncer_user_switcher_icon_size_plus_margin"
- android:layout_height="@dimen/bouncer_user_switcher_icon_size_plus_margin" />
- <TextView
- style="@style/Bouncer.UserSwitcher.Spinner.Item"
- android:id="@+id/user_switcher_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@*android:color/text_color_primary_device_default_dark"
- android:layout_gravity="center" />
-</LinearLayout>
+
+ <ImageView
+ android:id="@+id/user_switcher_icon"
+ android:layout_width="@dimen/bouncer_user_switcher_icon_size_plus_margin"
+ android:layout_height="@dimen/bouncer_user_switcher_icon_size_plus_margin"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:id="@+id/user_switcher_text"
+ style="@style/Bouncer.UserSwitcher.Spinner.Item"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:gravity="center"
+ android:textColor="@*android:color/text_color_primary_device_default_dark"
+ app:layout_constraintEnd_toEndOf="@id/user_switcher_icon"
+ app:layout_constraintStart_toStartOf="@id/user_switcher_icon"
+ app:layout_constraintTop_toBottomOf="@id/user_switcher_icon" />
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index 01eb09b..c386a3e 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -22,7 +22,6 @@
<dimen name="docked_divider_handle_width">2dp</dimen>
<dimen name="docked_divider_handle_height">16dp</dimen>
- <dimen name="qs_tile_height">84dp</dimen>
<dimen name="qs_brightness_margin_top">0dp</dimen>
<dimen name="qs_brightness_margin_bottom">12dp</dimen>
<dimen name="qqs_layout_margin_top">8dp</dimen>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 178f93a..2de8324 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -74,7 +74,12 @@
<!-- The default tiles to display in QuickSettings -->
<string name="quick_settings_tiles_default" translatable="false">
- internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle
+ internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,custom(com.android.permissioncontroller/.permission.service.SafetyHubQsTileService)
+ </string>
+
+ <!-- The component name of the Safety Quick Settings Tile -->
+ <string name="safety_quick_settings_tile" translatable="false">
+ custom(com.android.permissioncontroller/.permission.service.SafetyHubQsTileService)
</string>
<!-- The minimum number of tiles to display in QuickSettings -->
@@ -690,4 +695,7 @@
<!-- How often in milliseconds to jitter the dream overlay in order to avoid burn-in. -->
<integer name="config_dreamOverlayBurnInProtectionUpdateIntervalMillis">500</integer>
+
+ <!-- How long in milliseconds before full burn-in protection is achieved. -->
+ <integer name="config_dreamOverlayMillisUntilFullJitter">240000</integer>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index debf95b..92bc864 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -470,7 +470,7 @@
<dimen name="pull_span_min">25dp</dimen>
<dimen name="qs_corner_radius">28dp</dimen>
- <dimen name="qs_tile_height">84dp</dimen>
+ <dimen name="qs_tile_height">80dp</dimen>
<dimen name="qs_tile_margin_horizontal">8dp</dimen>
<dimen name="qs_tile_margin_vertical">@dimen/qs_tile_margin_horizontal</dimen>
<dimen name="qs_tile_margin_top_bottom">4dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index df16b0d..6ec6c23 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2421,6 +2421,9 @@
<string name="dream_overlay_status_bar_assistant_guest_mode_enabled">Assistant guest mode enabled</string>
<!-- Content description for the camera and mic off icon in the dream overlay status bar [CHAR LIMIT=NONE] -->
<string name="dream_overlay_status_bar_camera_mic_off">Camera and mic are off</string>
- <!-- Content description for the camera and mic off icon in the dream overlay status bar [CHAR LIMIT=NONE] -->
- <string name="dream_overlay_status_bar_notification_indicator">There are notifications</string>
+ <!-- Content description for the notifications indicator icon in the dream overlay status bar [CHAR LIMIT=NONE] -->
+ <string name="dream_overlay_status_bar_notification_indicator">{count, plural,
+ =1 {# notification}
+ other {# notifications}
+ }</string>
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index b3983d2..e743c4e 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -43,6 +43,7 @@
/**
* Get the secondary split screen app's rectangle when not minimized.
+ * @deprecated
*/
Rect getNonMinimizedSplitScreenSecondaryBounds() = 7;
@@ -104,6 +105,7 @@
/**
* Sets the split-screen divider minimized state
+ * @deprecated
*/
void setSplitScreenMinimized(boolean minimized) = 22;
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/AppTrace.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/AppTrace.java
deleted file mode 100644
index 0241c59..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/AppTrace.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.shared.recents.utilities;
-
-import static android.os.Trace.TRACE_TAG_APP;
-
-/**
- * Helper class for internal trace functions.
- */
-public class AppTrace {
-
- /**
- * Begins a new async trace section with the given {@param key} and {@param cookie}.
- */
- public static void start(String key, int cookie) {
- android.os.Trace.asyncTraceBegin(TRACE_TAG_APP, key, cookie);
- }
-
- /**
- * Begins a new async trace section with the given {@param key}.
- */
- public static void start(String key) {
- android.os.Trace.asyncTraceBegin(TRACE_TAG_APP, key, 0);
- }
-
- /**
- * Ends an existing async trace section with the given {@param key}.
- */
- public static void end(String key) {
- android.os.Trace.asyncTraceEnd(TRACE_TAG_APP, key, 0);
- }
-
- /**
- * Ends an existing async trace section with the given {@param key} and {@param cookie}.
- */
- public static void end(String key, int cookie) {
- android.os.Trace.asyncTraceEnd(TRACE_TAG_APP, key, cookie);
- }
-
- /**
- * Begins a new trace section with the given {@param key}. Can be nested.
- */
- public static void beginSection(String key) {
- android.os.Trace.beginSection(key);
- }
-
- /**
- * Ends an existing trace section started in the last {@link #beginSection(String)}.
- */
- public static void endSection() {
- android.os.Trace.endSection();
- }
-
- /**
- * Traces a counter value.
- */
- public static void count(String name, int count) {
- android.os.Trace.traceCounter(TRACE_TAG_APP, name, count);
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/RectFEvaluator.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/RectFEvaluator.java
deleted file mode 100644
index 51c1b5a..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/RectFEvaluator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.shared.recents.utilities;
-
-import android.animation.TypeEvaluator;
-import android.graphics.RectF;
-
-/**
- * This evaluator can be used to perform type interpolation between <code>RectF</code> values.
- */
-public class RectFEvaluator implements TypeEvaluator<RectF> {
-
- private final RectF mRect = new RectF();
-
- /**
- * This function returns the result of linearly interpolating the start and
- * end Rect values, with <code>fraction</code> representing the proportion
- * between the start and end values. The calculation is a simple parametric
- * calculation on each of the separate components in the Rect objects
- * (left, top, right, and bottom).
- *
- * <p>The object returned will be the <code>reuseRect</code> passed into the constructor.</p>
- *
- * @param fraction The fraction from the starting to the ending values
- * @param startValue The start Rect
- * @param endValue The end Rect
- * @return A linear interpolation between the start and end values, given the
- * <code>fraction</code> parameter.
- */
- @Override
- public RectF evaluate(float fraction, RectF startValue, RectF endValue) {
- float left = startValue.left + ((endValue.left - startValue.left) * fraction);
- float top = startValue.top + ((endValue.top - startValue.top) * fraction);
- float right = startValue.right + ((endValue.right - startValue.right) * fraction);
- float bottom = startValue.bottom + ((endValue.bottom - startValue.bottom) * fraction);
- mRect.set(left, top, right, bottom);
- return mRect;
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityCompat.java
index 0c7e56e..0f937bd 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityCompat.java
@@ -42,31 +42,4 @@
public void unregisterRemoteAnimations() {
mWrapped.unregisterRemoteAnimations();
}
-
- /**
- * @see android.view.ViewDebug#dumpv2(View, ByteArrayOutputStream)
- */
- public boolean encodeViewHierarchy(ByteArrayOutputStream out) {
- View view = null;
- if (mWrapped.getWindow() != null &&
- mWrapped.getWindow().peekDecorView() != null &&
- mWrapped.getWindow().peekDecorView().getViewRootImpl() != null) {
- view = mWrapped.getWindow().peekDecorView().getViewRootImpl().getView();
- }
- if (view == null) {
- return false;
- }
-
- final ViewHierarchyEncoder encoder = new ViewHierarchyEncoder(out);
- int[] location = view.getLocationOnScreen();
- encoder.addProperty("window:left", location[0]);
- encoder.addProperty("window:top", location[1]);
- view.encode(encoder);
- encoder.endStream();
- return true;
- }
-
- public int getDisplayId() {
- return mWrapped.getDisplayId();
- }
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 48fcbbd..461c2dc 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -262,7 +262,6 @@
* Starts a task from Recents synchronously.
*/
public boolean startActivityFromRecents(Task.TaskKey taskKey, ActivityOptions options) {
- ActivityOptionsCompat.addTaskInfo(options, taskKey);
return startActivityFromRecents(taskKey.id, options);
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
index e2ca349..db62f88 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
@@ -104,15 +104,4 @@
opts.setSourceInfo(ActivityOptions.SourceInfo.TYPE_LAUNCHER, uptimeMillis);
return opts;
}
-
- /**
- * Sets Task specific information to the activity options
- */
- public static void addTaskInfo(ActivityOptions opts, Task.TaskKey taskKey) {
- if (taskKey.windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
- // We show non-visible docked tasks in Recents, but we always want to launch
- // them in the fullscreen stack.
- opts.setLaunchWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
- }
- }
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ClipDescriptionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ClipDescriptionCompat.java
deleted file mode 100644
index 0b1141e..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ClipDescriptionCompat.java
+++ /dev/null
@@ -1,39 +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.shared.system;
-
-import android.content.ClipDescription;
-import android.content.Intent;
-
-/**
- * Wrapper around ClipDescription.
- */
-public abstract class ClipDescriptionCompat {
-
- public static String MIMETYPE_APPLICATION_ACTIVITY =
- ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
-
- public static String MIMETYPE_APPLICATION_SHORTCUT =
- ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
-
- public static String MIMETYPE_APPLICATION_TASK =
- ClipDescription.MIMETYPE_APPLICATION_TASK;
-
- public static String EXTRA_PENDING_INTENT = ClipDescription.EXTRA_PENDING_INTENT;
-
- public static String EXTRA_TASK_ID = Intent.EXTRA_TASK_ID;
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ConfigurationCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ConfigurationCompat.java
deleted file mode 100644
index d1c77a6..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ConfigurationCompat.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.shared.system;
-
-import android.content.res.Configuration;
-
-/**
- * Wraps the Configuration to access the window configuration.
- */
-public class ConfigurationCompat {
-
- public static int getWindowConfigurationRotation(Configuration c) {
- return c.windowConfiguration.getRotation();
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/DockedStackListenerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/DockedStackListenerCompat.java
deleted file mode 100644
index bb319e6..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/DockedStackListenerCompat.java
+++ /dev/null
@@ -1,63 +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.shared.system;
-
-import android.view.IDockedStackListener;
-
-/**
- * An interface to track docked stack changes.
- */
-public class DockedStackListenerCompat {
-
- IDockedStackListener.Stub mListener = new IDockedStackListener.Stub() {
- @Override
- public void onDividerVisibilityChanged(boolean visible) {}
-
- @Override
- public void onDockedStackExistsChanged(boolean exists) {
- DockedStackListenerCompat.this.onDockedStackExistsChanged(exists);
- }
-
- @Override
- public void onDockedStackMinimizedChanged(boolean minimized, long animDuration,
- boolean isHomeStackResizable) {
- DockedStackListenerCompat.this.onDockedStackMinimizedChanged(minimized, animDuration,
- isHomeStackResizable);
- }
-
- @Override
- public void onAdjustedForImeChanged(boolean adjustedForIme, long animDuration) {}
-
- @Override
- public void onDockSideChanged(final int newDockSide) {
- DockedStackListenerCompat.this.onDockSideChanged(newDockSide);
- }
- };
-
- public void onDockedStackExistsChanged(boolean exists) {
- // To be overridden
- }
-
- public void onDockedStackMinimizedChanged(boolean minimized, long animDuration,
- boolean isHomeStackResizable) {
- // To be overridden
- }
-
- public void onDockSideChanged(final int newDockSide) {
- // To be overridden
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LatencyTrackerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/LatencyTrackerCompat.java
index a8c19ec..e6ae19e 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LatencyTrackerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/LatencyTrackerCompat.java
@@ -24,14 +24,6 @@
* @see LatencyTracker
*/
public class LatencyTrackerCompat {
- /**
- * @see LatencyTracker
- * @deprecated Please use {@link LatencyTrackerCompat#logToggleRecents(Context, int)} instead.
- */
- @Deprecated
- public static void logToggleRecents(int duration) {
- LatencyTracker.logActionDeprecated(LatencyTracker.ACTION_TOGGLE_RECENTS, duration, false);
- }
/** @see LatencyTracker */
public static void logToggleRecents(Context context, int duration) {
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherAppsCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherAppsCompat.java
deleted file mode 100644
index d24c779..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherAppsCompat.java
+++ /dev/null
@@ -1,34 +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.shared.system;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.pm.LauncherApps;
-import android.os.Bundle;
-import android.os.UserHandle;
-
-/**
- * Wrapper around LauncherApps.
- */
-public abstract class LauncherAppsCompat {
-
- public static PendingIntent getMainActivityLaunchIntent(LauncherApps launcherApps,
- ComponentName component, Bundle startActivityOptions, UserHandle user) {
- return launcherApps.getMainActivityLaunchIntent(component, startActivityOptions, user);
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherEventUtil.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherEventUtil.java
deleted file mode 100644
index a51d668..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/LauncherEventUtil.java
+++ /dev/null
@@ -1,24 +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.shared.system;
-
-public class LauncherEventUtil {
-
- // Constants for the Action
- public static final int VISIBLE = 0;
- public static final int DISMISS = 1;
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/MetricsLoggerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/MetricsLoggerCompat.java
deleted file mode 100644
index 952c8ae..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/MetricsLoggerCompat.java
+++ /dev/null
@@ -1,50 +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.shared.system;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-
-public class MetricsLoggerCompat {
-
- private final MetricsLogger mMetricsLogger;
- public static final int OVERVIEW_ACTIVITY = MetricsEvent.OVERVIEW_ACTIVITY;
-
- public MetricsLoggerCompat() {
- mMetricsLogger = new MetricsLogger();
- }
-
- public void action(int category) {
- mMetricsLogger.action(category);
- }
-
- public void action(int category, int value) {
- mMetricsLogger.action(category, value);
- }
-
- public void visible(int category) {
- mMetricsLogger.visible(category);
- }
-
- public void hidden(int category) {
- mMetricsLogger.hidden(category);
- }
-
- public void visibility(int category, boolean visible) {
- mMetricsLogger.visibility(category, visible);
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index ace7938..98e48f6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -132,12 +132,13 @@
// the current going-away task on top of recents, though, so move it to front
final ArrayList<WindowContainerToken> pausingTasks = new ArrayList<>();
WindowContainerToken pipTask = null;
+ WindowContainerToken recentsTask = null;
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
final TransitionInfo.Change change = info.getChanges().get(i);
+ final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
if (change.getMode() == TRANSIT_CLOSE || change.getMode() == TRANSIT_TO_BACK) {
t.setLayer(leashMap.get(change.getLeash()),
info.getChanges().size() * 3 - i);
- final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
if (taskInfo == null) {
continue;
}
@@ -147,11 +148,14 @@
&& taskInfo.pictureInPictureParams.isAutoEnterEnabled()) {
pipTask = taskInfo.token;
}
- } else if (change.getTaskInfo() != null
- && change.getTaskInfo().topActivityType == ACTIVITY_TYPE_RECENTS) {
+ } else if (taskInfo != null
+ && taskInfo.topActivityType == ACTIVITY_TYPE_RECENTS) {
// This task is for recents, keep it on top.
t.setLayer(leashMap.get(change.getLeash()),
info.getChanges().size() * 3 - i);
+ recentsTask = taskInfo.token;
+ } else if (taskInfo != null && taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
+ recentsTask = taskInfo.token;
}
}
// Also make all the wallpapers opaque since we want the visible from the start
@@ -160,7 +164,7 @@
}
t.apply();
mRecentsSession.setup(controller, info, finishedCallback, pausingTasks, pipTask,
- leashMap, mToken);
+ recentsTask, leashMap, mToken);
recents.onAnimationStart(mRecentsSession, apps, wallpapers, new Rect(0, 0, 0, 0),
new Rect());
}
@@ -209,6 +213,7 @@
private IRemoteTransitionFinishedCallback mFinishCB = null;
private ArrayList<WindowContainerToken> mPausingTasks = null;
private WindowContainerToken mPipTask = null;
+ private WindowContainerToken mRecentsTask = null;
private TransitionInfo mInfo = null;
private ArrayList<SurfaceControl> mOpeningLeashes = null;
private ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = null;
@@ -218,7 +223,8 @@
void setup(RecentsAnimationControllerCompat wrapped, TransitionInfo info,
IRemoteTransitionFinishedCallback finishCB,
ArrayList<WindowContainerToken> pausingTasks, WindowContainerToken pipTask,
- ArrayMap<SurfaceControl, SurfaceControl> leashMap, IBinder transition) {
+ WindowContainerToken recentsTask, ArrayMap<SurfaceControl, SurfaceControl> leashMap,
+ IBinder transition) {
if (mInfo != null) {
throw new IllegalStateException("Trying to run a new recents animation while"
+ " recents is already active.");
@@ -228,6 +234,7 @@
mFinishCB = finishCB;
mPausingTasks = pausingTasks;
mPipTask = pipTask;
+ mRecentsTask = recentsTask;
mLeashMap = leashMap;
mTransition = transition;
}
@@ -329,6 +336,9 @@
wct.reorder(mPausingTasks.get(i), true /* onTop */);
t.show(mInfo.getChange(mPausingTasks.get(i)).getLeash());
}
+ if (mRecentsTask != null) {
+ wct.restoreTransientOrder(mRecentsTask);
+ }
} else {
wct = null;
if (mPipTask != null && mPipTransaction != null) {
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RotationWatcher.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RotationWatcher.java
deleted file mode 100644
index 7c8c23e..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RotationWatcher.java
+++ /dev/null
@@ -1,69 +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.shared.system;
-
-import android.content.Context;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.IRotationWatcher;
-import android.view.WindowManagerGlobal;
-
-public abstract class RotationWatcher {
-
- private static final String TAG = "RotationWatcher";
-
- private final Context mContext;
-
- private final IRotationWatcher mWatcher = new IRotationWatcher.Stub() {
-
- @Override
- public void onRotationChanged(int rotation) {
- RotationWatcher.this.onRotationChanged(rotation);
-
- }
- };
-
- private boolean mIsWatching = false;
-
- public RotationWatcher(Context context) {
- mContext = context;
- }
-
- protected abstract void onRotationChanged(int rotation);
-
- public void enable() {
- if (!mIsWatching) {
- try {
- WindowManagerGlobal.getWindowManagerService().watchRotation(mWatcher,
- mContext.getDisplayId());
- mIsWatching = true;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set rotation watcher", e);
- }
- }
- }
-
- public void disable() {
- if (mIsWatching) {
- try {
- WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(mWatcher);
- mIsWatching = false;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to remove rotation watcher", e);
- }
- }
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskDescriptionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskDescriptionCompat.java
deleted file mode 100644
index 35952f5..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskDescriptionCompat.java
+++ /dev/null
@@ -1,49 +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.shared.system;
-
-import android.app.ActivityManager;
-import android.graphics.Bitmap;
-
-public class TaskDescriptionCompat {
-
- private ActivityManager.TaskDescription mTaskDescription;
-
- public TaskDescriptionCompat(ActivityManager.TaskDescription td) {
- mTaskDescription = td;
- }
-
- public int getPrimaryColor() {
- return mTaskDescription != null
- ? mTaskDescription.getPrimaryColor()
- : 0;
- }
-
- public int getBackgroundColor() {
- return mTaskDescription != null
- ? mTaskDescription.getBackgroundColor()
- : 0;
- }
-
- public static Bitmap getIcon(ActivityManager.TaskDescription desc, int userId) {
- if (desc.getInMemoryIcon() != null) {
- return desc.getInMemoryIcon();
- }
- return ActivityManager.TaskDescription.loadTaskDescriptionIcon(
- desc.getIconFilename(), userId);
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
deleted file mode 100644
index ffd8a08..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
+++ /dev/null
@@ -1,34 +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.shared.system;
-
-import android.view.ThreadedRenderer;
-
-/**
- * @see ThreadedRenderer
- */
-public class ThreadedRendererCompat {
-
- public static int EGL_CONTEXT_PRIORITY_REALTIME_NV = 0x3357;
- public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101;
- public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102;
- public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
-
- public static void setContextPriority(int priority) {
- ThreadedRenderer.setContextPriority(priority);
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TonalCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TonalCompat.java
deleted file mode 100644
index 4a0f89b..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TonalCompat.java
+++ /dev/null
@@ -1,53 +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.shared.system;
-
-import android.app.WallpaperColors;
-import android.content.Context;
-
-import com.android.internal.colorextraction.ColorExtractor.GradientColors;
-import com.android.internal.colorextraction.types.Tonal;
-
-public class TonalCompat {
-
- private final Tonal mTonal;
-
- public TonalCompat(Context context) {
- mTonal = new Tonal(context);
- }
-
- public ExtractionInfo extractDarkColors(WallpaperColors colors) {
- GradientColors darkColors = new GradientColors();
- mTonal.extractInto(colors, new GradientColors(), darkColors, new GradientColors());
-
- ExtractionInfo result = new ExtractionInfo();
- result.mainColor = darkColors.getMainColor();
- result.secondaryColor = darkColors.getSecondaryColor();
- result.supportsDarkText = darkColors.supportsDarkText();
- if (colors != null) {
- result.supportsDarkTheme =
- (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0;
- }
- return result;
- }
-
- public static class ExtractionInfo {
- public int mainColor;
- public int secondaryColor;
- public boolean supportsDarkText;
- public boolean supportsDarkTheme;
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java
deleted file mode 100644
index 89c60f1..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java
+++ /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.shared.system;
-
-import android.graphics.HardwareRenderer;
-import android.view.SurfaceControl;
-import android.view.View;
-import android.view.ViewRootImpl;
-
-import java.util.function.LongConsumer;
-
-/**
- * Helper class to expose some ViewRoomImpl methods
- */
-public class ViewRootImplCompat {
-
- private final ViewRootImpl mViewRoot;
-
- public ViewRootImplCompat(View view) {
- mViewRoot = view == null ? null : view.getViewRootImpl();
- }
-
- public SurfaceControl getRenderSurfaceControl() {
- return mViewRoot == null ? null : mViewRoot.getSurfaceControl();
- }
-
- public boolean isValid() {
- return mViewRoot != null;
- }
-
- public View getView() {
- return mViewRoot == null ? null : mViewRoot.getView();
- }
-
- public void registerRtFrameCallback(LongConsumer callback) {
- if (mViewRoot != null) {
- mViewRoot.registerRtFrameCallback(
- new HardwareRenderer.FrameDrawingCallback() {
- @Override
- public void onFrameDraw(long l) {
- callback.accept(l);
- }
- });
- }
- }
-
- public void mergeWithNextTransaction(SurfaceControl.Transaction t, long frame) {
- if (mViewRoot != null) {
- mViewRoot.mergeWithNextTransaction(t, frame);
- } else {
- t.apply();
- }
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperEngineCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperEngineCompat.java
deleted file mode 100644
index 73dc60d..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperEngineCompat.java
+++ /dev/null
@@ -1,56 +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.shared.system;
-
-import android.graphics.Rect;
-import android.service.wallpaper.IWallpaperEngine;
-import android.util.Log;
-
-/**
- * @see IWallpaperEngine
- */
-public class WallpaperEngineCompat {
-
- private static final String TAG = "WallpaperEngineCompat";
-
- /**
- * Returns true if {@link IWallpaperEngine#scalePreview(Rect)} is available.
- */
- public static boolean supportsScalePreview() {
- try {
- return IWallpaperEngine.class.getMethod("scalePreview", Rect.class) != null;
- } catch (NoSuchMethodException | SecurityException e) {
- return false;
- }
- }
-
- private final IWallpaperEngine mWrappedEngine;
-
- public WallpaperEngineCompat(IWallpaperEngine wrappedEngine) {
- mWrappedEngine = wrappedEngine;
- }
-
- /**
- * @see IWallpaperEngine#scalePreview(Rect)
- */
- public void scalePreview(Rect scaleToRect) {
- try {
- mWrappedEngine.scalePreview(scaleToRect);
- } catch (Exception e) {
- Log.i(TAG, "Couldn't call scalePreview method on WallpaperEngine", e);
- }
- }
-}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperManagerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperManagerCompat.java
deleted file mode 100644
index 1f194eca..0000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WallpaperManagerCompat.java
+++ /dev/null
@@ -1,51 +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.shared.system;
-
-import android.app.WallpaperManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.IBinder;
-
-/**
- * @see WallpaperManager
- */
-public class WallpaperManagerCompat {
- private final WallpaperManager mWallpaperManager;
-
- public WallpaperManagerCompat(Context context) {
- mWallpaperManager = context.getSystemService(WallpaperManager.class);
- }
-
- /**
- * @see WallpaperManager#setWallpaperZoomOut(IBinder, float)
- */
- public void setWallpaperZoomOut(IBinder windowToken, float zoom) {
- mWallpaperManager.setWallpaperZoomOut(windowToken, zoom);
- }
-
- /**
- * @return the max scale for the wallpaper when it's fully zoomed out
- */
- public static float getWallpaperZoomOutMaxScale(Context context) {
- return context.getResources()
- .getFloat(Resources.getSystem().getIdentifier(
- /* name= */ "config_wallpaperMaxScale",
- /* defType= */ "dimen",
- /* defPackage= */ "android"));
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
index f6fe1ed..a50d852 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
+++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
@@ -4,6 +4,7 @@
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
+import android.os.Trace
import androidx.core.util.Consumer
internal class HingeSensorAngleProvider(private val sensorManager: SensorManager) :
@@ -13,8 +14,10 @@
private val listeners: MutableList<Consumer<Float>> = arrayListOf()
override fun start() {
+ Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_FASTEST)
+ Trace.endSection()
}
override fun stop() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java b/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java
index 848b8ab..1ede76f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardDisplayManager.java
@@ -26,6 +26,7 @@
import android.media.MediaRouter;
import android.media.MediaRouter.RouteInfo;
import android.os.Bundle;
+import android.os.Trace;
import android.util.Log;
import android.util.SparseArray;
import android.view.Display;
@@ -67,11 +68,14 @@
@Override
public void onDisplayAdded(int displayId) {
+ Trace.beginSection(
+ "KeyguardDisplayManager#onDisplayAdded(displayId=" + displayId + ")");
final Display display = mDisplayService.getDisplay(displayId);
if (mShowing) {
updateNavigationBarVisibility(displayId, false /* navBarVisible */);
showPresentation(display);
}
+ Trace.endSection();
}
@Override
@@ -81,7 +85,10 @@
@Override
public void onDisplayRemoved(int displayId) {
+ Trace.beginSection(
+ "KeyguardDisplayManager#onDisplayRemoved(displayId=" + displayId + ")");
hidePresentation(displayId);
+ Trace.endSection();
}
};
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
index 122f3d7..295d77d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java
@@ -24,9 +24,9 @@
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
/**
@@ -176,9 +176,9 @@
// achieving complete abstraction away from where the Keyguard View is mounted.
/**
- * Registers the StatusBar to which this Keyguard View is mounted.
+ * Registers the CentralSurfaces to which this Keyguard View is mounted.
*/
- void registerStatusBar(StatusBar statusBar,
+ void registerCentralSurfaces(CentralSurfaces centralSurfaces,
NotificationPanelViewController notificationPanelViewController,
@Nullable PanelExpansionStateManager panelExpansionStateManager,
BiometricUnlockController biometricUnlockController,
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 4ad5183..370686a 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -60,7 +60,7 @@
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.ViewController;
@@ -78,7 +78,7 @@
* For devices with UDFPS, the lock icon will show at the sensor location. Else, the lock
* icon will show a set distance from the bottom of the device.
*/
-@StatusBarComponent.StatusBarScope
+@CentralSurfacesComponent.CentralSurfacesScope
public class LockIconViewController extends ViewController<LockIconView> implements Dumpable {
private static final String TAG = "LockIconViewController";
private static final float sDefaultDensity =
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerScope.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerScope.java
index 207ac28..8dbe5e0 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerScope.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardBouncerScope.java
@@ -24,7 +24,7 @@
import javax.inject.Scope;
/**
- * Scope annotation for singleton items within the StatusBarComponent.
+ * Scope annotation for singleton items within the CentralSurfacesComponent.
*/
@Documented
@Retention(RUNTIME)
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewScope.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewScope.java
index ba0642f..f498ef3 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewScope.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewScope.java
@@ -24,7 +24,7 @@
import javax.inject.Scope;
/**
- * Scope annotation for singleton items within the StatusBarComponent.
+ * Scope annotation for singleton items within the CentralSurfacesComponent.
*/
@Documented
@Retention(RUNTIME)
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusViewScope.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusViewScope.java
index 880822a..aeae8e3 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusViewScope.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusViewScope.java
@@ -24,7 +24,7 @@
import javax.inject.Scope;
/**
- * Scope annotation for singleton items within the StatusBarComponent.
+ * Scope annotation for singleton items within the CentralSurfacesComponent.
*/
@Documented
@Retention(RUNTIME)
diff --git a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
index cc166c2..5bd620e 100644
--- a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java
@@ -23,7 +23,7 @@
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.util.Optional;
@@ -33,17 +33,17 @@
/**
* Single common instance of ActivityStarter that can be gotten and referenced from anywhere, but
- * delegates to an actual implementation (StatusBar).
+ * delegates to an actual implementation (CentralSurfaces).
*/
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@SysUISingleton
public class ActivityStarterDelegate implements ActivityStarter {
- private Lazy<Optional<StatusBar>> mActualStarterOptionalLazy;
+ private Lazy<Optional<CentralSurfaces>> mActualStarterOptionalLazy;
@Inject
- public ActivityStarterDelegate(Lazy<Optional<StatusBar>> statusBarOptionalLazy) {
- mActualStarterOptionalLazy = statusBarOptionalLazy;
+ public ActivityStarterDelegate(Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy) {
+ mActualStarterOptionalLazy = centralSurfacesOptionalLazy;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index ec11065..3a6165c 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -38,13 +38,13 @@
import android.util.Log;
import android.util.TimingsTraceLog;
import android.view.SurfaceControl;
+import android.view.ThreadedRenderer;
import com.android.internal.protolog.common.ProtoLog;
import com.android.systemui.dagger.ContextComponentHelper;
import com.android.systemui.dagger.GlobalRootComponent;
import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dump.DumpManager;
-import com.android.systemui.shared.system.ThreadedRendererCompat;
import com.android.systemui.util.NotificationChannels;
import java.lang.reflect.Constructor;
@@ -118,11 +118,11 @@
// The priority is defaulted at medium.
int sfPriority = SurfaceControl.getGPUContextPriority();
Log.i(TAG, "Found SurfaceFlinger's GPU Priority: " + sfPriority);
- if (sfPriority == ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_REALTIME_NV) {
+ if (sfPriority == ThreadedRenderer.EGL_CONTEXT_PRIORITY_REALTIME_NV) {
Log.i(TAG, "Setting SysUI's GPU Context priority to: "
- + ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG);
- ThreadedRendererCompat.setContextPriority(
- ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG);
+ + ThreadedRenderer.EGL_CONTEXT_PRIORITY_HIGH_IMG);
+ ThreadedRenderer.setContextPriority(
+ ThreadedRenderer.EGL_CONTEXT_PRIORITY_HIGH_IMG);
}
// Enable binder tracing on system server for calls originating from SysUI
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
index 881e6a9..bd8e44c 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
@@ -54,7 +54,7 @@
import com.android.systemui.recents.Recents;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarWindowCallback;
import com.android.systemui.util.Assert;
@@ -180,7 +180,7 @@
private final Optional<Recents> mRecentsOptional;
private Locale mLocale;
private final AccessibilityManager mA11yManager;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final NotificationShadeWindowController mNotificationShadeController;
private final StatusBarWindowCallback mNotificationShadeCallback;
private boolean mDismissNotificationShadeActionRegistered;
@@ -188,7 +188,7 @@
@Inject
public SystemActions(Context context,
NotificationShadeWindowController notificationShadeController,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
Optional<Recents> recentsOptional) {
super(context);
mRecentsOptional = recentsOptional;
@@ -201,7 +201,7 @@
// NotificationShadeWindowController.registerCallback() only keeps weak references.
mNotificationShadeCallback = (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing) ->
registerOrUnregisterDismissNotificationShadeAction();
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
}
@Override
@@ -311,9 +311,10 @@
// Saving state in instance variable since this callback is called quite often to avoid
// binder calls
- final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
- if (statusBarOptional.map(StatusBar::isPanelExpanded).orElse(false)
- && !statusBarOptional.get().isKeyguardShowing()) {
+ final Optional<CentralSurfaces> centralSurfacesOptional =
+ mCentralSurfacesOptionalLazy.get();
+ if (centralSurfacesOptional.map(CentralSurfaces::isPanelExpanded).orElse(false)
+ && !centralSurfacesOptional.get().isKeyguardShowing()) {
if (!mDismissNotificationShadeActionRegistered) {
mA11yManager.registerSystemAction(
createRemoteAction(
@@ -466,12 +467,12 @@
}
private void handleNotifications() {
- mStatusBarOptionalLazy.get().ifPresent(StatusBar::animateExpandNotificationsPanel);
+ mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::animateExpandNotificationsPanel);
}
private void handleQuickSettings() {
- mStatusBarOptionalLazy.get().ifPresent(
- statusBar -> statusBar.animateExpandSettingsPanel(null));
+ mCentralSurfacesOptionalLazy.get().ifPresent(
+ centralSurfaces -> centralSurfaces.animateExpandSettingsPanel(null));
}
private void handlePowerDialog() {
@@ -524,8 +525,8 @@
}
private void handleAccessibilityDismissNotificationShade() {
- mStatusBarOptionalLazy.get().ifPresent(
- statusBar -> statusBar.animateCollapsePanels(
+ mCentralSurfacesOptionalLazy.get().ifPresent(
+ centralSurfaces -> centralSurfaces.animateCollapsePanels(
CommandQueue.FLAG_EXCLUDE_NONE, false /* force */));
}
diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
index aedaf96..dfff00b 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java
@@ -36,7 +36,7 @@
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.util.ArrayList;
import java.util.List;
@@ -69,7 +69,7 @@
};
private final Context mContext;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final StatusBarStateController mStatusBarStateController;
private boolean mLauncherShowing;
@@ -77,10 +77,11 @@
@Inject
PhoneStateMonitor(Context context, BroadcastDispatcher broadcastDispatcher,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy, BootCompleteCache bootCompleteCache,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
+ BootCompleteCache bootCompleteCache,
StatusBarStateController statusBarStateController) {
mContext = context;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mStatusBarStateController = statusBarStateController;
mDefaultHome = getCurrentDefaultHome();
@@ -180,7 +181,8 @@
}
private boolean isBouncerShowing() {
- return mStatusBarOptionalLazy.get().map(StatusBar::isBouncerShowing).orElse(false);
+ return mCentralSurfacesOptionalLazy.get()
+ .map(CentralSurfaces::isBouncerShowing).orElse(false);
}
private boolean isKeyguardLocked() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
index f82ea79..99f27d7 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt
@@ -40,8 +40,8 @@
import com.android.systemui.statusbar.commandline.CommandRegistry
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.StatusBar
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
+import com.android.systemui.statusbar.phone.CentralSurfaces
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.ViewController
@@ -54,9 +54,9 @@
* Controls the ripple effect that shows when authentication is successful.
* The ripple uses the accent color of the current theme.
*/
-@StatusBarScope
+@CentralSurfacesScope
class AuthRippleController @Inject constructor(
- private val statusBar: StatusBar,
+ private val centralSurfaces: CentralSurfaces,
private val sysuiContext: Context,
private val authController: AuthController,
private val configurationController: ConfigurationController,
@@ -137,7 +137,7 @@
private fun showUnlockedRipple() {
notificationShadeWindowController.setForcePluginOpen(true, this)
- val lightRevealScrim = statusBar.lightRevealScrim
+ val lightRevealScrim = centralSurfaces.lightRevealScrim
if (statusBarStateController.isDozing || biometricUnlockController.isWakeAndUnlock) {
circleReveal?.let {
lightRevealScrim?.revealEffect = it
@@ -155,7 +155,7 @@
override fun onKeyguardFadingAwayChanged() {
if (keyguardStateController.isKeyguardFadingAway) {
- val lightRevealScrim = statusBar.lightRevealScrim
+ val lightRevealScrim = centralSurfaces.lightRevealScrim
if (startLightRevealScrimOnKeyguardFadingAway && lightRevealScrim != null) {
ValueAnimator.ofFloat(.1f, 1f).apply {
interpolator = Interpolators.LINEAR_OUT_SLOW_IN
@@ -170,7 +170,7 @@
}
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
- // Reset light reveal scrim to the default, so the StatusBar
+ // Reset light reveal scrim to the default, so the CentralSurfaces
// can handle any subsequent light reveal changes
// (ie: from dozing changes)
if (lightRevealScrim.revealEffect == circleReveal) {
@@ -199,8 +199,8 @@
it.y,
0f,
Math.max(
- Math.max(it.x, statusBar.displayWidth - it.x),
- Math.max(it.y, statusBar.displayHeight - it.y)
+ Math.max(it.x, centralSurfaces.displayWidth - it.x),
+ Math.max(it.y, centralSurfaces.displayHeight - it.y)
)
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
index 7204a15..7efdd1a 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java
@@ -38,7 +38,6 @@
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
-import com.android.systemui.statusbar.StatusBarState;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieProperty;
@@ -68,6 +67,7 @@
private float mBurnInOffsetY;
private float mBurnInProgress;
private float mInterpolatedDarkAmount;
+ private boolean mAnimatingBetweenAodAndLockscreen; // As opposed to Unlocked => AOD
private boolean mFullyInflated;
public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) {
@@ -114,23 +114,32 @@
return;
}
+ final float darkAmountForAnimation = mAnimatingBetweenAodAndLockscreen
+ ? mInterpolatedDarkAmount : 1f /* animating from unlocked to AOD */;
mBurnInOffsetX = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
- - mMaxBurnInOffsetX, mInterpolatedDarkAmount);
+ - mMaxBurnInOffsetX, darkAmountForAnimation);
mBurnInOffsetY = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
- - mMaxBurnInOffsetY, mInterpolatedDarkAmount);
- mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), mInterpolatedDarkAmount);
+ - mMaxBurnInOffsetY, darkAmountForAnimation);
+ mBurnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(), darkAmountForAnimation);
+
+ if (mAnimatingBetweenAodAndLockscreen) {
+ mBgProtection.setAlpha(1f - mInterpolatedDarkAmount);
+
+ mLockScreenFp.setTranslationX(mBurnInOffsetX);
+ mLockScreenFp.setTranslationY(mBurnInOffsetY);
+ mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount);
+ mLockScreenFp.setAlpha(1f - mInterpolatedDarkAmount);
+ } else {
+ mBgProtection.setAlpha(0f);
+ mLockScreenFp.setAlpha(0f);
+ }
mAodFp.setTranslationX(mBurnInOffsetX);
mAodFp.setTranslationY(mBurnInOffsetY);
mAodFp.setProgress(mBurnInProgress);
- mAodFp.setAlpha(255 * mInterpolatedDarkAmount);
-
- mLockScreenFp.setTranslationX(mBurnInOffsetX);
- mLockScreenFp.setTranslationY(mBurnInOffsetY);
- mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount);
- mLockScreenFp.setAlpha((1f - mInterpolatedDarkAmount) * 255);
+ mAodFp.setAlpha(mInterpolatedDarkAmount);
}
void requestUdfps(boolean request, int color) {
@@ -171,15 +180,14 @@
protected int updateAlpha() {
int alpha = super.updateAlpha();
if (mFullyInflated) {
- mLockScreenFp.setAlpha(alpha / 255f);
- if (mInterpolatedDarkAmount != 0f) {
- mBgProtection.setAlpha(1f - mInterpolatedDarkAmount);
- } else {
+ if (mInterpolatedDarkAmount == 0f) {
+ mLockScreenFp.setAlpha(alpha / 255f);
mBgProtection.setAlpha(alpha / 255f);
+ } else {
+ updateBurnInOffsets();
}
}
-
return alpha;
}
@@ -191,8 +199,10 @@
return mAlpha;
}
- void onDozeAmountChanged(float linear, float eased) {
+ void onDozeAmountChanged(float linear, float eased, boolean animatingBetweenAodAndLockscreen) {
+ mAnimatingBetweenAodAndLockscreen = animatingBetweenAodAndLockscreen;
mInterpolatedDarkAmount = eased;
+
updateAlpha();
updateBurnInOffsets();
}
@@ -225,10 +235,6 @@
mBackgroundInAnimator.start();
}
- private boolean isShadeLocked() {
- return mStatusBarState == StatusBarState.SHADE_LOCKED;
- }
-
private final AsyncLayoutInflater.OnInflateFinishedListener mLayoutInflaterFinishListener =
new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
index 24a655c..5ac21ff 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
@@ -18,6 +18,7 @@
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
+import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.content.res.Configuration;
import android.util.Log;
@@ -31,6 +32,7 @@
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -59,6 +61,7 @@
@NonNull private final UnlockedScreenOffAnimationController
mUnlockedScreenOffAnimationController;
@NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
+ private final ValueAnimator mUnlockedScreenOffDozeAnimator = ValueAnimator.ofFloat(0f, 1f);
private boolean mShowingUdfpsBouncer;
private boolean mUdfpsRequested;
@@ -107,6 +110,18 @@
mUdfpsController = udfpsController;
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
mActivityLaunchAnimator = activityLaunchAnimator;
+
+ mUnlockedScreenOffDozeAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
+ mUnlockedScreenOffDozeAnimator.addUpdateListener(
+ new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mView.onDozeAmountChanged(
+ animation.getAnimatedFraction(),
+ (float) animation.getAnimatedValue(),
+ /* animatingBetweenAodAndLockScreen */ false);
+ }
+ });
}
@Override
@@ -143,7 +158,6 @@
mKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor);
mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(this);
- mUnlockedScreenOffAnimationController.addCallback(mUnlockedScreenOffCallback);
mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener);
}
@@ -161,7 +175,6 @@
if (mLockScreenShadeTransitionController.getUdfpsKeyguardViewController() == this) {
mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(null);
}
- mUnlockedScreenOffAnimationController.removeCallback(mUnlockedScreenOffCallback);
mActivityLaunchAnimator.removeListener(mActivityLaunchAnimatorListener);
}
@@ -179,6 +192,7 @@
pw.println("mUdfpsRequested=" + mUdfpsRequested);
pw.println("mView.mUdfpsRequested=" + mView.mUdfpsRequested);
pw.println("mLaunchTransitionFadingAway=" + mLaunchTransitionFadingAway);
+ pw.println("mLastDozeAmount=" + mLastDozeAmount);
}
/**
@@ -239,7 +253,11 @@
return true;
}
- if (mStatusBarState != KEYGUARD) {
+ // Only pause auth if we're not on the keyguard AND we're not transitioning to doze
+ // (ie: dozeAmount = 0f). For the UnlockedScreenOffAnimation, the statusBarState is
+ // delayed. However, we still animate in the UDFPS affordance with the
+ // mUnlockedScreenOffDozeAnimator.
+ if (mStatusBarState != KEYGUARD && mLastDozeAmount == 0f) {
return true;
}
@@ -299,6 +317,10 @@
updateAlpha();
}
+ /**
+ * Update alpha for the UDFPS lock screen affordance. The AoD UDFPS visual affordance's
+ * alpha is based on the doze amount.
+ */
private void updateAlpha() {
// fade icon on transitions to showing the status bar, but if mUdfpsRequested, then
// the keyguard is occluded by some application - so instead use the input bouncer
@@ -327,7 +349,18 @@
if (mLastDozeAmount < linear) {
showUdfpsBouncer(false);
}
- mView.onDozeAmountChanged(linear, eased);
+ mUnlockedScreenOffDozeAnimator.cancel();
+ final boolean animatingFromUnlockedScreenOff =
+ mUnlockedScreenOffAnimationController.isAnimationPlaying();
+ if (animatingFromUnlockedScreenOff && linear != 0f) {
+ // we manually animate the fade in of the UDFPS icon since the unlocked
+ // screen off animation prevents the doze amounts to be incrementally eased in
+ mUnlockedScreenOffDozeAnimator.start();
+ } else {
+ mView.onDozeAmountChanged(linear, eased,
+ /* animatingBetweenAodAndLockScreen */ true);
+ }
+
mLastDozeAmount = linear;
updatePauseAuth();
}
@@ -446,9 +479,6 @@
}
};
- private final UnlockedScreenOffAnimationController.Callback mUnlockedScreenOffCallback =
- (linear, eased) -> mStateListener.onDozeAmountChanged(linear, eased);
-
private final ActivityLaunchAnimator.Listener mActivityLaunchAnimatorListener =
new ActivityLaunchAnimator.Listener() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
index f87fa96..5c1d8c3 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt
@@ -23,7 +23,11 @@
import android.content.Intent
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
+import android.database.ContentObserver
+import android.net.Uri
+import android.os.Handler
import android.os.VibrationEffect
+import android.provider.Settings
import android.service.controls.Control
import android.service.controls.actions.BooleanAction
import android.service.controls.actions.CommandAction
@@ -38,6 +42,7 @@
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.settings.SecureSettings
import com.android.wm.shell.TaskViewFactory
import java.util.Optional
import javax.inject.Inject
@@ -51,19 +56,41 @@
private val keyguardStateController: KeyguardStateController,
private val taskViewFactory: Optional<TaskViewFactory>,
private val controlsMetricsLogger: ControlsMetricsLogger,
- private val vibrator: VibratorHelper
+ private val vibrator: VibratorHelper,
+ private val secureSettings: SecureSettings,
+ @Main mainHandler: Handler
) : ControlActionCoordinator {
private var dialog: Dialog? = null
private var pendingAction: Action? = null
private var actionsInProgress = mutableSetOf<String>()
private val isLocked: Boolean
get() = !keyguardStateController.isUnlocked()
+ private var mAllowTrivialControls: Boolean = secureSettings.getInt(
+ Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, 0) != 0
override lateinit var activityContext: Context
companion object {
private const val RESPONSE_TIMEOUT_IN_MILLIS = 3000L
}
+ init {
+ val lockScreenShowControlsUri =
+ secureSettings.getUriFor(Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS)
+ val controlsContentObserver = object : ContentObserver(mainHandler) {
+ override fun onChange(selfChange: Boolean, uri: Uri?) {
+ super.onChange(selfChange, uri)
+ if (uri == lockScreenShowControlsUri) {
+ mAllowTrivialControls = secureSettings.getInt(
+ Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS, 0) != 0
+ }
+ }
+ }
+ secureSettings.registerContentObserver(
+ lockScreenShowControlsUri,
+ false /* notifyForDescendants */, controlsContentObserver
+ )
+ }
+
override fun closeDialogs() {
dialog?.dismiss()
dialog = null
@@ -80,7 +107,7 @@
},
true /* blockable */
),
- isAuthRequired(cvh)
+ isAuthRequired(cvh, mAllowTrivialControls)
)
}
@@ -100,7 +127,7 @@
},
blockable
),
- isAuthRequired(cvh)
+ isAuthRequired(cvh, mAllowTrivialControls)
)
}
@@ -120,7 +147,7 @@
{ cvh.action(FloatAction(templateId, newValue)) },
false /* blockable */
),
- isAuthRequired(cvh)
+ isAuthRequired(cvh, mAllowTrivialControls)
)
}
@@ -139,7 +166,7 @@
},
false /* blockable */
),
- isAuthRequired(cvh)
+ isAuthRequired(cvh, mAllowTrivialControls)
)
}
@@ -156,7 +183,11 @@
actionsInProgress.remove(controlId)
}
- private fun isAuthRequired(cvh: ControlViewHolder) = cvh.cws.control?.isAuthRequired() ?: true
+ @VisibleForTesting()
+ fun isAuthRequired(cvh: ControlViewHolder, allowTrivialControls: Boolean): Boolean {
+ val isAuthRequired = cvh.cws.control?.isAuthRequired ?: true
+ return isAuthRequired || !allowTrivialControls
+ }
private fun shouldRunAction(controlId: String) =
if (actionsInProgress.add(controlId)) {
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
index b32f878..2f041ac 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
@@ -18,7 +18,7 @@
import com.android.systemui.keyguard.dagger.KeyguardModule;
import com.android.systemui.recents.RecentsModule;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import dagger.Module;
@@ -27,7 +27,7 @@
*/
@Module(includes = {
RecentsModule.class,
- StatusBarModule.class,
+ CentralSurfacesModule.class,
KeyguardModule.class,
})
public abstract class SystemUIBinder {
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
index a4da6b4..5d154c3 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
@@ -48,7 +48,7 @@
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.dagger.StartStatusBarModule;
+import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
@@ -87,7 +87,7 @@
MediaModule.class,
PowerModule.class,
QSModule.class,
- StartStatusBarModule.class,
+ StartCentralSurfacesModule.class,
VolumeModule.class
})
public abstract class SystemUIDefaultModule {
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 13067bf..2799301 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -67,8 +67,8 @@
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfComponent;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -131,7 +131,7 @@
WalletModule.class
},
subcomponents = {
- StatusBarComponent.class,
+ CentralSurfacesComponent.class,
NotificationRowComponent.class,
DozeComponent.class,
ExpandableNotificationRowComponent.class,
@@ -175,7 +175,7 @@
abstract Recents optionalRecents();
@BindsOptionalOf
- abstract StatusBar optionalStatusBar();
+ abstract CentralSurfaces optionalCentralSurfaces();
@BindsOptionalOf
abstract UdfpsHbmProvider optionalUdfpsHbmProvider();
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
index 2beed4c..d89c0be 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -31,7 +31,6 @@
boolean isPowerSaveActive();
boolean isPulsingBlocked();
boolean isProvisioned();
- boolean isBlockingDoze();
/**
* Makes a current pulse last for twice as long.
@@ -80,8 +79,9 @@
*/
void stopPulsing();
- /** Returns whether doze is suppressed. */
- boolean isDozeSuppressed();
+ /** Returns whether always-on-display is suppressed. This does not include suppressing
+ * wake-up gestures. */
+ boolean isAlwaysOnSuppressed();
interface Callback {
/**
@@ -97,8 +97,10 @@
*/
default void onPowerSaveChanged(boolean active) {}
- /** Called when the doze suppression state changes. */
- default void onDozeSuppressedChanged(boolean suppressed) {}
+ /**
+ * Called when the always on suppression state changes. See {@link #isAlwaysOnSuppressed()}.
+ */
+ default void onAlwaysOnSuppressedChanged(boolean suppressed) {}
}
interface PulseCallback {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 2511520..0a2e69f 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -132,14 +132,6 @@
}
/**
- * Appends dozing event to the logs
- * @param suppressed true if dozing is suppressed
- */
- public void traceDozingSuppressed(boolean suppressed) {
- mLogger.logDozingSuppressed(suppressed);
- }
-
- /**
* Appends fling event to the logs
*/
public void traceFling(boolean expand, boolean aboveThreshold, boolean thresholdNeeded,
@@ -325,15 +317,40 @@
}
/**
- * Appends doze suppressed event to the logs
+ * Appends the doze state that was suppressed to the doze event log
* @param suppressedState The {@link DozeMachine.State} that was suppressed
*/
- public void traceDozeSuppressed(DozeMachine.State suppressedState) {
- mLogger.logDozeSuppressed(suppressedState);
+ public void traceAlwaysOnSuppressed(DozeMachine.State suppressedState) {
+ mLogger.logAlwaysOnSuppressed(suppressedState);
}
/**
- * Appends new AOD sreen brightness to logs
+ * Appends reason why doze immediately ended.
+ */
+ public void traceImmediatelyEndDoze(String reason) {
+ mLogger.logImmediatelyEndDoze(reason);
+ }
+
+ /**
+ * Appends power save changes that may cause a new doze state
+ * @param powerSaveActive true if power saving is active
+ * @param nextState the state that we'll transition to
+ */
+ public void tracePowerSaveChanged(boolean powerSaveActive, DozeMachine.State nextState) {
+ mLogger.logPowerSaveChanged(powerSaveActive, nextState);
+ }
+
+ /**
+ * Appends an event on AOD suppression change
+ * @param suppressed true if AOD is being suppressed
+ * @param nextState the state that we'll transition to
+ */
+ public void traceAlwaysOnSuppressedChange(boolean suppressed, DozeMachine.State nextState) {
+ mLogger.logAlwaysOnSuppressedChange(suppressed, nextState);
+ }
+
+ /**
+ * Appends new AOD screen brightness to logs
* @param brightness display brightness setting
*/
public void traceDozeScreenBrightness(int brightness) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
index 4ba6b51..f3f6be2 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
@@ -74,11 +74,21 @@
})
}
- fun logDozingSuppressed(isDozingSuppressed: Boolean) {
+ fun logPowerSaveChanged(powerSaveActive: Boolean, nextState: DozeMachine.State) {
buffer.log(TAG, INFO, {
- bool1 = isDozingSuppressed
+ bool1 = powerSaveActive
+ str1 = nextState.name
}, {
- "DozingSuppressed=$bool1"
+ "Power save active=$bool1 nextState=$str1"
+ })
+ }
+
+ fun logAlwaysOnSuppressedChange(isAodSuppressed: Boolean, nextState: DozeMachine.State) {
+ buffer.log(TAG, INFO, {
+ bool1 = isAodSuppressed
+ str1 = nextState.name
+ }, {
+ "Always on (AOD) suppressed changed, suppressed=$bool1 nextState=$str1"
})
}
@@ -257,11 +267,19 @@
})
}
- fun logDozeSuppressed(state: DozeMachine.State) {
+ fun logAlwaysOnSuppressed(state: DozeMachine.State) {
buffer.log(TAG, INFO, {
str1 = state.name
}, {
- "Doze state suppressed, state=$str1"
+ "Always-on state suppressed, suppressed state=$str1"
+ })
+ }
+
+ fun logImmediatelyEndDoze(reason: String) {
+ buffer.log(TAG, INFO, {
+ str1 = reason
+ }, {
+ "Doze immediately ended due to $str1"
})
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 789ad62..ae01f0a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -357,9 +357,9 @@
if (mState == State.FINISH) {
return State.FINISH;
}
- if (mDozeHost.isDozeSuppressed() && requestedState.isAlwaysOn()) {
+ if (mDozeHost.isAlwaysOnSuppressed() && requestedState.isAlwaysOn()) {
Log.i(TAG, "Doze is suppressed. Suppressing state: " + requestedState);
- mDozeLog.traceDozeSuppressed(requestedState);
+ mDozeLog.traceAlwaysOnSuppressed(requestedState);
return State.DOZE;
}
if ((mState == State.DOZE_AOD_PAUSED || mState == State.DOZE_AOD_PAUSING
@@ -415,7 +415,6 @@
pw.print(" state="); pw.println(mState);
pw.print(" wakeLockHeldForCurrentState="); pw.println(mWakeLockHeldForCurrentState);
pw.print(" wakeLock="); pw.println(mWakeLock);
- pw.print(" isDozeSuppressed="); pw.println(mDozeHost.isDozeSuppressed());
pw.println("Parts:");
for (Part p : mParts) {
p.dump(pw);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSuppressor.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSuppressor.java
new file mode 100644
index 0000000..31d43b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSuppressor.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2022 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.doze;
+
+import static android.app.UiModeManager.ACTION_ENTER_CAR_MODE;
+
+import android.app.UiModeManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.hardware.display.AmbientDisplayConfiguration;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.doze.dagger.DozeScope;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+
+import java.io.PrintWriter;
+
+import javax.inject.Inject;
+
+import dagger.Lazy;
+
+/**
+ * Handles suppressing doze on:
+ * 1. INITIALIZED, don't allow dozing at all when:
+ * - in CAR_MODE
+ * - device is NOT provisioned
+ * - there's a pending authentication
+ * 2. PowerSaveMode active
+ * - no always-on-display (DOZE_AOD)
+ * - continues to allow doze triggers (DOZE, DOZE_REQUEST_PULSE)
+ * 3. Suppression changes from the PowerManager API. See {@link PowerManager#suppressAmbientDisplay}
+ * and {@link DozeHost#isAlwaysOnSuppressed()}.
+ * - no always-on-display (DOZE_AOD)
+ * - allow doze triggers (DOZE), but disallow notifications (handled by {@link DozeTriggers})
+ * - See extra check in {@link DozeMachine} to guarantee device never enters always-on states
+ */
+@DozeScope
+public class DozeSuppressor implements DozeMachine.Part {
+ private static final String TAG = "DozeSuppressor";
+
+ private DozeMachine mMachine;
+ private final DozeHost mDozeHost;
+ private final AmbientDisplayConfiguration mConfig;
+ private final DozeLog mDozeLog;
+ private final BroadcastDispatcher mBroadcastDispatcher;
+ private final UiModeManager mUiModeManager;
+ private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
+
+ private boolean mBroadcastReceiverRegistered;
+
+ @Inject
+ public DozeSuppressor(
+ DozeHost dozeHost,
+ AmbientDisplayConfiguration config,
+ DozeLog dozeLog,
+ BroadcastDispatcher broadcastDispatcher,
+ UiModeManager uiModeManager,
+ Lazy<BiometricUnlockController> biometricUnlockControllerLazy) {
+ mDozeHost = dozeHost;
+ mConfig = config;
+ mDozeLog = dozeLog;
+ mBroadcastDispatcher = broadcastDispatcher;
+ mUiModeManager = uiModeManager;
+ mBiometricUnlockControllerLazy = biometricUnlockControllerLazy;
+ }
+
+ @Override
+ public void setDozeMachine(DozeMachine dozeMachine) {
+ mMachine = dozeMachine;
+ }
+
+ @Override
+ public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
+ switch (newState) {
+ case INITIALIZED:
+ registerBroadcastReceiver();
+ mDozeHost.addCallback(mHostCallback);
+ checkShouldImmediatelyEndDoze();
+ break;
+ case FINISH:
+ destroy();
+ break;
+ default:
+ }
+ }
+
+ @Override
+ public void destroy() {
+ unregisterBroadcastReceiver();
+ mDozeHost.removeCallback(mHostCallback);
+ }
+
+ private void checkShouldImmediatelyEndDoze() {
+ String reason = null;
+ if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR) {
+ reason = "car_mode";
+ } else if (!mDozeHost.isProvisioned()) {
+ reason = "device_unprovisioned";
+ } else if (mBiometricUnlockControllerLazy.get().hasPendingAuthentication()) {
+ reason = "has_pending_auth";
+ }
+
+ if (!TextUtils.isEmpty(reason)) {
+ mDozeLog.traceImmediatelyEndDoze(reason);
+ mMachine.requestState(DozeMachine.State.FINISH);
+ }
+ }
+
+ @Override
+ public void dump(PrintWriter pw) {
+ pw.println(" uiMode=" + mUiModeManager.getCurrentModeType());
+ pw.println(" hasPendingAuth="
+ + mBiometricUnlockControllerLazy.get().hasPendingAuthentication());
+ pw.println(" isProvisioned=" + mDozeHost.isProvisioned());
+ pw.println(" isAlwaysOnSuppressed=" + mDozeHost.isAlwaysOnSuppressed());
+ pw.println(" aodPowerSaveActive=" + mDozeHost.isPowerSaveActive());
+ }
+
+ private void registerBroadcastReceiver() {
+ if (mBroadcastReceiverRegistered) {
+ return;
+ }
+ IntentFilter filter = new IntentFilter(ACTION_ENTER_CAR_MODE);
+ mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter);
+ mBroadcastReceiverRegistered = true;
+ }
+
+ private void unregisterBroadcastReceiver() {
+ if (!mBroadcastReceiverRegistered) {
+ return;
+ }
+ mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
+ mBroadcastReceiverRegistered = false;
+ }
+
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_ENTER_CAR_MODE.equals(intent.getAction())) {
+ mDozeLog.traceImmediatelyEndDoze("car_mode");
+ mMachine.requestState(DozeMachine.State.FINISH);
+ }
+ }
+ };
+
+ private DozeHost.Callback mHostCallback = new DozeHost.Callback() {
+ @Override
+ public void onPowerSaveChanged(boolean active) {
+ DozeMachine.State nextState = null;
+ if (mDozeHost.isPowerSaveActive()) {
+ nextState = DozeMachine.State.DOZE;
+ } else if (mMachine.getState() == DozeMachine.State.DOZE
+ && mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) {
+ nextState = DozeMachine.State.DOZE_AOD;
+ }
+
+ if (nextState != null) {
+ mDozeLog.tracePowerSaveChanged(mDozeHost.isPowerSaveActive(), nextState);
+ mMachine.requestState(nextState);
+ }
+ }
+
+ @Override
+ public void onAlwaysOnSuppressedChanged(boolean suppressed) {
+ final DozeMachine.State nextState;
+ if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT) && !suppressed) {
+ nextState = DozeMachine.State.DOZE_AOD;
+ } else {
+ nextState = DozeMachine.State.DOZE;
+ }
+ mDozeLog.traceAlwaysOnSuppressedChange(suppressed, nextState);
+ mMachine.requestState(nextState);
+ }
+ };
+}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 8bff3ba..74044e2 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -17,12 +17,10 @@
package com.android.systemui.doze;
import android.annotation.Nullable;
-import android.app.UiModeManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Configuration;
import android.hardware.display.AmbientDisplayConfiguration;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -88,7 +86,6 @@
private final AsyncSensorManager mSensorManager;
private final WakeLock mWakeLock;
private final boolean mAllowPulseTriggers;
- private final UiModeManager mUiModeManager;
private final TriggerReceiver mBroadcastReceiver = new TriggerReceiver();
private final DockEventListener mDockEventListener = new DockEventListener();
private final DockManager mDockManager;
@@ -203,8 +200,6 @@
mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters,
config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor,
secureSettings, authController, devicePostureController);
-
- mUiModeManager = mContext.getSystemService(UiModeManager.class);
mDockManager = dockManager;
mProxCheck = proxCheck;
mDozeLog = dozeLog;
@@ -247,7 +242,7 @@
mDozeLog.tracePulseDropped("pulseOnNotificationsDisabled");
return;
}
- if (mDozeHost.isDozeSuppressed()) {
+ if (mDozeHost.isAlwaysOnSuppressed()) {
runIfNotNull(onPulseSuppressedListener);
mDozeLog.tracePulseDropped("dozeSuppressed");
return;
@@ -456,10 +451,9 @@
mAodInterruptRunnable = null;
sWakeDisplaySensorState = true;
mBroadcastReceiver.register(mBroadcastDispatcher);
- mDozeHost.addCallback(mHostCallback);
mDockManager.addListener(mDockEventListener);
mDozeSensors.requestTemporaryDisable();
- checkTriggersAtInit();
+ mDozeHost.addCallback(mHostCallback);
break;
case DOZE:
case DOZE_AOD:
@@ -516,15 +510,6 @@
}
}
-
- private void checkTriggersAtInit() {
- if (mUiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR
- || mDozeHost.isBlockingDoze()
- || !mDozeHost.isProvisioned()) {
- mMachine.requestState(DozeMachine.State.FINISH);
- }
- }
-
private void requestPulse(final int reason, boolean performedProxCheck,
Runnable onPulseSuppressedListener) {
Assert.isMainThread();
@@ -608,9 +593,6 @@
requestPulse(DozeLog.PULSE_REASON_INTENT, false, /* performedProxCheck */
null /* onPulseSuppressedListener */);
}
- if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) {
- mMachine.requestState(DozeMachine.State.FINISH);
- }
if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
mDozeSensors.onUserSwitched();
}
@@ -621,7 +603,6 @@
return;
}
IntentFilter filter = new IntentFilter(PULSE_ACTION);
- filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
filter.addAction(Intent.ACTION_USER_SWITCHED);
broadcastDispatcher.registerReceiver(this, filter);
mRegistered = true;
@@ -659,26 +640,5 @@
public void onNotificationAlerted(Runnable onPulseSuppressedListener) {
onNotification(onPulseSuppressedListener);
}
-
- @Override
- public void onPowerSaveChanged(boolean active) {
- if (mDozeHost.isPowerSaveActive()) {
- mMachine.requestState(DozeMachine.State.DOZE);
- } else if (mMachine.getState() == DozeMachine.State.DOZE
- && mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) {
- mMachine.requestState(DozeMachine.State.DOZE_AOD);
- }
- }
-
- @Override
- public void onDozeSuppressedChanged(boolean suppressed) {
- final DozeMachine.State nextState;
- if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT) && !suppressed) {
- nextState = DozeMachine.State.DOZE_AOD;
- } else {
- nextState = DozeMachine.State.DOZE;
- }
- mMachine.requestState(nextState);
- }
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
index 7450103..3d3e4a4 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
@@ -19,6 +19,7 @@
import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
import android.os.Handler;
+import android.util.MathUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -56,9 +57,15 @@
// The interval in milliseconds between burn-in protection updates.
private final long mBurnInProtectionUpdateInterval;
+ // Amount of time in milliseconds to linear interpolate toward the final jitter offset. Once
+ // this time is achieved, the normal jitter algorithm applies in full.
+ private final long mMillisUntilFullJitter;
+
// Main thread handler used to schedule periodic tasks (e.g. burn-in protection updates).
private final Handler mHandler;
+ private long mJitterStartTimeMillis;
+
@Inject
public DreamOverlayContainerViewController(
DreamOverlayContainerView containerView,
@@ -68,7 +75,8 @@
@Main Handler handler,
@Named(DreamOverlayModule.MAX_BURN_IN_OFFSET) int maxBurnInOffset,
@Named(DreamOverlayModule.BURN_IN_PROTECTION_UPDATE_INTERVAL) long
- burnInProtectionUpdateInterval) {
+ burnInProtectionUpdateInterval,
+ @Named(DreamOverlayModule.MILLIS_UNTIL_FULL_JITTER) long millisUntilFullJitter) {
super(containerView);
mDreamOverlayContentView = contentView;
mStatusBarViewController = statusBarViewController;
@@ -86,6 +94,7 @@
mHandler = handler;
mMaxBurnInOffset = maxBurnInOffset;
mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval;
+ mMillisUntilFullJitter = millisUntilFullJitter;
}
@Override
@@ -96,6 +105,7 @@
@Override
protected void onViewAttached() {
+ mJitterStartTimeMillis = System.currentTimeMillis();
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
}
@@ -114,13 +124,24 @@
}
private void updateBurnInOffsets() {
+ int burnInOffset = mMaxBurnInOffset;
+
+ // Make sure the offset starts at zero, to avoid a big jump in the overlay when it first
+ // appears.
+ long millisSinceStart = System.currentTimeMillis() - mJitterStartTimeMillis;
+ if (millisSinceStart < mMillisUntilFullJitter) {
+ float lerpAmount = (float) millisSinceStart / (float) mMillisUntilFullJitter;
+ burnInOffset = Math.round(MathUtils.lerp(0f, burnInOffset, lerpAmount));
+ }
+
// These translation values change slowly, and the set translation methods are idempotent,
// so no translation occurs when the values don't change.
- mView.setTranslationX(getBurnInOffset(mMaxBurnInOffset * 2, true)
- - mMaxBurnInOffset);
-
- mView.setTranslationY(getBurnInOffset(mMaxBurnInOffset * 2, false)
- - mMaxBurnInOffset);
+ int burnInOffsetX = getBurnInOffset(burnInOffset * 2, true)
+ - burnInOffset;
+ int burnInOffsetY = getBurnInOffset(burnInOffset * 2, false)
+ - burnInOffset;
+ mView.setTranslationX(burnInOffsetX);
+ mView.setTranslationY(burnInOffsetY);
mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval);
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarView.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarView.java
index 2d96920..d2ab611 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarView.java
@@ -16,23 +16,44 @@
package com.android.systemui.dreams;
+import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.ImageView;
import androidx.constraintlayout.widget.ConstraintLayout;
-import com.android.internal.util.Preconditions;
import com.android.systemui.R;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
/**
* {@link DreamOverlayStatusBarView} is the view responsible for displaying the status bar in a
* dream. The status bar displays conditional status icons such as "priority mode" and "no wifi".
*/
public class DreamOverlayStatusBarView extends ConstraintLayout {
- private ImageView mWifiStatusView;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = { "STATUS_ICON_" }, value = {
+ STATUS_ICON_NOTIFICATIONS,
+ STATUS_ICON_WIFI_UNAVAILABLE,
+ STATUS_ICON_ALARM_SET,
+ STATUS_ICON_MIC_CAMERA_DISABLED,
+ STATUS_ICON_PRIORITY_MODE_ON
+ })
+ public @interface StatusIconType {}
+ public static final int STATUS_ICON_NOTIFICATIONS = 0;
+ public static final int STATUS_ICON_WIFI_UNAVAILABLE = 1;
+ public static final int STATUS_ICON_ALARM_SET = 2;
+ public static final int STATUS_ICON_MIC_CAMERA_DISABLED = 3;
+ public static final int STATUS_ICON_PRIORITY_MODE_ON = 4;
+
+ private final Map<Integer, View> mStatusIcons = new HashMap<>();
public DreamOverlayStatusBarView(Context context) {
this(context, null);
@@ -55,16 +76,35 @@
protected void onFinishInflate() {
super.onFinishInflate();
- mWifiStatusView = Preconditions.checkNotNull(findViewById(R.id.dream_overlay_wifi_status),
- "R.id.dream_overlay_wifi_status must not be null");
+ mStatusIcons.put(STATUS_ICON_WIFI_UNAVAILABLE,
+ fetchStatusIconForResId(R.id.dream_overlay_wifi_status));
+ mStatusIcons.put(STATUS_ICON_ALARM_SET,
+ fetchStatusIconForResId(R.id.dream_overlay_alarm_set));
+ mStatusIcons.put(STATUS_ICON_MIC_CAMERA_DISABLED,
+ fetchStatusIconForResId(R.id.dream_overlay_camera_mic_off));
+ mStatusIcons.put(STATUS_ICON_NOTIFICATIONS,
+ fetchStatusIconForResId(R.id.dream_overlay_notification_indicator));
+ mStatusIcons.put(STATUS_ICON_PRIORITY_MODE_ON,
+ fetchStatusIconForResId(R.id.dream_overlay_priority_mode));
}
- /**
- * Whether to show the wifi status icon.
- * @param show True if the wifi status icon should be shown.
- */
- void showWifiStatus(boolean show) {
- // Only show the wifi status icon when wifi isn't available.
- mWifiStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
+ void showIcon(@StatusIconType int iconType, boolean show) {
+ showIcon(iconType, show, null);
+ }
+
+ void showIcon(@StatusIconType int iconType, boolean show, @Nullable String contentDescription) {
+ View icon = mStatusIcons.get(iconType);
+ if (icon == null) {
+ return;
+ }
+ if (show && contentDescription != null) {
+ icon.setContentDescription(contentDescription);
+ }
+ icon.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ private View fetchStatusIconForResId(int resId) {
+ final View statusIcon = findViewById(resId);
+ return Objects.requireNonNull(statusIcon);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
index 32b2309..a25a742 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java
@@ -16,19 +16,35 @@
package com.android.systemui.dreams;
-import android.annotation.IntDef;
+import android.app.AlarmManager;
+import android.content.res.Resources;
+import android.hardware.SensorPrivacyManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.service.notification.NotificationListenerService.RankingMap;
+import android.service.notification.StatusBarNotification;
+import android.text.format.DateFormat;
+import android.util.PluralsMessageFormatter;
+import com.android.systemui.R;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
+import com.android.systemui.statusbar.policy.NextAlarmController;
+import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.ViewController;
+import com.android.systemui.util.time.DateFormatUtil;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
+import java.util.Locale;
+import java.util.Map;
import javax.inject.Inject;
@@ -37,19 +53,15 @@
*/
@DreamOverlayComponent.DreamOverlayScope
public class DreamOverlayStatusBarViewController extends ViewController<DreamOverlayStatusBarView> {
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = { "WIFI_STATUS_" }, value = {
- WIFI_STATUS_UNKNOWN,
- WIFI_STATUS_UNAVAILABLE,
- WIFI_STATUS_AVAILABLE
- })
- private @interface WifiStatus {}
- private static final int WIFI_STATUS_UNKNOWN = 0;
- private static final int WIFI_STATUS_UNAVAILABLE = 1;
- private static final int WIFI_STATUS_AVAILABLE = 2;
-
private final ConnectivityManager mConnectivityManager;
private final TouchInsetManager.TouchInsetSession mTouchInsetSession;
+ private final NextAlarmController mNextAlarmController;
+ private final AlarmManager mAlarmManager;
+ private final Resources mResources;
+ private final DateFormatUtil mDateFormatUtil;
+ private final IndividualSensorPrivacyController mSensorPrivacyController;
+ private final NotificationListener mNotificationListener;
+ private final ZenModeController mZenModeController;
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities()
@@ -59,61 +71,183 @@
@Override
public void onCapabilitiesChanged(
Network network, NetworkCapabilities networkCapabilities) {
- onWifiAvailabilityChanged(
- networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
+ updateWifiUnavailableStatusIcon();
}
@Override
public void onAvailable(Network network) {
- onWifiAvailabilityChanged(true);
+ updateWifiUnavailableStatusIcon();
}
@Override
public void onLost(Network network) {
- onWifiAvailabilityChanged(false);
+ updateWifiUnavailableStatusIcon();
}
};
- private @WifiStatus int mWifiStatus = WIFI_STATUS_UNKNOWN;
+ private final IndividualSensorPrivacyController.Callback mSensorCallback =
+ (sensor, blocked) -> updateMicCameraBlockedStatusIcon();
+
+ private final NextAlarmController.NextAlarmChangeCallback mNextAlarmCallback =
+ nextAlarm -> updateAlarmStatusIcon();
+
+ private final NotificationHandler mNotificationHandler = new NotificationHandler() {
+ @Override
+ public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
+ updateNotificationsStatusIcon();
+ }
+
+ @Override
+ public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
+ updateNotificationsStatusIcon();
+ }
+
+ @Override
+ public void onNotificationRemoved(
+ StatusBarNotification sbn,
+ RankingMap rankingMap,
+ int reason) {
+ updateNotificationsStatusIcon();
+ }
+
+ @Override
+ public void onNotificationRankingUpdate(RankingMap rankingMap) {
+ }
+
+ @Override
+ public void onNotificationsInitialized() {
+ updateNotificationsStatusIcon();
+ }
+ };
+
+ private final ZenModeController.Callback mZenModeCallback = new ZenModeController.Callback() {
+ @Override
+ public void onZenChanged(int zen) {
+ updatePriorityModeStatusIcon();
+ }
+ };
@Inject
public DreamOverlayStatusBarViewController(
DreamOverlayStatusBarView view,
+ @Main Resources resources,
ConnectivityManager connectivityManager,
- TouchInsetManager.TouchInsetSession touchInsetSession) {
+ TouchInsetManager.TouchInsetSession touchInsetSession,
+ AlarmManager alarmManager,
+ NextAlarmController nextAlarmController,
+ DateFormatUtil dateFormatUtil,
+ IndividualSensorPrivacyController sensorPrivacyController,
+ NotificationListener notificationListener,
+ ZenModeController zenModeController) {
super(view);
+ mResources = resources;
mConnectivityManager = connectivityManager;
mTouchInsetSession = touchInsetSession;
+ mAlarmManager = alarmManager;
+ mNextAlarmController = nextAlarmController;
+ mDateFormatUtil = dateFormatUtil;
+ mSensorPrivacyController = sensorPrivacyController;
+ mNotificationListener = notificationListener;
+ mZenModeController = zenModeController;
+
+ // Handlers can be added to NotificationListener, but apparently they can't be removed. So
+ // add the handler here in the constructor rather than in onViewAttached to avoid confusion.
+ mNotificationListener.addNotificationHandler(mNotificationHandler);
}
@Override
protected void onViewAttached() {
- mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+ updateNotificationsStatusIcon();
- NetworkCapabilities capabilities =
- mConnectivityManager.getNetworkCapabilities(
- mConnectivityManager.getActiveNetwork());
- onWifiAvailabilityChanged(
- capabilities != null
- && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
+ mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+ updateWifiUnavailableStatusIcon();
+
+ mNextAlarmController.addCallback(mNextAlarmCallback);
+ updateAlarmStatusIcon();
+
+ mSensorPrivacyController.addCallback(mSensorCallback);
+ updateMicCameraBlockedStatusIcon();
+
+ mZenModeController.addCallback(mZenModeCallback);
+ updatePriorityModeStatusIcon();
+
mTouchInsetSession.addViewToTracking(mView);
}
@Override
protected void onViewDetached() {
+ mZenModeController.removeCallback(mZenModeCallback);
+ mSensorPrivacyController.removeCallback(mSensorCallback);
+ mNextAlarmController.removeCallback(mNextAlarmCallback);
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
mTouchInsetSession.clear();
}
- /**
- * Wifi availability has changed. Update the wifi status icon as appropriate.
- * @param available Whether wifi is available.
- */
- private void onWifiAvailabilityChanged(boolean available) {
- final int newWifiStatus = available ? WIFI_STATUS_AVAILABLE : WIFI_STATUS_UNAVAILABLE;
- if (mWifiStatus != newWifiStatus) {
- mWifiStatus = newWifiStatus;
- mView.showWifiStatus(mWifiStatus == WIFI_STATUS_UNAVAILABLE);
+ private void updateWifiUnavailableStatusIcon() {
+ final NetworkCapabilities capabilities =
+ mConnectivityManager.getNetworkCapabilities(
+ mConnectivityManager.getActiveNetwork());
+ final boolean available = capabilities != null
+ && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
+ mView.showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, !available);
+ }
+
+ private void updateAlarmStatusIcon() {
+ final AlarmManager.AlarmClockInfo alarm =
+ mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
+ final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;
+ mView.showIcon(
+ DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET,
+ hasAlarm,
+ hasAlarm ? buildAlarmContentDescription(alarm) : null);
+ }
+
+ private String buildAlarmContentDescription(AlarmManager.AlarmClockInfo alarm) {
+ final String skeleton = mDateFormatUtil.is24HourFormat() ? "EHm" : "Ehma";
+ final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
+ final String dateString = DateFormat.format(pattern, alarm.getTriggerTime()).toString();
+
+ return mResources.getString(R.string.accessibility_quick_settings_alarm, dateString);
+ }
+
+ private void updateMicCameraBlockedStatusIcon() {
+ final boolean micBlocked = mSensorPrivacyController
+ .isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE);
+ final boolean cameraBlocked = mSensorPrivacyController
+ .isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA);
+ mView.showIcon(
+ DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED,
+ micBlocked && cameraBlocked);
+ }
+
+ private void updateNotificationsStatusIcon() {
+ if (mView == null) {
+ // It is possible for this method to be called before the view is attached, which makes
+ // null-checking necessary.
+ return;
}
+
+ final StatusBarNotification[] notifications =
+ mNotificationListener.getActiveNotifications();
+ final int notificationCount = notifications != null ? notifications.length : 0;
+ mView.showIcon(
+ DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS,
+ notificationCount > 0,
+ notificationCount > 0
+ ? buildNotificationsContentDescription(notificationCount)
+ : null);
+ }
+
+ private String buildNotificationsContentDescription(int notificationCount) {
+ return PluralsMessageFormatter.format(
+ mResources,
+ Map.of("count", notificationCount),
+ R.string.dream_overlay_status_bar_notification_indicator);
+ }
+
+ private void updatePriorityModeStatusIcon() {
+ mView.showIcon(
+ DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON,
+ mZenModeController.getZen() != Settings.Global.ZEN_MODE_OFF);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamPreviewComplication.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamPreviewComplication.java
index 23343b1..cc2e571 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamPreviewComplication.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamPreviewComplication.java
@@ -20,6 +20,8 @@
import static com.android.systemui.dreams.complication.dagger.DreamPreviewComplicationComponent.DreamPreviewComplicationModule.DREAM_PREVIEW_COMPLICATION_LAYOUT_PARAMS;
import static com.android.systemui.dreams.complication.dagger.DreamPreviewComplicationComponent.DreamPreviewComplicationModule.DREAM_PREVIEW_COMPLICATION_VIEW;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
@@ -86,6 +88,11 @@
if (!TextUtils.isEmpty(dreamLabel)) {
mView.setText(dreamLabel);
}
+ for (Drawable drawable : mView.getCompoundDrawablesRelative()) {
+ if (drawable instanceof BitmapDrawable) {
+ drawable.setAutoMirrored(true);
+ }
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
index 63676d6..4fe1622 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
@@ -46,6 +46,7 @@
public static final String MAX_BURN_IN_OFFSET = "max_burn_in_offset";
public static final String BURN_IN_PROTECTION_UPDATE_INTERVAL =
"burn_in_protection_update_interval";
+ public static final String MILLIS_UNTIL_FULL_JITTER = "millis_until_full_jitter";
/** */
@Provides
@@ -106,6 +107,13 @@
R.integer.config_dreamOverlayBurnInProtectionUpdateIntervalMillis);
}
+ /** */
+ @Provides
+ @Named(MILLIS_UNTIL_FULL_JITTER)
+ static long providesMillisUntilFullJitter(@Main Resources resources) {
+ return resources.getInteger(R.integer.config_dreamOverlayMillisUntilFullJitter);
+ }
+
@Provides
@DreamOverlayComponent.DreamOverlayScope
static LifecycleOwner providesLifecycleOwner(Lazy<LifecycleRegistry> lifecycleRegistryLazy) {
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
index d16c8c8..e140f6b 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
@@ -21,6 +21,9 @@
import static com.android.systemui.dreams.touch.dagger.BouncerSwipeModule.SWIPE_TO_BOUNCER_START_REGION;
import android.animation.ValueAnimator;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.InputEvent;
@@ -29,7 +32,7 @@
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.wm.shell.animation.FlingAnimationUtils;
@@ -68,13 +71,15 @@
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private float mCurrentExpansion;
- private final StatusBar mStatusBar;
+ private final CentralSurfaces mCentralSurfaces;
private VelocityTracker mVelocityTracker;
private final FlingAnimationUtils mFlingAnimationUtils;
private final FlingAnimationUtils mFlingAnimationUtilsClosing;
+ private final DisplayMetrics mDisplayMetrics;
+
private Boolean mCapture;
private TouchSession mTouchSession;
@@ -85,40 +90,9 @@
private final GestureDetector.OnGestureListener mOnGestureListener =
new GestureDetector.SimpleOnGestureListener() {
- boolean mTrack;
- boolean mBouncerPresent;
-
- @Override
- public boolean onDown(MotionEvent e) {
- // We only consider gestures that originate from the lower portion of the
- // screen.
- final float displayHeight = mStatusBar.getDisplayHeight();
-
- mBouncerPresent = mStatusBar.isBouncerShowing();
-
- // The target zone is either at the top or bottom of the screen, dependent on
- // whether the bouncer is present.
- final float zonePercentage =
- Math.abs(e.getY() - (mBouncerPresent ? 0 : displayHeight))
- / displayHeight;
-
- mTrack = zonePercentage < mBouncerZoneScreenPercentage;
-
- // Never capture onDown. While this might lead to some false positive touches
- // being sent to other windows/layers, this is necessary to make sure the
- // proper touch event sequence is received by others in the event we do not
- // consume the sequence here.
- return false;
- }
-
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
- // Do not handle scroll gestures if not tracking touch events.
- if (!mTrack) {
- return false;
- }
-
if (mCapture == null) {
// If the user scrolling favors a vertical direction, begin capturing
// scrolls.
@@ -140,10 +114,9 @@
// is fully hidden at full expansion (1) and fully visible when fully collapsed
// (0).
final float screenTravelPercentage =
- Math.abs((e1.getY() - e2.getY()) / mStatusBar.getDisplayHeight());
- setPanelExpansion(
- mBouncerPresent ? screenTravelPercentage : 1 - screenTravelPercentage);
-
+ Math.abs((e1.getY() - e2.getY()) / mCentralSurfaces.getDisplayHeight());
+ setPanelExpansion(mCentralSurfaces.isBouncerShowing()
+ ? screenTravelPercentage : 1 - screenTravelPercentage);
return true;
}
};
@@ -155,8 +128,9 @@
@Inject
public BouncerSwipeTouchHandler(
+ DisplayMetrics displayMetrics,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
NotificationShadeWindowController notificationShadeWindowController,
ValueAnimatorCreator valueAnimatorCreator,
VelocityTrackerFactory velocityTrackerFactory,
@@ -165,7 +139,8 @@
@Named(SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_OPENING)
FlingAnimationUtils flingAnimationUtilsClosing,
@Named(SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage) {
- mStatusBar = statusBar;
+ mDisplayMetrics = displayMetrics;
+ mCentralSurfaces = centralSurfaces;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mNotificationShadeWindowController = notificationShadeWindowController;
mBouncerZoneScreenPercentage = swipeRegionPercentage;
@@ -176,6 +151,21 @@
}
@Override
+ public void getTouchInitiationRegion(Region region) {
+ if (mCentralSurfaces.isBouncerShowing()) {
+ region.op(new Rect(0, 0, mDisplayMetrics.widthPixels,
+ Math.round(mDisplayMetrics.heightPixels * mBouncerZoneScreenPercentage)),
+ Region.Op.UNION);
+ } else {
+ region.op(new Rect(0,
+ Math.round(mDisplayMetrics.heightPixels * (1 - mBouncerZoneScreenPercentage)),
+ mDisplayMetrics.widthPixels,
+ mDisplayMetrics.heightPixels),
+ Region.Op.UNION);
+ }
+ }
+
+ @Override
public void onSessionStart(TouchSession session) {
mVelocityTracker = mVelocityTrackerFactory.obtain();
mTouchSession = session;
@@ -202,7 +192,9 @@
final MotionEvent motionEvent = (MotionEvent) event;
switch(motionEvent.getAction()) {
+ case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
+ mTouchSession.pop();
// If we are not capturing any input, there is no need to consider animating to
// finish transition.
if (mCapture == null || !mCapture) {
@@ -226,7 +218,6 @@
if (expansion == KeyguardBouncer.EXPANSION_HIDDEN) {
mStatusBarKeyguardViewManager.reset(false);
}
- mTouchSession.pop();
break;
default:
mVelocityTracker.addMovement(motionEvent);
@@ -255,7 +246,7 @@
}
protected void flingToExpansion(float velocity, float expansion) {
- final float viewHeight = mStatusBar.getDisplayHeight();
+ final float viewHeight = mCentralSurfaces.getDisplayHeight();
final float currentHeight = viewHeight * mCurrentExpansion;
final float targetHeight = viewHeight * expansion;
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
index 3e5efb2..695b59a 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
@@ -16,6 +16,7 @@
package com.android.systemui.dreams.touch;
+import android.graphics.Region;
import android.view.GestureDetector;
import android.view.InputEvent;
import android.view.MotionEvent;
@@ -34,6 +35,7 @@
import com.google.common.util.concurrent.ListenableFuture;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -100,6 +102,10 @@
});
}
+ private int getSessionCount() {
+ return mActiveTouchSessions.size();
+ }
+
/**
* {@link TouchSessionImpl} implements {@link DreamTouchHandler.TouchSession} for
* {@link DreamOverlayTouchMonitor}. It enables the monitor to access the associated listeners
@@ -146,6 +152,11 @@
return mTouchMonitor.pop(this);
}
+ @Override
+ public int getActiveSessionCount() {
+ return mTouchMonitor.getSessionCount();
+ }
+
/**
* Returns the active listeners to receive touch events.
*/
@@ -229,12 +240,39 @@
public void onInputEvent(InputEvent ev) {
// No Active sessions are receiving touches. Create sessions for each listener
if (mActiveTouchSessions.isEmpty()) {
+ final HashMap<DreamTouchHandler, DreamTouchHandler.TouchSession> sessionMap =
+ new HashMap<>();
+
for (DreamTouchHandler handler : mHandlers) {
+ final Region initiationRegion = Region.obtain();
+ handler.getTouchInitiationRegion(initiationRegion);
+
+ if (!initiationRegion.isEmpty()) {
+ // Initiation regions require a motion event to determine pointer location
+ // within the region.
+ if (!(ev instanceof MotionEvent)) {
+ continue;
+ }
+
+ final MotionEvent motionEvent = (MotionEvent) ev;
+
+ // If the touch event is outside the region, then ignore.
+ if (!initiationRegion.contains(Math.round(motionEvent.getX()),
+ Math.round(motionEvent.getY()))) {
+ continue;
+ }
+ }
+
final TouchSessionImpl sessionStack =
new TouchSessionImpl(DreamOverlayTouchMonitor.this, null);
mActiveTouchSessions.add(sessionStack);
- handler.onSessionStart(sessionStack);
+ sessionMap.put(handler, sessionStack);
}
+
+ // Informing handlers of new sessions is delayed until we have all created so the
+ // final session is correct.
+ sessionMap.forEach((dreamTouchHandler, touchSession)
+ -> dreamTouchHandler.onSessionStart(touchSession));
}
// Find active sessions and invoke on InputEvent.
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
index c73ff73..20008d5 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
@@ -16,6 +16,7 @@
package com.android.systemui.dreams.touch;
+import android.graphics.Region;
import android.view.GestureDetector;
import com.android.systemui.shared.system.InputChannelCompat;
@@ -71,6 +72,19 @@
* if the popped {@link TouchSession} was the initial session or has already been popped.
*/
ListenableFuture<TouchSession> pop();
+
+ /**
+ * Returns the number of currently active sessions.
+ */
+ int getActiveSessionCount();
+ }
+
+ /**
+ * Returns the region the touch handler is interested in. By default, no region is specified,
+ * indicating the entire screen should be considered.
+ * @param region A {@link Region} that is passed in to the target entry touch region.
+ */
+ default void getTouchInitiationRegion(Region region) {
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
index 6779904..0c5f7eb 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java
@@ -317,6 +317,8 @@
// Store SysProp flags in SystemProperties where they can read by outside parties.
mSystemProperties.setBoolean(
((SysPropBooleanFlag) flag).getName(), (Boolean) value);
+ dispatchListenersAndMaybeRestart(flag.getId(),
+ FeatureFlagsDebug.this::restartAndroid);
} else if (flag instanceof StringFlag && value instanceof String) {
setFlagValue(id, (String) value, StringFlagSerializer.INSTANCE);
} else if (flag instanceof ResourceStringFlag && value instanceof String) {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
index e746caf..74d5bd5 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
@@ -33,7 +33,7 @@
import javax.inject.Provider;
/**
- * Manages power menu plugins and communicates power menu actions to the StatusBar.
+ * Manages power menu plugins and communicates power menu actions to the CentralSurfaces.
*/
@SysUISingleton
public class GlobalActionsComponent extends CoreStartable
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index e3886cd..7a278f7 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -121,7 +121,7 @@
import com.android.systemui.scrim.ScrimDrawable;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -236,7 +236,7 @@
private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms
protected Handler mMainHandler;
private int mSmallestScreenWidthDp;
- private final Optional<StatusBar> mStatusBarOptional;
+ private final Optional<CentralSurfaces> mCentralSurfacesOptional;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final DialogLaunchAnimator mDialogLaunchAnimator;
@@ -344,7 +344,7 @@
RingerModeTracker ringerModeTracker,
@Main Handler handler,
PackageManager packageManager,
- Optional<StatusBar> statusBarOptional,
+ Optional<CentralSurfaces> centralSurfacesOptional,
KeyguardUpdateMonitor keyguardUpdateMonitor,
DialogLaunchAnimator dialogLaunchAnimator) {
mContext = context;
@@ -374,7 +374,7 @@
mRingerModeTracker = ringerModeTracker;
mMainHandler = handler;
mSmallestScreenWidthDp = resources.getConfiguration().smallestScreenWidthDp;
- mStatusBarOptional = statusBarOptional;
+ mCentralSurfacesOptional = centralSurfacesOptional;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mDialogLaunchAnimator = dialogLaunchAnimator;
@@ -426,8 +426,8 @@
return mUiEventLogger;
}
- protected Optional<StatusBar> getStatusBar() {
- return mStatusBarOptional;
+ protected Optional<CentralSurfaces> getCentralSurfaces() {
+ return mCentralSurfacesOptional;
}
protected KeyguardUpdateMonitor getKeyguardUpdateMonitor() {
@@ -675,7 +675,7 @@
com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
- mPowerAdapter, mUiEventLogger, mStatusBarOptional, mKeyguardUpdateMonitor,
+ mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
mLockPatternUtils);
dialog.setOnDismissListener(this);
@@ -866,7 +866,7 @@
mUiEventLogger.log(GlobalActionsEvent.GA_EMERGENCY_DIALER_PRESS);
if (mTelecomManager != null) {
// Close shade so user sees the activity
- mStatusBarOptional.ifPresent(StatusBar::collapseShade);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::collapseShade);
Intent intent = mTelecomManager.createLaunchEmergencyDialerIntent(
null /* number */);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
@@ -998,7 +998,7 @@
mIActivityManager.requestInteractiveBugReport();
}
// Close shade so user sees the activity
- mStatusBarOptional.ifPresent(StatusBar::collapseShade);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::collapseShade);
} catch (RemoteException e) {
}
}
@@ -1018,7 +1018,7 @@
mUiEventLogger.log(GlobalActionsEvent.GA_BUGREPORT_LONG_PRESS);
mIActivityManager.requestFullBugReport();
// Close shade so user sees the activity
- mStatusBarOptional.ifPresent(StatusBar::collapseShade);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::collapseShade);
} catch (RemoteException e) {
}
return false;
@@ -2160,7 +2160,7 @@
protected final Runnable mOnRefreshCallback;
private UiEventLogger mUiEventLogger;
private GestureDetector mGestureDetector;
- private Optional<StatusBar> mStatusBarOptional;
+ private Optional<CentralSurfaces> mCentralSurfacesOptional;
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private LockPatternUtils mLockPatternUtils;
private float mWindowDimAmount;
@@ -2188,8 +2188,8 @@
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
if (distanceY < 0 && distanceY > distanceX
- && e1.getY() <= mStatusBarOptional.map(
- StatusBar::getStatusBarHeight).orElse(0)) {
+ && e1.getY() <= mCentralSurfacesOptional.map(
+ CentralSurfaces::getStatusBarHeight).orElse(0)) {
// Downwards scroll from top
openShadeAndDismiss();
return true;
@@ -2201,8 +2201,8 @@
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (velocityY > 0 && Math.abs(velocityY) > Math.abs(velocityX)
- && e1.getY() <= mStatusBarOptional.map(
- StatusBar::getStatusBarHeight).orElse(0)) {
+ && e1.getY() <= mCentralSurfacesOptional.map(
+ CentralSurfaces::getStatusBarHeight).orElse(0)) {
// Downwards fling from top
openShadeAndDismiss();
return true;
@@ -2217,7 +2217,8 @@
NotificationShadeWindowController notificationShadeWindowController,
Runnable onRefreshCallback, boolean keyguardShowing,
MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
- Optional<StatusBar> statusBarOptional, KeyguardUpdateMonitor keyguardUpdateMonitor,
+ Optional<CentralSurfaces> centralSurfacesOptional,
+ KeyguardUpdateMonitor keyguardUpdateMonitor,
LockPatternUtils lockPatternUtils) {
// We set dismissOnDeviceLock to false because we have a custom broadcast receiver to
// dismiss this dialog when the device is locked.
@@ -2232,7 +2233,7 @@
mOnRefreshCallback = onRefreshCallback;
mKeyguardShowing = keyguardShowing;
mUiEventLogger = uiEventLogger;
- mStatusBarOptional = statusBarOptional;
+ mCentralSurfacesOptional = centralSurfacesOptional;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockPatternUtils = lockPatternUtils;
mGestureDetector = new GestureDetector(mContext, mGestureListener);
@@ -2262,14 +2263,14 @@
private void openShadeAndDismiss() {
mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE);
- if (mStatusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
+ if (mCentralSurfacesOptional.map(CentralSurfaces::isKeyguardShowing).orElse(false)) {
// match existing lockscreen behavior to open QS when swiping from status bar
- mStatusBarOptional.ifPresent(
- statusBar -> statusBar.animateExpandSettingsPanel(null));
+ mCentralSurfacesOptional.ifPresent(
+ centralSurfaces -> centralSurfaces.animateExpandSettingsPanel(null));
} else {
// otherwise, swiping down should expand notification shade
- mStatusBarOptional.ifPresent(
- statusBar -> statusBar.animateExpandNotificationsPanel());
+ mCentralSurfacesOptional.ifPresent(
+ centralSurfaces -> centralSurfaces.animateExpandNotificationsPanel());
}
dismiss();
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardLifecyclesDispatcher.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardLifecyclesDispatcher.java
index 32b58c2..822b1cf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardLifecyclesDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardLifecyclesDispatcher.java
@@ -18,8 +18,8 @@
import android.os.Handler;
import android.os.Message;
-import android.os.PowerManager;
import android.os.RemoteException;
+import android.os.Trace;
import android.util.Log;
import com.android.internal.policy.IKeyguardDrawnCallback;
@@ -83,6 +83,11 @@
final Object obj = msg.obj;
switch (msg.what) {
case SCREEN_TURNING_ON:
+ Trace.beginSection("KeyguardLifecyclesDispatcher#SCREEN_TURNING_ON");
+ final String onDrawWaitingTraceTag =
+ "Waiting for KeyguardDrawnCallback#onDrawn";
+ int traceCookie = System.identityHashCode(msg);
+ Trace.beginAsyncSection(onDrawWaitingTraceTag, traceCookie);
// Ensure the drawn callback is only ever called once
mScreenLifecycle.dispatchScreenTurningOn(new Runnable() {
boolean mInvoked;
@@ -92,6 +97,7 @@
if (!mInvoked) {
mInvoked = true;
try {
+ Trace.endAsyncSection(onDrawWaitingTraceTag, traceCookie);
((IKeyguardDrawnCallback) obj).onDrawn();
} catch (RemoteException e) {
Log.w(TAG, "Exception calling onDrawn():", e);
@@ -101,6 +107,7 @@
}
}
});
+ Trace.endSection();
break;
case SCREEN_TURNED_ON:
mScreenLifecycle.dispatchScreenTurnedOn();
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index ae7147e..07dfa33 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -127,7 +127,7 @@
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
@@ -2717,22 +2717,22 @@
}
/**
- * Registers the StatusBar to which the Keyguard View is mounted.
+ * Registers the CentralSurfaces to which the Keyguard View is mounted.
*
- * @param statusBar
+ * @param centralSurfaces
* @param panelView
* @param biometricUnlockController
* @param notificationContainer
* @param bypassController
* @return the View Controller for the Keyguard View this class is mediating.
*/
- public KeyguardViewController registerStatusBar(StatusBar statusBar,
+ public KeyguardViewController registerCentralSurfaces(CentralSurfaces centralSurfaces,
NotificationPanelViewController panelView,
@Nullable PanelExpansionStateManager panelExpansionStateManager,
BiometricUnlockController biometricUnlockController,
View notificationContainer, KeyguardBypassController bypassController) {
- mKeyguardViewControllerLazy.get().registerStatusBar(
- statusBar,
+ mKeyguardViewControllerLazy.get().registerCentralSurfaces(
+ centralSurfaces,
panelView,
panelExpansionStateManager,
biometricUnlockController,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
index 195ef1a..c69f947 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java
@@ -48,10 +48,10 @@
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.util.DeviceConfigProxy;
@@ -64,7 +64,7 @@
import dagger.Provides;
/**
- * Dagger Module providing {@link StatusBar}.
+ * Dagger Module providing keyguard.
*/
@Module(subcomponents = {
KeyguardQsUserSwitchComponent.class,
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
index 7b85050..fab06c2 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt
@@ -550,13 +550,13 @@
// Album art
val notif: Notification = sbn.notification
- var artworkBitmap = metadata?.getBitmap(MediaMetadata.METADATA_KEY_ART)
+ var artworkBitmap = metadata?.let { loadBitmapFromUri(it) }
+ if (artworkBitmap == null) {
+ artworkBitmap = metadata?.getBitmap(MediaMetadata.METADATA_KEY_ART)
+ }
if (artworkBitmap == null) {
artworkBitmap = metadata?.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART)
}
- if (artworkBitmap == null && metadata != null) {
- artworkBitmap = loadBitmapFromUri(metadata)
- }
val artWorkIcon = if (artworkBitmap == null) {
notif.getLargeIcon()
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
index f4b6fbd..c6f716c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
@@ -785,7 +785,11 @@
* @return true if this transformation is guided by an external progress like a finger
*/
private fun isCurrentlyInGuidedTransformation(): Boolean {
- return getTransformationProgress() >= 0
+ return hasValidStartAndEndLocations() && getTransformationProgress() >= 0
+ }
+
+ private fun hasValidStartAndEndLocations(): Boolean {
+ return previousLocation != -1 && desiredLocation != -1
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
index e2716e9..77873e8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
@@ -38,12 +38,10 @@
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.util.Log;
-import android.view.View;
import android.view.Window;
-import android.view.WindowManager;
-import android.widget.TextView;
import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.util.Utils;
public class MediaProjectionPermissionActivity extends Activity
@@ -56,7 +54,7 @@
private int mUid;
private IMediaProjectionManager mService;
- private AlertDialog mDialog;
+ private SystemUIDialog mDialog;
@Override
public void onCreate(Bundle icicle) {
@@ -143,25 +141,18 @@
dialogTitle = getString(R.string.media_projection_dialog_title, appName);
}
- View dialogTitleView = View.inflate(this, R.layout.media_projection_dialog_title, null);
- TextView titleText = (TextView) dialogTitleView.findViewById(R.id.dialog_title);
- titleText.setText(dialogTitle);
-
- mDialog = new AlertDialog.Builder(this)
- .setCustomTitle(dialogTitleView)
- .setMessage(dialogText)
- .setPositiveButton(R.string.media_projection_action_text, this)
- .setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
- .create();
+ mDialog = new SystemUIDialog(this);
+ mDialog.setTitle(dialogTitle);
+ mDialog.setIcon(R.drawable.ic_media_projection_permission);
+ mDialog.setMessage(dialogText);
+ mDialog.setPositiveButton(R.string.media_projection_action_text, this);
+ mDialog.setNeutralButton(android.R.string.cancel, this);
+ mDialog.setOnCancelListener(this);
mDialog.create();
mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setFilterTouchesWhenObscured(true);
final Window w = mDialog.getWindow();
- // QS is not closed when pressing CastTile. Match the type of the dialog shown from the
- // tile.
- w.setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
w.addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mDialog.show();
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
index 6ec2b6e..15b8f13 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommon.kt
@@ -22,6 +22,7 @@
import android.graphics.PixelFormat
import android.view.Gravity
import android.view.LayoutInflater
+import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
@@ -31,6 +32,7 @@
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.gesture.TapGestureDetector
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.view.ViewUtil
/**
* A superclass controller that provides common functionality for showing chips on the sender device
@@ -42,6 +44,7 @@
abstract class MediaTttChipControllerCommon<T : MediaTttChipState>(
internal val context: Context,
private val windowManager: WindowManager,
+ private val viewUtil: ViewUtil,
@Main private val mainExecutor: DelayableExecutor,
private val tapGestureDetector: TapGestureDetector,
@LayoutRes private val chipLayoutRes: Int
@@ -84,7 +87,7 @@
// Add view if necessary
if (oldChipView == null) {
- tapGestureDetector.addOnGestureDetectedCallback(TAG, this::removeChip)
+ tapGestureDetector.addOnGestureDetectedCallback(TAG, this::onScreenTapped)
windowManager.addView(chipView, windowLayoutParams)
}
@@ -127,6 +130,15 @@
appIconView.setImageDrawable(appIcon)
appIconView.visibility = visibility
}
+
+ private fun onScreenTapped(e: MotionEvent) {
+ val view = chipView ?: return
+ // If the tap is within the chip bounds, we shouldn't hide the chip (in case users think the
+ // chip is tappable).
+ if (!viewUtil.touchIsWithinView(view, e.x, e.y)) {
+ removeChip()
+ }
+ }
}
// Used in CTS tests UpdateMediaTapToTransferSenderDisplayTest and
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
index b6f1aea..3d43ebe 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
@@ -31,6 +31,7 @@
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.gesture.TapGestureDetector
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.view.ViewUtil
import javax.inject.Inject
/**
@@ -43,11 +44,17 @@
commandQueue: CommandQueue,
context: Context,
windowManager: WindowManager,
+ viewUtil: ViewUtil,
mainExecutor: DelayableExecutor,
tapGestureDetector: TapGestureDetector,
@Main private val mainHandler: Handler,
) : MediaTttChipControllerCommon<ChipStateReceiver>(
- context, windowManager, mainExecutor, tapGestureDetector, R.layout.media_ttt_chip_receiver
+ context,
+ windowManager,
+ viewUtil,
+ mainExecutor,
+ tapGestureDetector,
+ R.layout.media_ttt_chip_receiver
) {
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferReceiverDisplay(
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
index fef17fdc..180e4ee 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSender.kt
@@ -32,6 +32,7 @@
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.gesture.TapGestureDetector
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.view.ViewUtil
import javax.inject.Inject
/**
@@ -43,10 +44,11 @@
commandQueue: CommandQueue,
context: Context,
windowManager: WindowManager,
+ viewUtil: ViewUtil,
@Main mainExecutor: DelayableExecutor,
tapGestureDetector: TapGestureDetector,
) : MediaTttChipControllerCommon<ChipStateSender>(
- context, windowManager, mainExecutor, tapGestureDetector, R.layout.media_ttt_chip
+ context, windowManager, viewUtil, mainExecutor, tapGestureDetector, R.layout.media_ttt_chip
) {
private val commandQueueCallbacks = object : CommandQueue.Callbacks {
override fun updateMediaTapToTransferSenderDisplay(
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
index 5e9edb7..a1a3198 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
@@ -49,8 +49,7 @@
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.system.QuickStepContract;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -79,7 +78,7 @@
Dumpable {
private final AccessibilityManager mAccessibilityManager;
private final Lazy<AssistManager> mAssistManagerLazy;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final UserTracker mUserTracker;
private final SystemActions mSystemActions;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
@@ -113,7 +112,7 @@
SystemActions systemActions,
OverviewProxyService overviewProxyService,
Lazy<AssistManager> assistManagerLazy,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
NavigationModeController navigationModeController,
UserTracker userTracker,
DumpManager dumpManager) {
@@ -121,7 +120,7 @@
mContentResolver = mContext.getContentResolver();
mAccessibilityManager = accessibilityManager;
mAssistManagerLazy = assistManagerLazy;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mUserTracker = userTracker;
mSystemActions = systemActions;
accessibilityManager.addAccessibilityServicesStateChangeListener(
@@ -295,8 +294,8 @@
* {@link InputMethodService} and the keyguard states.
*/
public boolean isImeShown(int vis) {
- View shadeWindowView = mStatusBarOptionalLazy.get().get().getNotificationShadeWindowView();
- boolean isKeyguardShowing = mStatusBarOptionalLazy.get().get().isKeyguardShowing();
+ View shadeWindowView = mCentralSurfacesOptionalLazy.get().get().getNotificationShadeWindowView();
+ boolean isKeyguardShowing = mCentralSurfacesOptionalLazy.get().get().isKeyguardShowing();
boolean imeVisibleOnShade = shadeWindowView != null && shadeWindowView.isAttachedToWindow()
&& shadeWindowView.getRootWindowInsets().isVisible(WindowInsets.Type.ime());
return imeVisibleOnShade
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index a242df3..3ab1216 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -53,11 +53,10 @@
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_WINDOW_STATE;
-import static com.android.systemui.statusbar.phone.StatusBar.dumpBarTransitions;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG_WINDOW_STATE;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.dumpBarTransitions;
import android.annotation.IdRes;
-import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.app.StatusBarManager;
@@ -135,12 +134,11 @@
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.back.BackAnimation;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.PrintWriter;
@@ -178,7 +176,7 @@
private final MetricsLogger mMetricsLogger;
private final Lazy<AssistManager> mAssistManagerLazy;
private final SysUiState mSysUiFlagsContainer;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final ShadeController mShadeController;
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final OverviewProxyService mOverviewProxyService;
@@ -187,7 +185,6 @@
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional;
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final Optional<Recents> mRecentsOptional;
private final Optional<BackAnimation> mBackAnimation;
private final Handler mHandler;
@@ -488,9 +485,8 @@
BroadcastDispatcher broadcastDispatcher,
CommandQueue commandQueue,
Optional<Pip> pipOptional,
- Optional<LegacySplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
@@ -513,7 +509,7 @@
mMetricsLogger = metricsLogger;
mAssistManagerLazy = assistManagerLazy;
mSysUiFlagsContainer = sysUiFlagsContainer;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mShadeController = shadeController;
mNotificationRemoteInputManager = notificationRemoteInputManager;
mOverviewProxyService = overviewProxyService;
@@ -522,7 +518,6 @@
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
- mSplitScreenOptional = splitScreenOptional;
mRecentsOptional = recentsOptional;
mBackAnimation = backAnimation;
mHandler = mainHandler;
@@ -616,7 +611,7 @@
public void onViewAttachedToWindow(View v) {
final Display display = v.getDisplay();
mNavigationBarView.setComponents(mRecentsOptional);
- mNavigationBarView.setComponents(mStatusBarOptionalLazy.get().get().getPanelController());
+ mNavigationBarView.setComponents(mCentralSurfacesOptionalLazy.get().get().getPanelController());
mNavigationBarView.setDisabledFlags(mDisabledFlags1);
mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
mNavigationBarView.setOnTouchListener(this::onNavigationTouch);
@@ -629,7 +624,6 @@
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
- mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener);
mPipOptional.ifPresent(mNavigationBarView::addPipExclusionBoundsChangeListener);
mBackAnimation.ifPresent(mNavigationBarView::registerBackAnimation);
@@ -788,10 +782,7 @@
return;
}
- if (mStartingQuickSwitchRotation == -1 || mSplitScreenOptional
- .map(LegacySplitScreen::isDividerVisible).orElse(false)) {
- // Hide the secondary home handle if we are in multiwindow since apps in multiwindow
- // aren't allowed to set the display orientation
+ if (mStartingQuickSwitchRotation == -1) {
resetSecondaryHandle();
} else {
int deltaRotation = deltaRotation(mCurrentRotation, mStartingQuickSwitchRotation);
@@ -1174,13 +1165,14 @@
// If an incoming call is ringing, HOME is totally disabled.
// (The user is already on the InCallUI at this point,
// and their ONLY options are to answer or reject the call.)
- final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
+ final Optional<CentralSurfaces> centralSurfacesOptional = mCentralSurfacesOptionalLazy.get();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mHomeBlockedThisTouch = false;
if (mTelecomManagerOptional.isPresent()
&& mTelecomManagerOptional.get().isRinging()) {
- if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
+ if (centralSurfacesOptional.map(CentralSurfaces::isKeyguardShowing)
+ .orElse(false)) {
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " +
"No heads up");
mHomeBlockedThisTouch = true;
@@ -1196,14 +1188,14 @@
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
- statusBarOptional.ifPresent(StatusBar::awakenDreams);
+ centralSurfacesOptional.ifPresent(CentralSurfaces::awakenDreams);
break;
}
return false;
}
private void onVerticalChanged(boolean isVertical) {
- mStatusBarOptionalLazy.get().ifPresent(
+ mCentralSurfacesOptionalLazy.get().ifPresent(
statusBar -> statusBar.setQsScrimEnabled(!isVertical));
}
@@ -1230,7 +1222,7 @@
AssistManager.INVOCATION_TYPE_KEY,
AssistManager.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS);
mAssistManagerLazy.get().startAssist(args);
- mStatusBarOptionalLazy.get().ifPresent(StatusBar::awakenDreams);
+ mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::awakenDreams);
mNavigationBarView.abortCurrentGesture();
return true;
}
@@ -1256,7 +1248,7 @@
LatencyTracker.getInstance(mContext).onActionStart(
LatencyTracker.ACTION_TOGGLE_RECENTS);
}
- mStatusBarOptionalLazy.get().ifPresent(StatusBar::awakenDreams);
+ mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::awakenDreams);
mCommandQueue.toggleRecentApps();
}
@@ -1326,7 +1318,7 @@
return true;
} else if (v.getId() == btnId2) {
return btnId2 == R.id.recent_apps
- ? onLongPressRecents()
+ ? false
: onHomeLongClick(
mNavigationBarView.getHomeButton().getCurrentView());
}
@@ -1351,24 +1343,6 @@
return false;
}
- private boolean onLongPressRecents() {
- if (mRecentsOptional.isPresent() || !ActivityTaskManager.supportsMultiWindow(mContext)
- || ActivityManager.isLowRamDeviceStatic()
- // If we are connected to the overview service, then disable the recents button
- || mOverviewProxyService.getProxy() != null
- || !mSplitScreenOptional.map(splitScreen ->
- splitScreen.getDividerView().getSnapAlgorithm().isSplitScreenFeasible())
- .orElse(false)) {
- return false;
- }
-
- return mStatusBarOptionalLazy.get().map(
- statusBar -> statusBar.toggleSplitScreenMode(
- MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS,
- MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS))
- .orElse(false);
- }
-
private void onAccessibilityClick(View v) {
final Display display = v.getDisplay();
mAccessibilityManager.notifyAccessibilityButtonClicked(
@@ -1458,7 +1432,7 @@
private void checkBarModes() {
// We only have status bar on default display now.
if (mIsOnDefaultDisplay) {
- mStatusBarOptionalLazy.get().ifPresent(StatusBar::checkBarModes);
+ mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::checkBarModes);
} else {
checkNavBarModes();
}
@@ -1477,7 +1451,8 @@
*/
public void checkNavBarModes() {
final boolean anim =
- mStatusBarOptionalLazy.get().map(StatusBar::isDeviceInteractive).orElse(false)
+ mCentralSurfacesOptionalLazy.get().map(CentralSurfaces::isDeviceInteractive)
+ .orElse(false)
&& mNavigationBarWindowState != WINDOW_STATE_HIDDEN;
mNavigationBarView.getBarTransitions().transitionTo(mNavigationBarMode, anim);
}
@@ -1652,9 +1627,8 @@
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional;
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final Optional<Recents> mRecentsOptional;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final ShadeController mShadeController;
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final NotificationShadeDepthController mNotificationShadeDepthController;
@@ -1684,9 +1658,8 @@
BroadcastDispatcher broadcastDispatcher,
CommandQueue commandQueue,
Optional<Pip> pipOptional,
- Optional<LegacySplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
@@ -1713,9 +1686,8 @@
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
- mSplitScreenOptional = splitScreenOptional;
mRecentsOptional = recentsOptional;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mShadeController = shadeController;
mNotificationRemoteInputManager = notificationRemoteInputManager;
mNotificationShadeDepthController = notificationShadeDepthController;
@@ -1740,7 +1712,7 @@
mOverviewProxyService, mNavigationModeController,
mAccessibilityButtonModeObserver, mStatusBarStateController,
mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
- mSplitScreenOptional, mRecentsOptional, mStatusBarOptionalLazy,
+ mRecentsOptional, mCentralSurfacesOptionalLazy,
mShadeController, mNotificationRemoteInputManager,
mNotificationShadeDepthController, mMainHandler,
mNavbarOverlayController, mUiEventLogger, mNavBarHelper,
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 80a7a4ae..017bbdf 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -90,9 +90,8 @@
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.wm.shell.back.BackAnimation;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.PrintWriter;
@@ -1363,7 +1362,7 @@
getContextDisplay().getRealSize(size);
pw.println("NavigationBarView:");
- pw.println(String.format(" this: " + StatusBar.viewInfo(this)
+ pw.println(String.format(" this: " + CentralSurfaces.viewInfo(this)
+ " " + visibilityToString(getVisibility())));
getWindowVisibleDisplayFrame(r);
@@ -1425,10 +1424,6 @@
return super.onApplyWindowInsets(insets);
}
- void registerDockedListener(LegacySplitScreen legacySplitScreen) {
- legacySplitScreen.registerInSplitScreenListener(mDockedListener);
- }
-
void addPipExclusionBoundsChangeListener(Pip pip) {
pip.addPipExclusionBoundsChangeListener(mPipListener);
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 642af59..a7ed871 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -47,7 +47,7 @@
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -108,17 +108,17 @@
private IThermalEventListener mUsbThermalEventListener;
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
@Inject
public PowerUI(Context context, BroadcastDispatcher broadcastDispatcher,
- CommandQueue commandQueue, Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ CommandQueue commandQueue, Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
WarningsUI warningsUI, EnhancedEstimates enhancedEstimates,
PowerManager powerManager) {
super(context);
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mWarnings = warningsUI;
mEnhancedEstimates = enhancedEstimates;
mPowerManager = powerManager;
@@ -712,8 +712,10 @@
int status = temp.getStatus();
if (status >= Temperature.THROTTLING_EMERGENCY) {
- final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
- if (!statusBarOptional.map(StatusBar::isDeviceInVrMode).orElse(false)) {
+ final Optional<CentralSurfaces> centralSurfacesOptional =
+ mCentralSurfacesOptionalLazy.get();
+ if (!centralSurfacesOptional.map(CentralSurfaces::isDeviceInVrMode)
+ .orElse(false)) {
mWarnings.showHighTemperatureWarning();
Slog.d(TAG, "SkinThermalEventListener: notifyThrottling was called "
+ ", current skin status = " + status
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
index 89735c3..5d9361d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt
@@ -370,6 +370,7 @@
PowerExemptionManager.REASON_SYSTEM_UID,
PowerExemptionManager.REASON_DEVICE_DEMO_MODE -> UIControl.HIDE_ENTRY
+ PowerExemptionManager.REASON_ALLOWLISTED_PACKAGE,
PowerExemptionManager.REASON_DEVICE_OWNER,
PowerExemptionManager.REASON_PROFILE_OWNER,
PowerExemptionManager.REASON_PROC_STATE_PERSISTENT,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
index 217210a..27da6f3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt
@@ -50,6 +50,7 @@
import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject
import javax.inject.Named
+import javax.inject.Provider
/**
* Manages [FooterActionsView] behaviour, both when it's placed in QS or QQS (split shade).
@@ -69,7 +70,7 @@
private val fgsManagerFooterController: QSFgsManagerFooter,
private val falsingManager: FalsingManager,
private val metricsLogger: MetricsLogger,
- private val globalActionsDialog: GlobalActionsDialogLite,
+ private val globalActionsDialogProvider: Provider<GlobalActionsDialogLite>,
private val uiEventLogger: UiEventLogger,
@Named(PM_LITE_ENABLED) private val showPMLiteButton: Boolean,
private val globalSetting: GlobalSettings,
@@ -77,6 +78,8 @@
private val featureFlags: FeatureFlags
) : ViewController<FooterActionsView>(view) {
+ private var globalActionsDialog: GlobalActionsDialogLite? = null
+
private var lastExpansion = -1f
private var listening: Boolean = false
@@ -131,7 +134,7 @@
startSettingsActivity()
} else if (v === powerMenuLite) {
uiEventLogger.log(GlobalActionsDialogLite.GlobalActionsEvent.GA_OPEN_QS)
- globalActionsDialog.showOrHideDialog(false, true, v)
+ globalActionsDialog?.showOrHideDialog(false, true, v)
}
}
@@ -158,6 +161,7 @@
@VisibleForTesting
public override fun onViewAttached() {
+ globalActionsDialog = globalActionsDialogProvider.get()
if (showPMLiteButton) {
powerMenuLite.visibility = View.VISIBLE
powerMenuLite.setOnClickListener(onClickListener)
@@ -215,6 +219,8 @@
}
override fun onViewDetached() {
+ globalActionsDialog?.destroy()
+ globalActionsDialog = null
setListening(false)
multiUserSetting.isListening = false
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt b/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt
index 8afb793..95b4b72 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/HeaderPrivacyIconsController.kt
@@ -118,7 +118,7 @@
// If the privacy chip is visible, it means there were some indicators
uiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK)
if (safetyCenterEnabled) {
- showSafetyHub()
+ showSafetyCenter()
} else {
privacyDialogController.showDialog(privacyChip.context)
}
@@ -131,16 +131,16 @@
updatePrivacyIconSlots()
}
- private fun showSafetyHub() {
+ private fun showSafetyCenter() {
backgroundExecutor.execute {
val usage = ArrayList(permGroupUsage())
privacyLogger.logUnfilteredPermGroupUsage(usage)
- val startSafetyHub = Intent(Intent.ACTION_VIEW_SAFETY_HUB)
- startSafetyHub.putParcelableArrayListExtra(PermissionManager.EXTRA_PERMISSION_USAGES,
+ val startSafetyCenter = Intent(Intent.ACTION_VIEW_SAFETY_CENTER_QS)
+ startSafetyCenter.putParcelableArrayListExtra(PermissionManager.EXTRA_PERMISSION_USAGES,
usage)
- startSafetyHub.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ startSafetyCenter.flags = Intent.FLAG_ACTIVITY_NEW_TASK
uiExecutor.execute {
- activityStarter.startActivity(startSafetyHub, true,
+ activityStarter.startActivity(startSafetyCenter, true,
ActivityLaunchAnimator.Controller.fromView(privacyChip))
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index 9834129..0014279 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -33,8 +33,10 @@
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
+import com.android.systemui.media.MediaFlags;
import com.android.systemui.media.MediaHierarchyManager;
import com.android.systemui.media.MediaHost;
+import com.android.systemui.media.MediaHostState;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.qs.customize.QSCustomizerController;
import com.android.systemui.qs.dagger.QSScope;
@@ -63,6 +65,7 @@
private final FalsingManager mFalsingManager;
private final BrightnessController mBrightnessController;
private final BrightnessSliderController mBrightnessSliderController;
+ private final MediaFlags mMediaFlags;
private final BrightnessMirrorHandler mBrightnessMirrorHandler;
private final FeatureFlags mFeatureFlags;
@@ -102,7 +105,8 @@
DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
BrightnessSliderController.Factory brightnessSliderFactory,
- FalsingManager falsingManager, FeatureFlags featureFlags) {
+ FalsingManager falsingManager, FeatureFlags featureFlags,
+ MediaFlags mediaFlags) {
super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
metricsLogger, uiEventLogger, qsLogger, dumpManager);
mQSFgsManagerFooter = qsFgsManagerFooter;
@@ -113,6 +117,7 @@
mFalsingManager = falsingManager;
mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView);
+ mMediaFlags = mediaFlags;
mView.setBrightnessView(mBrightnessSliderController.getRootView());
mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController);
@@ -133,7 +138,14 @@
}
private void updateMediaExpansion() {
- mMediaHost.setExpansion(Utils.shouldUseSplitNotificationShade(getResources()) ? 0 : 1);
+ boolean inSplitShade = Utils.shouldUseSplitNotificationShade(getResources());
+ float expansion;
+ if (inSplitShade && !mMediaFlags.useMediaSessionLayout()) {
+ expansion = MediaHostState.COLLAPSED;
+ } else {
+ expansion = MediaHostState.EXPANDED;
+ }
+ mMediaHost.setExpansion(expansion);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index c693075..47af7de 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -53,7 +53,7 @@
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.phone.AutoTileManager;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -102,7 +102,7 @@
private final StatusBarIconController mIconController;
private final ArrayList<QSFactory> mQsFactories = new ArrayList<>();
private int mCurrentUser;
- private final Optional<StatusBar> mStatusBarOptional;
+ private final Optional<CentralSurfaces> mCentralSurfacesOptional;
private Context mUserContext;
private UserTracker mUserTracker;
private SecureSettings mSecureSettings;
@@ -121,7 +121,7 @@
Provider<AutoTileManager> autoTiles,
DumpManager dumpManager,
BroadcastDispatcher broadcastDispatcher,
- Optional<StatusBar> statusBarOptional,
+ Optional<CentralSurfaces> centralSurfacesOptional,
QSLogger qsLogger,
UiEventLogger uiEventLogger,
UserTracker userTracker,
@@ -143,7 +143,7 @@
mTileLifeCycleManagerFactory = tileLifecycleManagerFactory;
mInstanceIdSequence = new InstanceIdSequence(MAX_QS_INSTANCE_ID);
- mStatusBarOptional = statusBarOptional;
+ mCentralSurfacesOptional = centralSurfacesOptional;
mQsFactories.add(defaultFactory);
pluginManager.addPluginListener(this, QSFactory.class, true);
@@ -227,17 +227,17 @@
@Override
public void collapsePanels() {
- mStatusBarOptional.ifPresent(StatusBar::postAnimateCollapsePanels);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::postAnimateCollapsePanels);
}
@Override
public void forceCollapsePanels() {
- mStatusBarOptional.ifPresent(StatusBar::postAnimateForceCollapsePanels);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::postAnimateForceCollapsePanels);
}
@Override
public void openPanels() {
- mStatusBarOptional.ifPresent(StatusBar::postAnimateOpenPanels);
+ mCentralSurfacesOptional.ifPresent(CentralSurfaces::postAnimateOpenPanels);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
index 597f7b7..f389df0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
@@ -26,7 +26,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.shared.recents.IOverviewProxy;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.util.Optional;
@@ -42,7 +42,7 @@
private final static String TAG = "OverviewProxyRecentsImpl";
@Nullable
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private Context mContext;
private Handler mHandler;
@@ -51,8 +51,8 @@
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Inject
- public OverviewProxyRecentsImpl(Lazy<Optional<StatusBar>> statusBarOptionalLazy) {
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ public OverviewProxyRecentsImpl(Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy) {
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
}
@Override
@@ -109,9 +109,10 @@
}
};
// Preload only if device for current user is unlocked
- final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
- if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
- statusBarOptional.get().executeRunnableDismissingKeyguard(() -> {
+ final Optional<CentralSurfaces> centralSurfacesOptional =
+ mCentralSurfacesOptionalLazy.get();
+ if (centralSurfacesOptional.map(CentralSurfaces::isKeyguardShowing).orElse(false)) {
+ centralSurfacesOptional.get().executeRunnableDismissingKeyguard(() -> {
mHandler.post(toggleRecents);
}, null, true /* dismissShade */, false /* afterKeyguardGone */,
true /* deferred */);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 6b251b0..a3dea1c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -102,11 +102,10 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarWindowCallback;
import com.android.systemui.statusbar.policy.CallbackController;
import com.android.wm.shell.back.BackAnimation;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.PipAnimationController;
@@ -147,8 +146,7 @@
private final Context mContext;
private final Optional<Pip> mPipOptional;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
- private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final Optional<SplitScreen> mSplitScreenOptional;
private SysUiState mSysUiState;
private final Handler mHandler;
@@ -188,7 +186,7 @@
@Override
public void startScreenPinning(int taskId) {
verifyCallerAndClearCallingIdentityPostMain("startScreenPinning", () ->
- mStatusBarOptionalLazy.get().ifPresent(
+ mCentralSurfacesOptionalLazy.get().ifPresent(
statusBar -> statusBar.showScreenPinningRequest(taskId,
false /* allowCancel */)));
}
@@ -209,9 +207,9 @@
public void onStatusBarMotionEvent(MotionEvent event) {
verifyCallerAndClearCallingIdentity("onStatusBarMotionEvent", () -> {
// TODO move this logic to message queue
- mStatusBarOptionalLazy.get().ifPresent(statusBar -> {
+ mCentralSurfacesOptionalLazy.get().ifPresent(centralSurfaces -> {
if (event.getActionMasked() == ACTION_DOWN) {
- statusBar.getPanelController().startExpandLatencyTracking();
+ centralSurfaces.getPanelController().startExpandLatencyTracking();
}
mHandler.post(() -> {
int action = event.getActionMasked();
@@ -219,7 +217,7 @@
mInputFocusTransferStarted = true;
mInputFocusTransferStartY = event.getY();
mInputFocusTransferStartMillis = event.getEventTime();
- statusBar.onInputFocusTransfer(
+ centralSurfaces.onInputFocusTransfer(
mInputFocusTransferStarted, false /* cancel */,
0 /* velocity */);
}
@@ -227,7 +225,7 @@
mInputFocusTransferStarted = false;
float velocity = (event.getY() - mInputFocusTransferStartY)
/ (event.getEventTime() - mInputFocusTransferStartMillis);
- statusBar.onInputFocusTransfer(mInputFocusTransferStarted,
+ centralSurfaces.onInputFocusTransfer(mInputFocusTransferStarted,
action == ACTION_CANCEL,
velocity);
}
@@ -298,14 +296,8 @@
@Override
public Rect getNonMinimizedSplitScreenSecondaryBounds() {
- return verifyCallerAndClearCallingIdentity(
- "getNonMinimizedSplitScreenSecondaryBounds",
- () -> mLegacySplitScreenOptional.map(splitScreen ->
- splitScreen
- .getDividerView()
- .getNonMinimizedSplitScreenSecondaryBounds())
- .orElse(null)
- );
+ // Deprecated
+ return null;
}
@Override
@@ -362,8 +354,7 @@
@Override
public void setSplitScreenMinimized(boolean minimized) {
- mLegacySplitScreenOptional.ifPresent(
- splitScreen -> splitScreen.setMinimized(minimized));
+ // Deprecated
}
@Override
@@ -410,7 +401,7 @@
@Override
public void toggleNotificationPanel() {
verifyCallerAndClearCallingIdentityPostMain("toggleNotificationPanel", () ->
- mStatusBarOptionalLazy.get().ifPresent(StatusBar::togglePanel));
+ mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::togglePanel));
}
@@ -564,11 +555,10 @@
@Inject
public OverviewProxyService(Context context, CommandQueue commandQueue,
Lazy<NavigationBarController> navBarControllerLazy,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
NavigationModeController navModeController,
NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
Optional<Pip> pipOptional,
- Optional<LegacySplitScreen> legacySplitScreenOptional,
Optional<SplitScreen> splitScreenOptional,
Optional<OneHanded> oneHandedOptional,
Optional<RecentTasks> recentTasks,
@@ -583,7 +573,7 @@
super(broadcastDispatcher);
mContext = context;
mPipOptional = pipOptional;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mHandler = new Handler();
mNavBarControllerLazy = navBarControllerLazy;
mStatusBarWinController = statusBarWinController;
@@ -634,9 +624,6 @@
mCommandQueue = commandQueue;
mSplitScreenOptional = splitScreenOptional;
- legacySplitScreenOptional.ifPresent(splitScreen ->
- splitScreen.registerBoundsChangeListener(mSplitScreenBoundsChangeListener));
- mLegacySplitScreenOptional = legacySplitScreenOptional;
// Listen for user setup
startTracking();
@@ -678,7 +665,7 @@
final NavigationBarView navBarView =
mNavBarControllerLazy.get().getNavigationBarView(mContext.getDisplayId());
final NotificationPanelViewController panelController =
- mStatusBarOptionalLazy.get().get().getPanelController();
+ mCentralSurfacesOptionalLazy.get().get().getPanelController();
if (SysUiState.DEBUG) {
Log.d(TAG_OPS, "Updating sysui state flags: navBarFragment=" + navBarFragment
+ " navBarView=" + navBarView + " panelController=" + panelController);
@@ -744,17 +731,13 @@
public void cleanupAfterDeath() {
if (mInputFocusTransferStarted) {
mHandler.post(() -> {
- mStatusBarOptionalLazy.get().ifPresent(statusBar -> {
+ mCentralSurfacesOptionalLazy.get().ifPresent(centralSurfaces -> {
mInputFocusTransferStarted = false;
- statusBar.onInputFocusTransfer(false, true /* cancel */, 0 /* velocity */);
+ centralSurfaces.onInputFocusTransfer(false, true /* cancel */, 0 /* velocity */);
});
});
}
startConnectionToCurrentUser();
-
- // Clean up the minimized state if launcher dies
- mLegacySplitScreenOptional.ifPresent(
- splitScreen -> splitScreen.setMinimized(false));
}
public void startConnectionToCurrentUser() {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index 7f130cb..15ad779 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -56,7 +56,7 @@
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.WindowManagerWrapper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.util.leak.RotationUtils;
import java.util.ArrayList;
@@ -70,7 +70,7 @@
NavigationModeController.ModeChangedListener {
private final Context mContext;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final AccessibilityManager mAccessibilityService;
private final WindowManager mWindowManager;
@@ -83,9 +83,11 @@
private int taskId;
@Inject
- public ScreenPinningRequest(Context context, Lazy<Optional<StatusBar>> statusBarOptionalLazy) {
+ public ScreenPinningRequest(
+ Context context,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy) {
mContext = context;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mAccessibilityService = (AccessibilityManager)
mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
mWindowManager = (WindowManager)
@@ -267,9 +269,10 @@
.setVisibility(View.INVISIBLE);
}
- final Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
+ final Optional<CentralSurfaces> centralSurfacesOptional =
+ mCentralSurfacesOptionalLazy.get();
NavigationBarView navigationBarView =
- statusBarOptional.map(StatusBar::getNavigationBarView).orElse(null);
+ centralSurfacesOptional.map(CentralSurfaces::getNavigationBarView).orElse(null);
final boolean recentsVisible = navigationBarView != null
&& navigationBarView.isRecentsButtonVisible();
boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java
index f140446..daaa897 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java
@@ -24,7 +24,7 @@
import static com.android.systemui.screenshot.ScreenshotController.EXTRA_DISALLOW_ENTER_PIP;
import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID;
import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED;
-import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.SYSTEM_DIALOG_REASON_SCREENSHOT;
import android.app.ActivityOptions;
import android.app.PendingIntent;
@@ -36,7 +36,7 @@
import android.view.WindowManagerGlobal;
import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.util.Optional;
@@ -49,15 +49,15 @@
public class ActionProxyReceiver extends BroadcastReceiver {
private static final String TAG = "ActionProxyReceiver";
- private final StatusBar mStatusBar;
+ private final CentralSurfaces mCentralSurfaces;
private final ActivityManagerWrapper mActivityManagerWrapper;
private final ScreenshotSmartActions mScreenshotSmartActions;
@Inject
- public ActionProxyReceiver(Optional<StatusBar> statusBar,
+ public ActionProxyReceiver(Optional<CentralSurfaces> centralSurfacesOptional,
ActivityManagerWrapper activityManagerWrapper,
ScreenshotSmartActions screenshotSmartActions) {
- mStatusBar = statusBar.orElse(null);
+ mCentralSurfaces = centralSurfacesOptional.orElse(null);
mActivityManagerWrapper = activityManagerWrapper;
mScreenshotSmartActions = screenshotSmartActions;
}
@@ -89,8 +89,8 @@
};
- if (mStatusBar != null) {
- mStatusBar.executeRunnableDismissingKeyguard(startActivityRunnable, null,
+ if (mCentralSurfaces != null) {
+ mCentralSurfaces.executeRunnableDismissingKeyguard(startActivityRunnable, null,
true /* dismissShade */, true /* afterKeyguardGone */,
true /* deferred */);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
index 991a68f..7801c68 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
@@ -54,7 +54,7 @@
import javax.inject.Inject;
public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController {
- private static final String TAG = "StatusBar.BrightnessController";
+ private static final String TAG = "CentralSurfaces.BrightnessController";
private static final int SLIDER_ANIMATION_DURATION = 3000;
private static final int MSG_UPDATE_SLIDER = 1;
diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
index 10aa12b..6abf339 100644
--- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
@@ -23,13 +23,8 @@
import android.view.KeyEvent;
import android.view.WindowManagerGlobal;
-import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.wm.shell.legacysplitscreen.DividerView;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
-
-import java.util.Optional;
import javax.inject.Inject;
@@ -41,7 +36,6 @@
implements ShortcutKeyServiceProxy.Callbacks {
private static final String TAG = "ShortcutKeyDispatcher";
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
private ShortcutKeyServiceProxy mShortcutKeyServiceProxy = new ShortcutKeyServiceProxy(this);
private IWindowManager mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
@@ -55,9 +49,8 @@
protected final long SC_DOCK_RIGHT = META_MASK | KeyEvent.KEYCODE_RIGHT_BRACKET;
@Inject
- public ShortcutKeyDispatcher(Context context, Optional<LegacySplitScreen> splitScreenOptional) {
+ public ShortcutKeyDispatcher(Context context) {
super(context);
- mSplitScreenOptional = splitScreenOptional;
}
/**
@@ -89,24 +82,6 @@
}
private void handleDockKey(long shortcutCode) {
- mSplitScreenOptional.ifPresent(splitScreen -> {
- if (splitScreen.isDividerVisible()) {
- // If there is already a docked window, we respond by resizing the docking pane.
- DividerView dividerView = splitScreen.getDividerView();
- DividerSnapAlgorithm snapAlgorithm = dividerView.getSnapAlgorithm();
- int dividerPosition = dividerView.getCurrentPosition();
- DividerSnapAlgorithm.SnapTarget currentTarget =
- snapAlgorithm.calculateNonDismissingSnapTarget(dividerPosition);
- DividerSnapAlgorithm.SnapTarget target = (shortcutCode == SC_DOCK_LEFT)
- ? snapAlgorithm.getPreviousTarget(currentTarget)
- : snapAlgorithm.getNextTarget(currentTarget);
- dividerView.startDragging(true /* animate */, false /* touching */);
- dividerView.stopDragging(target.position, 0f, false /* avoidDismissStart */,
- true /* logMetrics */);
- return;
- } else {
- splitScreen.splitPrimaryTask();
- }
- });
+ // TODO(b/220262470) : implement it with new split screen.
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 645c5ac..8a02e59 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -23,7 +23,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
-import static com.android.systemui.statusbar.phone.StatusBar.ONLY_CORE_APPS;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.ONLY_CORE_APPS;
import android.annotation.Nullable;
import android.app.ITransientNotificationCallback;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index 8a9d6dd..17f42b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -38,7 +38,7 @@
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils
import java.io.FileDescriptor
@@ -73,7 +73,7 @@
private var useSplitShade: Boolean = false
private lateinit var nsslController: NotificationStackScrollLayoutController
lateinit var notificationPanelController: NotificationPanelViewController
- lateinit var statusbar: StatusBar
+ lateinit var centralSurfaces: CentralSurfaces
lateinit var qS: QS
/**
@@ -197,7 +197,7 @@
// Bind the click listener of the shelf to go to the full shade
notificationShelfController.setOnClickListener {
if (statusBarStateController.state == StatusBarState.KEYGUARD) {
- statusbar.wakeUpIfDozing(SystemClock.uptimeMillis(), it, "SHADE_CLICK")
+ centralSurfaces.wakeUpIfDozing(SystemClock.uptimeMillis(), it, "SHADE_CLICK")
goToLockedShade(it)
}
}
@@ -224,7 +224,7 @@
if (nsslController.isInLockedDownShade()) {
logger.logDraggedDownLockDownShade(startingChild)
statusBarStateController.setLeaveOpenOnKeyguardHide(true)
- statusbar.dismissKeyguardThenExecute(OnDismissAction {
+ centralSurfaces.dismissKeyguardThenExecute(OnDismissAction {
nextHideKeyguardNeedsNoAnimation = true
false
}, cancelRunnable, false /* afterKeyguardGone */)
@@ -361,7 +361,7 @@
notificationPanelController.setKeyguardOnlyContentAlpha(1.0f - scrimProgress)
depthController.transitionToFullShadeProgress = scrimProgress
udfpsKeyguardViewController?.setTransitionToFullShadeProgress(scrimProgress)
- statusbar.setTransitionToFullShadeProgress(scrimProgress)
+ centralSurfaces.setTransitionToFullShadeProgress(scrimProgress)
}
private fun setDragDownAmountAnimated(
@@ -461,7 +461,7 @@
animationHandler: ((Long) -> Unit)? = null,
cancelAction: Runnable? = null
) {
- if (statusbar.isShadeDisabled) {
+ if (centralSurfaces.isShadeDisabled) {
cancelAction?.run()
logger.logShadeDisabledOnGoToLockedShade()
return
@@ -503,7 +503,7 @@
cancelAction?.run()
}
logger.logShowBouncerOnGoToLockedShade()
- statusbar.showBouncerWithDimissAndCancelIfKeyguard(onDismissAction, cancelHandler)
+ centralSurfaces.showBouncerWithDimissAndCancelIfKeyguard(onDismissAction, cancelHandler)
draggedDownEntry = entry
} else {
logger.logGoingToLockedShade(animationHandler != null)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
index 01bdb40..68d35f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java
@@ -32,10 +32,10 @@
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.time.SystemClock;
import java.util.ArrayList;
@@ -54,7 +54,7 @@
@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
private static final String TAG = "NotificationListener";
- private static final boolean DEBUG = StatusBar.DEBUG;
+ private static final boolean DEBUG = CentralSurfaces.DEBUG;
private static final long MAX_RANKING_DELAY_MILLIS = 500L;
private final Context mContext;
@@ -69,7 +69,7 @@
private long mSkippingRankingUpdatesSince = -1;
/**
- * Injected constructor. See {@link StatusBarModule}.
+ * Injected constructor. See {@link CentralSurfacesModule}.
*/
@Inject
public NotificationListener(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index 3730d12..052c57e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -16,9 +16,9 @@
package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_MEDIA_FAKE_ARTWORK;
-import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_LOCKSCREEN_WALLPAPER;
-import static com.android.systemui.statusbar.phone.StatusBar.SHOW_LOCKSCREEN_MEDIA_ARTWORK;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG_MEDIA_FAKE_ARTWORK;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.ENABLE_LOCKSCREEN_WALLPAPER;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.SHOW_LOCKSCREEN_MEDIA_ARTWORK;
import android.annotation.MainThread;
import android.annotation.NonNull;
@@ -55,7 +55,7 @@
import com.android.systemui.media.MediaDataManager;
import com.android.systemui.media.SmartspaceMediaData;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -66,11 +66,11 @@
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ScrimState;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.Utils;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -131,7 +131,7 @@
private final Context mContext;
private final ArrayList<MediaListener> mMediaListeners;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final MediaArtworkProcessor mMediaArtworkProcessor;
private final Set<AsyncTask<?, ?, ?>> mProcessArtworkTasks = new ArraySet<>();
@@ -172,11 +172,11 @@
};
/**
- * Injected constructor. See {@link StatusBarModule}.
+ * Injected constructor. See {@link CentralSurfacesModule}.
*/
public NotificationMediaManager(
Context context,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
Lazy<NotificationShadeWindowController> notificationShadeWindowController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
@@ -193,7 +193,7 @@
mKeyguardBypassController = keyguardBypassController;
mMediaListeners = new ArrayList<>();
// TODO: use KeyguardStateController#isOccluded to remove this dependency
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mNotificationShadeWindowController = notificationShadeWindowController;
mVisibilityProvider = visibilityProvider;
mEntryManager = notificationEntryManager;
@@ -575,7 +575,7 @@
* Refresh or remove lockscreen artwork from media metadata or the lockscreen wallpaper.
*/
public void updateMediaMetaData(boolean metaDataChanged, boolean allowEnterAnimation) {
- Trace.beginSection("StatusBar#updateMediaMetaData");
+ Trace.beginSection("CentralSurfaces#updateMediaMetaData");
if (!SHOW_LOCKSCREEN_MEDIA_ARTWORK) {
Trace.endSection();
return;
@@ -653,7 +653,8 @@
NotificationShadeWindowController windowController =
mNotificationShadeWindowController.get();
boolean hideBecauseOccluded =
- mStatusBarOptionalLazy.get().map(StatusBar::isOccluded).orElse(false);
+ mCentralSurfacesOptionalLazy.get()
+ .map(CentralSurfaces::isOccluded).orElse(false);
final boolean hasArtwork = artworkDrawable != null;
mColorExtractor.setHasMediaArtwork(hasMediaArtwork);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
index 17bf346..3b3b5a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
@@ -19,7 +19,7 @@
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
/**
- * An abstraction of something that presents notifications, e.g. StatusBar. Contains methods
+ * An abstraction of something that presents notifications, e.g. CentralSurfaces. Contains methods
* for both querying the state of the system (some modularised piece of functionality may
* want to act differently based on e.g. whether the presenter is visible to the user or not) and
* for affecting the state of the system (e.g. starting an intent, given that the presenter may
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 2b5453a..94a6d3e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -55,7 +55,7 @@
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.dagger.StatusBarDependenciesModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesDependenciesModule;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -64,7 +64,7 @@
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.policy.RemoteInputView;
import com.android.systemui.util.DumpUtilsKt;
@@ -103,7 +103,7 @@
private final Handler mMainHandler;
private final ActionClickLogger mLogger;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
protected final Context mContext;
protected final NotifPipelineFlags mNotifPipelineFlags;
@@ -125,8 +125,8 @@
@Override
public boolean onInteraction(
View view, PendingIntent pendingIntent, RemoteViews.RemoteResponse response) {
- mStatusBarOptionalLazy.get().ifPresent(
- statusBar -> statusBar.wakeUpIfDozing(
+ mCentralSurfacesOptionalLazy.get().ifPresent(
+ centralSurfaces -> centralSurfaces.wakeUpIfDozing(
SystemClock.uptimeMillis(), view, "NOTIFICATION_CLICK"));
final NotificationEntry entry = getNotificationForParent(view.getParent());
@@ -253,7 +253,7 @@
};
/**
- * Injected constructor. See {@link StatusBarDependenciesModule}.
+ * Injected constructor. See {@link CentralSurfacesDependenciesModule}.
*/
public NotificationRemoteInputManager(
Context context,
@@ -263,7 +263,7 @@
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
StatusBarStateController statusBarStateController,
@Main Handler mainHandler,
RemoteInputUriController remoteInputUriController,
@@ -276,7 +276,7 @@
mSmartReplyController = smartReplyController;
mVisibilityProvider = visibilityProvider;
mEntryManager = notificationEntryManager;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mMainHandler = mainHandler;
mLogger = logger;
mBarService = IStatusBarService.Stub.asInterface(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelfController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelfController.java
index 4f70fdb..3b1fa17 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelfController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelfController.java
@@ -18,6 +18,7 @@
import android.view.View;
+import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowScope;
import com.android.systemui.statusbar.notification.stack.AmbientState;
@@ -25,7 +26,6 @@
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
-import com.android.systemui.statusbar.phone.StatusBarNotificationPresenter;
import javax.inject.Inject;
@@ -114,8 +114,8 @@
return mView.getIntrinsicHeight();
}
- public void setOnActivatedListener(StatusBarNotificationPresenter presenter) {
- mView.setOnActivatedListener(presenter);
+ public void setOnActivatedListener(ActivatableNotificationView.OnActivatedListener listener) {
+ mView.setOnActivatedListener(listener);
}
public void setOnClickListener(View.OnClickListener onClickListener) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 092e86d..054543c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -32,7 +32,7 @@
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
import com.android.systemui.statusbar.notification.DynamicChildBindController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
@@ -45,7 +45,6 @@
import com.android.systemui.statusbar.notification.collection.render.NotifStackController;
import com.android.systemui.statusbar.notification.collection.render.NotifStats;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -97,7 +96,6 @@
private final Optional<Bubbles> mBubblesOptional;
private final DynamicPrivacyController mDynamicPrivacyController;
private final KeyguardBypassController mBypassController;
- private final ForegroundServiceSectionController mFgsSectionController;
private final NotifPipelineFlags mNotifPipelineFlags;
private AssistantFeedbackController mAssistantFeedbackController;
private final KeyguardStateController mKeyguardStateController;
@@ -115,7 +113,7 @@
private boolean mIsHandleDynamicPrivacyChangeScheduled;
/**
- * Injected constructor. See {@link StatusBarModule}.
+ * Injected constructor. See {@link CentralSurfacesModule}.
*/
public NotificationViewHierarchyManager(
Context context,
@@ -129,7 +127,6 @@
KeyguardBypassController bypassController,
Optional<Bubbles> bubblesOptional,
DynamicPrivacyController privacyController,
- ForegroundServiceSectionController fgsSectionController,
DynamicChildBindController dynamicChildBindController,
LowPriorityInflationHelper lowPriorityInflationHelper,
AssistantFeedbackController assistantFeedbackController,
@@ -145,7 +142,6 @@
mVisualStabilityManager = visualStabilityManager;
mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController;
mEntryManager = notificationEntryManager;
- mFgsSectionController = fgsSectionController;
mNotifPipelineFlags = notifPipelineFlags;
Resources res = context.getResources();
mAlwaysExpandNonGroupedNotification =
@@ -417,8 +413,7 @@
&& mBubblesOptional.get().isBubbleNotificationSuppressedFromShade(
ent.getKey(), ent.getSbn().getGroupKey());
if (ent.isRowDismissed() || ent.isRowRemoved()
- || isBubbleNotificationSuppressedFromShade
- || mFgsSectionController.hasEntry(ent)) {
+ || isBubbleNotificationSuppressedFromShade) {
// we want to suppress removed notifications because they could
// temporarily become children if they were isolated before.
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java
index 2e1762a..7807738 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateController.java
@@ -20,17 +20,17 @@
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
/**
* Calculates and moves the QS frame vertically.
*/
public abstract class QsFrameTranslateController {
- protected StatusBar mStatusBar;
+ protected CentralSurfaces mCentralSurfaces;
- public QsFrameTranslateController(StatusBar statusBar) {
- mStatusBar = statusBar;
+ public QsFrameTranslateController(CentralSurfaces centralSurfaces) {
+ mCentralSurfaces = centralSurfaces;
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java
index c156797..33e2245 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/QsFrameTranslateImpl.java
@@ -21,7 +21,7 @@
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import javax.inject.Inject;
@@ -32,8 +32,8 @@
public class QsFrameTranslateImpl extends QsFrameTranslateController {
@Inject
- public QsFrameTranslateImpl(StatusBar statusBar) {
- super(statusBar);
+ public QsFrameTranslateImpl(CentralSurfaces centralSurfaces) {
+ super(centralSurfaces);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
index 4ad01aa..058edda 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java
@@ -25,7 +25,7 @@
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dumpable;
import com.android.systemui.dump.DumpManager;
-import com.android.systemui.statusbar.dagger.StatusBarModule;
+import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
@@ -45,7 +45,7 @@
private Callback mCallback;
/**
- * Injected constructor. See {@link StatusBarModule}.
+ * Injected constructor. See {@link CentralSurfacesModule}.
*/
public SmartReplyController(
DumpManager dumpManager,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 02870a3..2763bd7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -420,8 +420,9 @@
* notified before unranked, and we will sort ranked listeners from low to high
*
* @deprecated This method exists only to solve latent inter-dependencies from refactoring
- * StatusBarState out of StatusBar.java. Any new listeners should be built not to need ranking
- * (i.e., they are non-dependent on the order of operations of StatusBarState listeners).
+ * StatusBarState out of CentralSurfaces.java. Any new listeners should be built not to need
+ * ranking (i.e., they are non-dependent on the order of operations of StatusBarState
+ * listeners).
*/
@Deprecated
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index f0b2c2d..2b31901 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -25,7 +25,7 @@
import android.view.WindowInsetsController.Behavior;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import java.lang.annotation.Retention;
@@ -51,8 +51,9 @@
* notified before unranked, and we will sort ranked listeners from low to high
*
* @deprecated This method exists only to solve latent inter-dependencies from refactoring
- * StatusBarState out of StatusBar.java. Any new listeners should be built not to need ranking
- * (i.e., they are non-dependent on the order of operations of StatusBarState listeners).
+ * StatusBarState out of CentralSurfaces.java. Any new listeners should be built not to need
+ * ranking (i.e., they are non-dependent on the order of operations of StatusBarState
+ * listeners).
*/
@Deprecated
void addCallback(StateListener listener, int rank);
@@ -91,7 +92,7 @@
int getCurrentOrUpcomingState();
/**
- * Update the dozing state from {@link StatusBar}'s perspective
+ * Update the dozing state from {@link CentralSurfaces}'s perspective
* @param isDozing well, are we dozing?
* @return {@code true} if the state changed, else {@code false}
*/
@@ -116,7 +117,7 @@
void setAndInstrumentDozeAmount(View view, float dozeAmount, boolean animated);
/**
- * Update the expanded state from {@link StatusBar}'s perspective
+ * Update the expanded state from {@link CentralSurfaces}'s perspective
* @param expanded are we expanded?
* @return {@code true} if the state changed, else {@code false}
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
index 48717e2..5df593b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt
@@ -175,7 +175,7 @@
val width = displayMetrics.widthPixels
val height = displayMetrics.heightPixels
rippleView.radius = Integer.max(width, height).toFloat()
- rippleView.origin = when (RotationUtils.getRotation(context)) {
+ rippleView.origin = when (RotationUtils.getExactRotation(context)) {
RotationUtils.ROTATION_LANDSCAPE -> {
PointF(width * normalizedPortPosY, height * (1 - normalizedPortPosX))
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java
index fe5a699..41d2b65 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java
@@ -843,7 +843,7 @@
}
}
- /** Box for StatusBar icon info */
+ /** Box for status bar icon info */
private static final class SbInfo {
final boolean showTriangle;
final int ratTypeIcon;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
index d65fa3a..a62a152 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarInitializer.kt
@@ -21,18 +21,18 @@
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions
import com.android.systemui.statusbar.phone.PhoneStatusBarView
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment
import com.android.systemui.statusbar.window.StatusBarWindowController
import java.lang.IllegalStateException
import javax.inject.Inject
/**
- * Responsible for creating the StatusBar window and initializing the root components of that window
- * (see [CollapsedStatusBarFragment])
+ * Responsible for creating the status bar window and initializing the root components of that
+ * window (see [CollapsedStatusBarFragment])
*/
-@StatusBarScope
+@CentralSurfacesScope
class StatusBarInitializer @Inject constructor(
private val windowController: StatusBarWindowController
) {
@@ -43,7 +43,7 @@
* Creates the status bar window and root views, and initializes the component
*/
fun initializeStatusBar(
- sbComponent: StatusBarComponent
+ centralSurfacesComponent: CentralSurfacesComponent
) {
windowController.fragmentHostManager.addTagListener(
CollapsedStatusBarFragment.TAG,
@@ -64,7 +64,7 @@
}).fragmentManager
.beginTransaction()
.replace(R.id.status_bar_container,
- sbComponent.createCollapsedStatusBarFragment(),
+ centralSurfacesComponent.createCollapsedStatusBarFragment(),
CollapsedStatusBarFragment.TAG)
.commit()
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
similarity index 94%
rename from packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index c687e82..83290af 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -60,11 +60,10 @@
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
-import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
@@ -88,12 +87,13 @@
import dagger.Provides;
/**
- * This module provides instances needed to construct {@link StatusBar}. These are moved to this
- * separate from {@link StatusBarModule} module so that components that wish to build their own
- * version of StatusBar can include just dependencies, without injecting StatusBar itself.
+ * This module provides instances needed to construct {@link CentralSurfaces}. These are moved to
+ * this separate from {@link CentralSurfacesModule} module so that components that wish to build
+ * their own version of CentralSurfaces can include just dependencies, without injecting
+ * CentralSurfaces itself.
*/
@Module
-public interface StatusBarDependenciesModule {
+public interface CentralSurfacesDependenciesModule {
/** */
@SysUISingleton
@Provides
@@ -105,7 +105,7 @@
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
StatusBarStateController statusBarStateController,
Handler mainHandler,
RemoteInputUriController remoteInputUriController,
@@ -120,7 +120,7 @@
visibilityProvider,
notificationEntryManager,
rebuilder,
- statusBarOptionalLazy,
+ centralSurfacesOptionalLazy,
statusBarStateController,
mainHandler,
remoteInputUriController,
@@ -134,7 +134,7 @@
@Provides
static NotificationMediaManager provideNotificationMediaManager(
Context context,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
Lazy<NotificationShadeWindowController> notificationShadeWindowController,
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
@@ -148,7 +148,7 @@
DumpManager dumpManager) {
return new NotificationMediaManager(
context,
- statusBarOptionalLazy,
+ centralSurfacesOptionalLazy,
notificationShadeWindowController,
visibilityProvider,
notificationEntryManager,
@@ -198,7 +198,6 @@
KeyguardBypassController bypassController,
Optional<Bubbles> bubblesOptional,
DynamicPrivacyController privacyController,
- ForegroundServiceSectionController fgsSectionController,
DynamicChildBindController dynamicChildBindController,
LowPriorityInflationHelper lowPriorityInflationHelper,
AssistantFeedbackController assistantFeedbackController,
@@ -217,7 +216,6 @@
bypassController,
bubblesOptional,
privacyController,
- fgsSectionController,
dynamicChildBindController,
lowPriorityInflationHelper,
assistantFeedbackController,
@@ -261,6 +259,7 @@
@Provides
@SysUISingleton
static OngoingCallController provideOngoingCallController(
+ Context context,
CommonNotifCollection notifCollection,
SystemClock systemClock,
ActivityStarter activityStarter,
@@ -284,6 +283,7 @@
: Optional.empty();
OngoingCallController ongoingCallController =
new OngoingCallController(
+ context,
notifCollection,
ongoingCallFlags,
systemClock,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
similarity index 88%
rename from packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
index ad5ef20..99d4b2e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesModule.java
@@ -23,7 +23,7 @@
import dagger.Module;
/** */
-@Module(includes = {StatusBarPhoneModule.class, StatusBarDependenciesModule.class,
+@Module(includes = {StatusBarPhoneModule.class, CentralSurfacesDependenciesModule.class,
NotificationsModule.class, NotificationRowModule.class})
-public interface StatusBarModule {
+public interface CentralSurfacesModule {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartCentralSurfacesModule.kt
similarity index 76%
rename from packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartCentralSurfacesModule.kt
index 46c1abb..fe55dea7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartStatusBarModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StartCentralSurfacesModule.kt
@@ -17,17 +17,17 @@
package com.android.systemui.statusbar.dagger
import com.android.systemui.CoreStartable
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import dagger.Binds
import dagger.Module
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
@Module
-interface StartStatusBarModule {
- /** Start the StatusBar */
+interface StartCentralSurfacesModule {
+ /** Start the CentralSurfaces */
@Binds
@IntoMap
- @ClassKey(StatusBar::class)
- abstract fun bindsStatusBar(statusBar: StatusBar): CoreStartable
-}
\ No newline at end of file
+ @ClassKey(CentralSurfaces::class)
+ abstract fun bindsCentralSurfaces(centralSurfaces: CentralSurfaces): CoreStartable
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt
index 76766b0..3a4731a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/GenericGestureDetector.kt
@@ -22,6 +22,7 @@
import android.view.Choreographer
import android.view.Display
import android.view.InputEvent
+import android.view.MotionEvent
import com.android.systemui.shared.system.InputChannelCompat
import com.android.systemui.shared.system.InputMonitorCompat
@@ -43,13 +44,17 @@
* Active callbacks, each associated with a tag. Gestures will only be monitored if
* [callbacks.size] > 0.
*/
- private val callbacks: MutableMap<String, () -> Unit> = mutableMapOf()
+ private val callbacks: MutableMap<String, (MotionEvent) -> Unit> = mutableMapOf()
private var inputMonitor: InputMonitorCompat? = null
private var inputReceiver: InputChannelCompat.InputEventReceiver? = null
- /** Adds a callback that will be triggered when the tap gesture is detected. */
- fun addOnGestureDetectedCallback(tag: String, callback: () -> Unit) {
+ /**
+ * Adds a callback that will be triggered when the tap gesture is detected.
+ *
+ * The callback receive the last motion event in the gesture.
+ */
+ fun addOnGestureDetectedCallback(tag: String, callback: (MotionEvent) -> Unit) {
val callbacksWasEmpty = callbacks.isEmpty()
callbacks[tag] = callback
if (callbacksWasEmpty) {
@@ -68,9 +73,12 @@
/** Triggered each time a touch event occurs (and at least one callback is registered). */
abstract fun onInputEvent(ev: InputEvent)
- /** Should be called by subclasses when their specific gesture is detected. */
- internal fun onGestureDetected() {
- callbacks.values.forEach { it.invoke() }
+ /**
+ * Should be called by subclasses when their specific gesture is detected with the last motion
+ * event in the gesture.
+ */
+ internal fun onGestureDetected(e: MotionEvent) {
+ callbacks.values.forEach { it.invoke(e) }
}
/** Start listening to touch events. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt
index fcb285a..6115819 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeStatusBarAwayGestureHandler.kt
@@ -80,7 +80,7 @@
) {
monitoringCurrentTouch = false
logger.logGestureDetected(ev.y.toInt())
- onGestureDetected()
+ onGestureDetected(ev)
}
}
ACTION_CANCEL, ACTION_UP -> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt
index 4107ce2..7ffb07a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/TapGestureDetector.kt
@@ -33,8 +33,8 @@
) : GenericGestureDetector(TapGestureDetector::class.simpleName!!) {
private val gestureListener = object : GestureDetector.SimpleOnGestureListener() {
- override fun onSingleTapUp(e: MotionEvent?): Boolean {
- onGestureDetected()
+ override fun onSingleTapUp(e: MotionEvent): Boolean {
+ onGestureDetected(e)
return true
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ForegroundServiceDismissalFeatureController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ForegroundServiceDismissalFeatureController.kt
deleted file mode 100644
index 314051c..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ForegroundServiceDismissalFeatureController.kt
+++ /dev/null
@@ -1,49 +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.statusbar.notification
-
-import android.content.Context
-import android.provider.DeviceConfig
-import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NOTIFICATIONS_ALLOW_FGS_DISMISSAL
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.util.DeviceConfigProxy
-import javax.inject.Inject
-
-private var sIsEnabled: Boolean? = null
-
-/**
- * Feature controller for NOTIFICATIONS_ALLOW_FGS_DISMISSAL config.
- */
-// TODO: this is really boilerplatey, make a base class that just wraps the device config
-@SysUISingleton
-class ForegroundServiceDismissalFeatureController @Inject constructor(
- val proxy: DeviceConfigProxy,
- val context: Context
-) {
- fun isForegroundServiceDismissalEnabled(): Boolean {
- return isEnabled(proxy)
- }
-}
-
-private fun isEnabled(proxy: DeviceConfigProxy): Boolean {
- if (sIsEnabled == null) {
- sIsEnabled = proxy.getBoolean(
- DeviceConfig.NAMESPACE_SYSTEMUI, NOTIFICATIONS_ALLOW_FGS_DISMISSAL, false)
- }
-
- return sIsEnabled!!
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
index 82b56cd..5b7d90b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java
@@ -19,8 +19,8 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -59,10 +59,8 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.NotificationChannels;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import java.util.List;
-import java.util.Optional;
import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -80,15 +78,12 @@
private final Executor mUiBgExecutor;
private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>();
private final CommandQueue mCommandQueue;
- private boolean mDockedStackExists;
private KeyguardStateController mKeyguardStateController;
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
@Inject
public InstantAppNotifier(Context context, CommandQueue commandQueue,
- @UiBackground Executor uiBgExecutor, Optional<LegacySplitScreen> splitScreenOptional) {
+ @UiBackground Executor uiBgExecutor) {
super(context);
- mSplitScreenOptional = splitScreenOptional;
mCommandQueue = commandQueue;
mUiBgExecutor = uiBgExecutor;
}
@@ -107,12 +102,6 @@
mCommandQueue.addCallback(this);
mKeyguardStateController.addCallback(this);
- mSplitScreenOptional.ifPresent(splitScreen ->
- splitScreen.registerInSplitScreenListener(exists -> {
- mDockedStackExists = exists;
- updateForegroundInstantApps();
- }));
-
// Clear out all old notifications on startup (only present in the case where sysui dies)
NotificationManager noMan = mContext.getSystemService(NotificationManager.class);
for (StatusBarNotification notification : noMan.getActiveNotifications()) {
@@ -169,14 +158,11 @@
focusedTask.configuration.windowConfiguration
.getWindowingMode();
if (windowingMode == WINDOWING_MODE_FULLSCREEN
- || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
+ || windowingMode == WINDOWING_MODE_MULTI_WINDOW
|| windowingMode == WINDOWING_MODE_FREEFORM) {
checkAndPostForStack(focusedTask, notifs, noMan, pm);
}
}
- if (mDockedStackExists) {
- checkAndPostForPrimaryScreen(notifs, noMan, pm);
- }
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
index da70621..392145a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java
@@ -24,7 +24,7 @@
import com.android.systemui.DejankUtils;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.wm.shell.bubbles.Bubbles;
import java.util.Optional;
@@ -39,7 +39,7 @@
private static final String TAG = "NotificationClicker";
private final NotificationClickerLogger mLogger;
- private final Optional<StatusBar> mStatusBarOptional;
+ private final Optional<CentralSurfaces> mCentralSurfacesOptional;
private final Optional<Bubbles> mBubblesOptional;
private final NotificationActivityStarter mNotificationActivityStarter;
@@ -53,11 +53,11 @@
private NotificationClicker(
NotificationClickerLogger logger,
- Optional<StatusBar> statusBarOptional,
+ Optional<CentralSurfaces> centralSurfacesOptional,
Optional<Bubbles> bubblesOptional,
NotificationActivityStarter notificationActivityStarter) {
mLogger = logger;
- mStatusBarOptional = statusBarOptional;
+ mCentralSurfacesOptional = centralSurfacesOptional;
mBubblesOptional = bubblesOptional;
mNotificationActivityStarter = notificationActivityStarter;
}
@@ -69,7 +69,7 @@
return;
}
- mStatusBarOptional.ifPresent(statusBar -> statusBar.wakeUpIfDozing(
+ mCentralSurfacesOptional.ifPresent(centralSurfaces -> centralSurfaces.wakeUpIfDozing(
SystemClock.uptimeMillis(), v, "NOTIFICATION_CLICK"));
final ExpandableNotificationRow row = (ExpandableNotificationRow) v;
@@ -137,13 +137,13 @@
/** Builds an instance. */
public NotificationClicker build(
- Optional<StatusBar> statusBarOptional,
+ Optional<CentralSurfaces> centralSurfacesOptional,
Optional<Bubbles> bubblesOptional,
NotificationActivityStarter notificationActivityStarter
) {
return new NotificationClicker(
mLogger,
- statusBarOptional,
+ centralSurfacesOptional,
bubblesOptional,
notificationActivityStarter);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index f97b936..ac5beec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -111,7 +111,6 @@
private final Lazy<NotificationRowBinder> mNotificationRowBinderLazy;
private final Lazy<NotificationRemoteInputManager> mRemoteInputManagerLazy;
private final LeakDetector mLeakDetector;
- private final ForegroundServiceDismissalFeatureController mFgsFeatureController;
private final IStatusBarService mStatusBarService;
private final NotifLiveDataStoreImpl mNotifLiveDataStore;
private final DumpManager mDumpManager;
@@ -159,7 +158,6 @@
Lazy<NotificationRowBinder> notificationRowBinderLazy,
Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy,
LeakDetector leakDetector,
- ForegroundServiceDismissalFeatureController fgsFeatureController,
IStatusBarService statusBarService,
NotifLiveDataStoreImpl notifLiveDataStore,
DumpManager dumpManager
@@ -170,7 +168,6 @@
mNotificationRowBinderLazy = notificationRowBinderLazy;
mRemoteInputManagerLazy = notificationRemoteInputManagerLazy;
mLeakDetector = leakDetector;
- mFgsFeatureController = fgsFeatureController;
mStatusBarService = statusBarService;
mNotifLiveDataStore = notifLiveDataStore;
mDumpManager = dumpManager;
@@ -958,7 +955,7 @@
Trace.endSection();
}
- /** dump the current active notification list. Called from StatusBar */
+ /** dump the current active notification list. Called from CentralSurfaces */
public void dump(PrintWriter pw, String indent) {
pw.println("NotificationEntryManager (Legacy)");
int filteredLen = mSortedAndFiltered.size();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
index 9da7d21..2c1296f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt
@@ -8,12 +8,15 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone
import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent
import com.android.systemui.statusbar.policy.HeadsUpUtil
+import javax.inject.Inject
import kotlin.math.ceil
import kotlin.math.max
/** A provider of [NotificationLaunchAnimatorController]. */
-class NotificationLaunchAnimatorControllerProvider(
+@CentralSurfacesComponent.CentralSurfacesScope
+class NotificationLaunchAnimatorControllerProvider @Inject constructor(
private val notificationShadeWindowViewController: NotificationShadeWindowViewController,
private val notificationListContainer: NotificationListContainer,
private val headsUpManager: HeadsUpManagerPhone,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolver.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolver.kt
index 5dc0dcc..c71eade 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolver.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/TargetSdkResolver.kt
@@ -23,7 +23,7 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import javax.inject.Inject
@SysUISingleton
@@ -39,7 +39,7 @@
}
private fun resolveNotificationSdk(sbn: StatusBarNotification): Int {
- val pmUser = StatusBar.getPackageManagerForUser(context, sbn.user.identifier)
+ val pmUser = CentralSurfaces.getPackageManagerForUser(context, sbn.user.identifier)
var targetSdk = 0
// Extract target SDK version.
try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/LegacyNotificationPresenterExtensions.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/LegacyNotificationPresenterExtensions.java
index 4ee08ed..bdbb0eb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/LegacyNotificationPresenterExtensions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/LegacyNotificationPresenterExtensions.java
@@ -16,7 +16,7 @@
package com.android.systemui.statusbar.notification.collection.legacy;
-import static com.android.systemui.statusbar.phone.StatusBar.SPEW;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.SPEW;
import android.service.notification.StatusBarNotification;
import android.util.Log;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NotifPanelEventSource.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NotifPanelEventSource.kt
index 920d3c4..470737e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NotifPanelEventSource.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NotifPanelEventSource.kt
@@ -17,8 +17,8 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.phone.NotificationPanelViewController
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.util.ListenerSet
import dagger.Binds
import dagger.Module
@@ -67,18 +67,18 @@
@JvmStatic
@Provides
@IntoSet
- @StatusBarScope
+ @CentralSurfacesScope
fun bindStartable(
manager: NotifPanelEventSourceManager,
notifPanelController: NotificationPanelViewController
- ): StatusBarComponent.Startable =
+ ): CentralSurfacesComponent.Startable =
EventSourceStatusBarStartableImpl(manager, notifPanelController)
}
/**
- * Management layer that bridges [SysUiSingleton] and [StatusBarScope]. Necessary because code that
- * wants to listen to [NotifPanelEventSource] lives in [SysUiSingleton], but the events themselves
- * come from [NotificationPanelViewController] in [StatusBarScope].
+ * Management layer that bridges [SysUiSingleton] and [CentralSurfacesScope]. Necessary because code
+ * that wants to listen to [NotifPanelEventSource] lives in [SysUiSingleton], but the events
+ * themselves come from [NotificationPanelViewController] in [CentralSurfacesScope].
*/
interface NotifPanelEventSourceManager : NotifPanelEventSource {
var eventSource: NotifPanelEventSource?
@@ -116,7 +116,7 @@
private class EventSourceStatusBarStartableImpl(
private val manager: NotifPanelEventSourceManager,
private val notifPanelController: NotificationPanelViewController
-) : StatusBarComponent.Startable {
+) : CentralSurfacesComponent.Startable {
override fun start() {
manager.eventSource = notifPanelController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index e3ebef9..51bbf1c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -38,7 +38,6 @@
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
-import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationEntryManagerLogger;
@@ -87,7 +86,7 @@
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.leak.LeakDetector;
import com.android.systemui.wmshell.BubblesManager;
@@ -95,6 +94,8 @@
import java.util.Optional;
import java.util.concurrent.Executor;
+import javax.inject.Provider;
+
import dagger.Binds;
import dagger.Lazy;
import dagger.Module;
@@ -128,7 +129,6 @@
Lazy<NotificationRowBinder> notificationRowBinderLazy,
Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy,
LeakDetector leakDetector,
- ForegroundServiceDismissalFeatureController fgsFeatureController,
IStatusBarService statusBarService,
NotifLiveDataStoreImpl notifLiveDataStore,
DumpManager dumpManager) {
@@ -139,7 +139,6 @@
notificationRowBinderLazy,
notificationRemoteInputManagerLazy,
leakDetector,
- fgsFeatureController,
statusBarService,
notifLiveDataStore,
dumpManager);
@@ -150,7 +149,7 @@
@Provides
static NotificationGutsManager provideNotificationGutsManager(
Context context,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
@Main Handler mainHandler,
@Background Handler bgHandler,
AccessibilityManager accessibilityManager,
@@ -170,7 +169,7 @@
DumpManager dumpManager) {
return new NotificationGutsManager(
context,
- statusBarOptionalLazy,
+ centralSurfacesOptionalLazy,
mainHandler,
bgHandler,
accessibilityManager,
@@ -279,8 +278,8 @@
@Provides
static NotificationsController provideNotificationsController(
Context context,
- Lazy<NotificationsControllerImpl> realController,
- Lazy<NotificationsControllerStub> stubController) {
+ Provider<NotificationsControllerImpl> realController,
+ Provider<NotificationsControllerStub> stubController) {
if (context.getResources().getBoolean(R.bool.config_renderNotifications)) {
return realController.get();
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsController.kt
index a59d421..18abfca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsController.kt
@@ -23,11 +23,8 @@
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl
import com.android.systemui.statusbar.notification.collection.render.NotifStackController
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
-import com.android.systemui.statusbar.phone.StatusBar
-import com.android.wm.shell.bubbles.Bubbles
import java.io.FileDescriptor
import java.io.PrintWriter
-import java.util.Optional
/**
* The master controller for all notifications-related work
@@ -37,8 +34,6 @@
*/
interface NotificationsController {
fun initialize(
- statusBar: StatusBar,
- bubblesOptional: Optional<Bubbles>,
presenter: NotificationPresenter,
listContainer: NotificationListContainer,
stackController: NotifStackController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
index 48f2daf..98f45fa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerImpl.kt
@@ -44,7 +44,7 @@
import com.android.systemui.statusbar.notification.row.NotifBindPipelineInitializer
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.HeadsUpManager
import com.android.systemui.statusbar.policy.RemoteInputUriController
@@ -64,6 +64,7 @@
*/
@SysUISingleton
class NotificationsControllerImpl @Inject constructor(
+ private val centralSurfaces: Lazy<CentralSurfaces>,
private val notifPipelineFlags: NotifPipelineFlags,
private val notificationListener: NotificationListener,
private val entryManager: NotificationEntryManager,
@@ -86,12 +87,11 @@
private val headsUpViewBinder: HeadsUpViewBinder,
private val clickerBuilder: NotificationClicker.Builder,
private val animatedImageNotificationManager: AnimatedImageNotificationManager,
- private val peopleSpaceWidgetManager: PeopleSpaceWidgetManager
+ private val peopleSpaceWidgetManager: PeopleSpaceWidgetManager,
+ private val bubblesOptional: Optional<Bubbles>,
) : NotificationsController {
override fun initialize(
- statusBar: StatusBar,
- bubblesOptional: Optional<Bubbles>,
presenter: NotificationPresenter,
listContainer: NotificationListContainer,
stackController: NotifStackController,
@@ -109,7 +109,7 @@
notificationRowBinder.setNotificationClicker(
clickerBuilder.build(
- Optional.of(statusBar), bubblesOptional, notificationActivityStarter))
+ Optional.of(centralSurfaces.get()), bubblesOptional, notificationActivityStarter))
notificationRowBinder.setUpWithPresenter(
presenter,
listContainer,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerStub.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerStub.kt
index 1c9af11..66701d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerStub.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/init/NotificationsControllerStub.kt
@@ -24,11 +24,8 @@
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl
import com.android.systemui.statusbar.notification.collection.render.NotifStackController
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
-import com.android.systemui.statusbar.phone.StatusBar
-import com.android.wm.shell.bubbles.Bubbles
import java.io.FileDescriptor
import java.io.PrintWriter
-import java.util.Optional
import javax.inject.Inject
/**
@@ -39,8 +36,6 @@
) : NotificationsController {
override fun initialize(
- statusBar: StatusBar,
- bubblesOptional: Optional<Bubbles>,
presenter: NotificationPresenter,
listContainer: NotificationListContainer,
stackController: NotifStackController,
@@ -75,4 +70,4 @@
pw.println("Notification handling disabled")
pw.println()
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
index dc39413..9fbd5c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
@@ -468,7 +468,7 @@
}
/**
- * Called by StatusBar to notify the logger that the panel expansion has changed.
+ * Called by CentralSurfaces to notify the logger that the panel expansion has changed.
* The panel may be showing any of the normal notification panel, the AOD, or the bouncer.
* @param isExpanded True if the panel is expanded.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/DungeonRow.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/DungeonRow.kt
deleted file mode 100644
index dbfa27f..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/DungeonRow.kt
+++ /dev/null
@@ -1,43 +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.statusbar.notification.row
-
-import android.content.Context
-import android.util.AttributeSet
-import android.widget.LinearLayout
-import android.widget.TextView
-import com.android.systemui.R
-import com.android.systemui.statusbar.StatusBarIconView
-import com.android.systemui.statusbar.notification.collection.NotificationEntry
-
-class DungeonRow(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
- var entry: NotificationEntry? = null
- set(value) {
- field = value
- update()
- }
-
- private fun update() {
- (findViewById(R.id.app_name) as TextView).apply {
- text = entry?.row?.appName
- }
-
- (findViewById(R.id.icon) as StatusBarIconView).apply {
- set(entry?.icons?.statusBarIcon?.statusBarIcon)
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 1f7d930..c237e1d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -112,7 +112,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.SwipeableView;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.InflatedSmartReplyState;
import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent;
@@ -388,7 +388,7 @@
}
return false;
} else {
- PackageManager packageManager = StatusBar.getPackageManagerForUser(
+ PackageManager packageManager = CentralSurfaces.getPackageManagerForUser(
context, sbn.getUser().getIdentifier());
Boolean isSystemNotification = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ForegroundServiceDungeonView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ForegroundServiceDungeonView.kt
deleted file mode 100644
index 17396ad..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ForegroundServiceDungeonView.kt
+++ /dev/null
@@ -1,38 +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.statusbar.notification.row
-
-import android.content.Context
-import android.util.AttributeSet
-import android.view.View
-
-import com.android.systemui.R
-
-class ForegroundServiceDungeonView(context: Context, attrs: AttributeSet)
- : StackScrollerDecorView(context, attrs) {
- override fun findContentView(): View? {
- return findViewById(R.id.foreground_service_dungeon)
- }
-
- override fun findSecondaryView(): View? {
- return null
- }
-
- override fun setVisible(visible: Boolean, animate: Boolean) {
- // Visibility is controlled by the ForegroundServiceSectionController
- }
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index 1530e523..4c69304 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -47,7 +47,7 @@
import com.android.systemui.statusbar.notification.InflationException;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.InflatedSmartReplyState;
import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder;
import com.android.systemui.statusbar.policy.SmartReplyStateInflater;
@@ -841,7 +841,7 @@
StatusBarNotification sbn = mEntry.getSbn();
final String ident = sbn.getPackageName() + "/0x"
+ Integer.toHexString(sbn.getId());
- Log.e(StatusBar.TAG, "couldn't inflate view for notification " + ident, e);
+ Log.e(CentralSurfaces.TAG, "couldn't inflate view for notification " + ident, e);
if (mCallback != null) {
mCallback.handleInflationException(mRow.getEntry(),
new InflationException("Couldn't inflate contentViews" + e));
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 6d13024..ebe6f03 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
@@ -70,8 +70,8 @@
import com.android.systemui.statusbar.notification.dagger.NotificationsModule;
import com.android.systemui.statusbar.notification.row.NotificationInfo.CheckSaveListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.wmshell.BubblesManager;
@@ -120,7 +120,7 @@
@VisibleForTesting
protected String mKeyToRemoveOnGutsClosed;
- private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final Handler mMainHandler;
private final Handler mBgHandler;
private final Optional<BubblesManager> mBubblesManagerOptional;
@@ -139,7 +139,7 @@
* Injected constructor. See {@link NotificationsModule}.
*/
public NotificationGutsManager(Context context,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
@Main Handler mainHandler,
@Background Handler bgHandler,
AccessibilityManager accessibilityManager,
@@ -158,7 +158,7 @@
ShadeController shadeController,
DumpManager dumpManager) {
mContext = context;
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mMainHandler = mainHandler;
mBgHandler = bgHandler;
mAccessibilityManager = accessibilityManager;
@@ -342,7 +342,7 @@
}
StatusBarNotification sbn = row.getEntry().getSbn();
UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(mContext,
+ PackageManager pmUser = CentralSurfaces.getPackageManagerForUser(mContext,
userHandle.getIdentifier());
feedbackInfo.bindGuts(pmUser, sbn, row.getEntry(), row, mAssistantFeedbackController);
@@ -363,7 +363,7 @@
// Settings link is only valid for notifications that specify a non-system user
NotificationInfo.OnSettingsClickListener onSettingsClick = null;
UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(
+ PackageManager pmUser = CentralSurfaces.getPackageManagerForUser(
mContext, userHandle.getIdentifier());
final NotificationInfo.OnAppSettingsClickListener onAppSettingsClick =
(View v, Intent intent) -> {
@@ -416,7 +416,7 @@
// Settings link is only valid for notifications that specify a non-system user
NotificationInfo.OnSettingsClickListener onSettingsClick = null;
UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(
+ PackageManager pmUser = CentralSurfaces.getPackageManagerForUser(
mContext, userHandle.getIdentifier());
if (!userHandle.equals(UserHandle.ALL)
@@ -458,7 +458,7 @@
// Settings link is only valid for notifications that specify a non-system user
NotificationConversationInfo.OnSettingsClickListener onSettingsClick = null;
UserHandle userHandle = sbn.getUser();
- PackageManager pmUser = StatusBar.getPackageManagerForUser(
+ PackageManager pmUser = CentralSurfaces.getPackageManagerForUser(
mContext, userHandle.getIdentifier());
final NotificationConversationInfo.OnAppSettingsClickListener onAppSettingsClick =
(View v, Intent intent) -> {
@@ -571,11 +571,12 @@
.setLeaveOpenOnKeyguardHide(true);
}
- Optional<StatusBar> statusBarOptional = mStatusBarOptionalLazy.get();
- if (statusBarOptional.isPresent()) {
+ Optional<CentralSurfaces> centralSurfacesOptional =
+ mCentralSurfacesOptionalLazy.get();
+ if (centralSurfacesOptional.isPresent()) {
Runnable r = () -> mMainHandler.post(
() -> openGutsInternal(view, x, y, menuItem));
- statusBarOptional.get().executeRunnableDismissingKeyguard(
+ centralSurfacesOptional.get().executeRunnableDismissingKeyguard(
r,
null /* cancelAction */,
false /* dismissShade */,
@@ -584,7 +585,7 @@
return true;
}
/**
- * When {@link StatusBar} doesn't exist, falling through to call
+ * When {@link CentralSurfaces} doesn't exist, falling through to call
* {@link #openGutsInternal(View,int,int,NotificationMenuRowPlugin.MenuItem)}.
*/
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/ExpandableNotificationRowComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/ExpandableNotificationRowComponent.java
index a12d0073..1a7417a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/ExpandableNotificationRowComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/ExpandableNotificationRowComponent.java
@@ -26,7 +26,7 @@
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import dagger.Binds;
import dagger.BindsInstance;
@@ -100,7 +100,7 @@
// but since this field is used in the guts, it must be accurate.
// Therefore we will only show the application label, or, failing that, the
// package name. No substitutions.
- PackageManager pmUser = StatusBar.getPackageManagerForUser(
+ PackageManager pmUser = CentralSurfaces.getPackageManagerForUser(
context, statusBarNotification.getUser().getIdentifier());
final String pkg = statusBarNotification.getPackageName();
try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/NotificationRowScope.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/NotificationRowScope.java
index 4555b83..fa14123 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/NotificationRowScope.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/dagger/NotificationRowScope.java
@@ -24,7 +24,7 @@
import javax.inject.Scope;
/**
- * Scope annotation for singleton items within the StatusBarComponent.
+ * Scope annotation for singleton items within the CentralSurfacesComponent.
*/
@Documented
@Retention(RUNTIME)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ForegroundServiceSectionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ForegroundServiceSectionController.kt
deleted file mode 100644
index 75ca337..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ForegroundServiceSectionController.kt
+++ /dev/null
@@ -1,168 +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.statusbar.notification.stack
-
-import android.content.Context
-import android.service.notification.NotificationListenerService.REASON_CANCEL
-import android.service.notification.NotificationListenerService.REASON_CANCEL_ALL
-import android.service.notification.NotificationListenerService.REASON_CLICK
-import android.service.notification.NotificationListenerService.REASON_GROUP_SUMMARY_CANCELED
-import android.view.LayoutInflater
-import android.view.View
-import android.widget.LinearLayout
-import com.android.systemui.R
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController
-import com.android.systemui.statusbar.notification.NotificationEntryListener
-import com.android.systemui.statusbar.notification.NotificationEntryManager
-import com.android.systemui.statusbar.notification.collection.NotificationEntry
-import com.android.systemui.statusbar.notification.row.DungeonRow
-import com.android.systemui.util.Assert
-import javax.inject.Inject
-
-/**
- * Controller for the bottom area of NotificationStackScrollLayout. It owns swiped-away foreground
- * service notifications and can reinstantiate them when requested.
- */
-@SysUISingleton
-class ForegroundServiceSectionController @Inject constructor(
- val entryManager: NotificationEntryManager,
- val featureController: ForegroundServiceDismissalFeatureController
-) {
- private val TAG = "FgsSectionController"
- private var context: Context? = null
-
- private val entries = mutableSetOf<NotificationEntry>()
-
- private var entriesView: View? = null
-
- init {
- if (featureController.isForegroundServiceDismissalEnabled()) {
- entryManager.addNotificationRemoveInterceptor(this::shouldInterceptRemoval)
-
- entryManager.addNotificationEntryListener(object : NotificationEntryListener {
- override fun onPostEntryUpdated(entry: NotificationEntry) {
- if (entries.contains(entry)) {
- removeEntry(entry)
- addEntry(entry)
- update()
- }
- }
- })
- }
- }
-
- private fun shouldInterceptRemoval(
- key: String,
- entry: NotificationEntry?,
- reason: Int
- ): Boolean {
- Assert.isMainThread()
- val isClearAll = reason == REASON_CANCEL_ALL
- val isUserDismiss = reason == REASON_CANCEL || reason == REASON_CLICK
- // REASON_APP_CANCEL and REASON_APP_CANCEL_ALL are ignored, because the
- // foreground service associated with it is gone.
- val isSummaryCancel = reason == REASON_GROUP_SUMMARY_CANCELED
-
- if (entry == null) return false
-
- // We only want to retain notifications that the user dismissed
- // TODO: centralize the entry.isClearable logic and this so that it's clear when a notif is
- // clearable
- if (isUserDismiss && !entry.sbn.isClearable) {
- if (!hasEntry(entry)) {
- addEntry(entry)
- update()
- }
- // TODO: This isn't ideal. Slightly better would at least be to have NEM update the
- // notif list when an entry gets intercepted
- entryManager.updateNotifications(
- "FgsSectionController.onNotificationRemoveRequested")
- return true
- } else if ((isClearAll || isSummaryCancel) && !entry.sbn.isClearable) {
- // In the case where a FGS notification is part of a group that is cleared or a clear
- // all, we actually want to stop its removal but also not put it into the dungeon
- return true
- } else if (hasEntry(entry)) {
- removeEntry(entry)
- update()
- return false
- }
-
- return false
- }
-
- private fun removeEntry(entry: NotificationEntry) {
- Assert.isMainThread()
- entries.remove(entry)
- }
-
- private fun addEntry(entry: NotificationEntry) {
- Assert.isMainThread()
- entries.add(entry)
- }
-
- fun hasEntry(entry: NotificationEntry): Boolean {
- Assert.isMainThread()
- return entries.contains(entry)
- }
-
- fun initialize(context: Context) {
- this.context = context
- }
-
- fun createView(li: LayoutInflater): View {
- entriesView = li.inflate(R.layout.foreground_service_dungeon, null)
- // Start out gone
- entriesView!!.visibility = View.GONE
- return entriesView!!
- }
-
- private fun update() {
- Assert.isMainThread()
- if (entriesView == null) {
- throw IllegalStateException("ForegroundServiceSectionController is trying to show " +
- "dismissed fgs notifications without having been initialized!")
- }
-
- // TODO: these views should be recycled and not inflating on the main thread
- (entriesView!!.findViewById(R.id.entry_list) as LinearLayout).apply {
- removeAllViews()
- entries.sortedBy { it.ranking.rank }.forEach { entry ->
- val child = LayoutInflater.from(context)
- .inflate(R.layout.foreground_service_dungeon_row, null) as DungeonRow
-
- child.entry = entry
- child.setOnClickListener {
- removeEntry(child.entry!!)
- update()
- entry.row.unDismiss()
- entry.row.resetTranslation()
- entryManager.updateNotifications("ForegroundServiceSectionController.onClick")
- }
-
- addView(child)
- }
- }
-
- if (entries.isEmpty()) {
- entriesView?.visibility = View.GONE
- } else {
- entriesView?.visibility = View.VISIBLE
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 2c4db77..efe559a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -100,13 +100,12 @@
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
import com.android.systemui.statusbar.notification.row.FooterView;
-import com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView;
import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.ScrollAdapter;
import com.android.systemui.util.Assert;
@@ -309,7 +308,7 @@
}
};
private NotificationStackScrollLogger mLogger;
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
private int[] mTempInt2 = new int[2];
private boolean mGenerateChildOrderChangedEvent;
private HashSet<Runnable> mAnimationFinishedRunnables = new HashSet<>();
@@ -453,7 +452,6 @@
private Interpolator mHideXInterpolator = Interpolators.FAST_OUT_SLOW_IN;
private final NotificationSectionsManager mSectionsManager;
- private ForegroundServiceDungeonView mFgsSectionView;
private boolean mAnimateBottomOnLayout;
private float mLastSentAppear;
private float mLastSentExpandedHeight;
@@ -614,14 +612,6 @@
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
}
- void initializeForegroundServiceSection(ForegroundServiceDungeonView fgsSectionView) {
- if (mFgsSectionView != null) {
- return;
- }
- mFgsSectionView = fgsSectionView;
- addView(mFgsSectionView, -1);
- }
-
/**
* Set the overexpansion of the panel to be applied to the view.
*/
@@ -3969,7 +3959,7 @@
mAmbientState.setExpansionChanging(false);
if (!mIsExpanded) {
resetScrollPosition();
- mStatusBar.resetUserExpandedStates();
+ mCentralSurfaces.resetUserExpandedStates();
clearTemporaryViews();
clearUserLockedViews();
if (mSwipeHelper.isSwiping()) {
@@ -4601,8 +4591,8 @@
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- public void setStatusBar(StatusBar statusBar) {
- this.mStatusBar = statusBar;
+ public void setCentralSurfaces(CentralSurfaces centralSurfaces) {
+ this.mCentralSurfaces = centralSurfaces;
}
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
@@ -5270,7 +5260,7 @@
Intent intent = showHistory
? new Intent(Settings.ACTION_NOTIFICATION_HISTORY)
: new Intent(Settings.ACTION_NOTIFICATION_SETTINGS);
- mStatusBar.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ mCentralSurfaces.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
});
setEmptyShadeView(view);
}
@@ -5286,9 +5276,6 @@
// incremented in the following "changeViewPosition" calls so that its value is correct for
// subsequent calls.
int offsetFromEnd = 1;
- if (mFgsSectionView != null) {
- changeViewPosition(mFgsSectionView, getChildCount() - offsetFromEnd++);
- }
changeViewPosition(mFooterView, getChildCount() - offsetFromEnd++);
changeViewPosition(mEmptyShadeView, getChildCount() - offsetFromEnd++);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index d1c63e3..df6b8f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -86,7 +86,6 @@
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.ExpandAnimationParameters;
-import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
@@ -109,7 +108,6 @@
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
-import com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView;
import com.android.systemui.statusbar.notification.row.NotificationGuts;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationSnooze;
@@ -119,8 +117,8 @@
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -143,7 +141,7 @@
/**
* Controller for {@link NotificationStackScrollLayout}.
*/
-@StatusBarComponent.StatusBarScope
+@CentralSurfacesComponent.CentralSurfacesScope
public class NotificationStackScrollLayoutController {
private static final String TAG = "StackScrollerController";
private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG);
@@ -170,8 +168,6 @@
private final NotificationEntryManager mNotificationEntryManager;
private final IStatusBarService mIStatusBarService;
private final UiEventLogger mUiEventLogger;
- private final ForegroundServiceDismissalFeatureController mFgFeatureController;
- private final ForegroundServiceSectionController mFgServicesSectionController;
private final LayoutInflater mLayoutInflater;
private final NotificationRemoteInputManager mRemoteInputManager;
private final VisualStabilityManager mVisualStabilityManager;
@@ -180,8 +176,8 @@
private final SysuiStatusBarStateController mStatusBarStateController;
private final KeyguardBypassController mKeyguardBypassController;
private final NotificationLockscreenUserManager mLockscreenUserManager;
- // TODO: StatusBar should be encapsulated behind a Controller
- private final StatusBar mStatusBar;
+ // TODO: CentralSurfaces should be encapsulated behind a Controller
+ private final CentralSurfaces mCentralSurfaces;
private final SectionHeaderController mSilentHeaderController;
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final InteractionJankMonitor mJankMonitor;
@@ -334,7 +330,7 @@
mView.updateSensitiveness(mStatusBarStateController.goingToFullShade(),
mLockscreenUserManager.isAnyProfilePublicMode());
mView.onStatePostChange(mStatusBarStateController.fromShadeLocked());
- mNotificationEntryManager.updateNotifications("StatusBar state changed");
+ mNotificationEntryManager.updateNotifications("CentralSurfaces state changed");
}
};
@@ -435,7 +431,7 @@
@Override
public void onSnooze(StatusBarNotification sbn,
NotificationSwipeActionHelper.SnoozeOption snoozeOption) {
- mStatusBar.setNotificationSnoozed(sbn, snoozeOption);
+ mCentralSurfaces.setNotificationSnoozed(sbn, snoozeOption);
}
@Override
@@ -488,7 +484,7 @@
mView.addSwipedOutView(view);
mFalsingCollector.onNotificationDismissed();
if (mFalsingCollector.shouldEnforceBouncer()) {
- mStatusBar.executeRunnableDismissingKeyguard(
+ mCentralSurfaces.executeRunnableDismissingKeyguard(
null,
null /* cancelAction */,
false /* dismissShade */,
@@ -561,7 +557,7 @@
@Override
public float getFalsingThresholdFactor() {
- return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
+ return mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
}
@Override
@@ -648,7 +644,7 @@
FalsingManager falsingManager,
@Main Resources resources,
NotificationSwipeHelper.Builder notificationSwipeHelperBuilder,
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
ScrimController scrimController,
NotificationGroupManagerLegacy legacyGroupManager,
GroupExpansionManager groupManager,
@@ -660,8 +656,6 @@
LockscreenShadeTransitionController lockscreenShadeTransitionController,
IStatusBarService iStatusBarService,
UiEventLogger uiEventLogger,
- ForegroundServiceDismissalFeatureController fgFeatureController,
- ForegroundServiceSectionController fgServicesSectionController,
LayoutInflater layoutInflater,
NotificationRemoteInputManager remoteInputManager,
VisualStabilityManager visualStabilityManager,
@@ -691,7 +685,7 @@
mFalsingManager = falsingManager;
mResources = resources;
mNotificationSwipeHelperBuilder = notificationSwipeHelperBuilder;
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mScrimController = scrimController;
mJankMonitor = jankMonitor;
groupManager.registerGroupExpansionChangeListener(
@@ -699,7 +693,7 @@
legacyGroupManager.registerGroupChangeListener(new OnGroupChangeListener() {
@Override
public void onGroupsChanged() {
- mStatusBar.requestNotificationUpdate("onGroupsChanged");
+ mCentralSurfaces.requestNotificationUpdate("onGroupsChanged");
}
});
mNotifPipelineFlags = notifPipelineFlags;
@@ -709,8 +703,6 @@
mNotificationEntryManager = notificationEntryManager;
mIStatusBarService = iStatusBarService;
mUiEventLogger = uiEventLogger;
- mFgFeatureController = fgFeatureController;
- mFgServicesSectionController = fgServicesSectionController;
mLayoutInflater = layoutInflater;
mRemoteInputManager = remoteInputManager;
mVisualStabilityManager = visualStabilityManager;
@@ -724,7 +716,7 @@
mView.setController(this);
mView.setLogger(mLogger);
mView.setTouchHandler(new TouchHandler());
- mView.setStatusBar(mStatusBar);
+ mView.setCentralSurfaces(mCentralSurfaces);
mView.setClearAllAnimationListener(this::onAnimationEnd);
mView.setClearAllListener((selection) -> mUiEventLogger.log(
NotificationPanelEvent.fromSelection(selection)));
@@ -744,12 +736,6 @@
mNotificationRoundnessManager.setShouldRoundPulsingViews(
!mKeyguardBypassController.getBypassEnabled());
- if (mFgFeatureController.isForegroundServiceDismissalEnabled()) {
- mView.initializeForegroundServiceSection(
- (ForegroundServiceDungeonView) mFgServicesSectionController.createView(
- mLayoutInflater));
- }
-
mSwipeHelper = mNotificationSwipeHelperBuilder
.setSwipeDirection(SwipeHelper.X)
.setNotificationCallback(mNotificationCallback)
@@ -1420,7 +1406,7 @@
return mNotificationRoundnessManager;
}
- public NotificationListContainer getNotificationListContainer() {
+ NotificationListContainer getNotificationListContainer() {
return mNotificationListContainer;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutListContainerModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutListContainerModule.java
new file mode 100644
index 0000000..3dcaae2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutListContainerModule.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2022 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.stack;
+
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
+
+import dagger.Module;
+import dagger.Provides;
+
+@Module
+public abstract class NotificationStackScrollLayoutListContainerModule {
+ @Provides
+ @CentralSurfacesComponent.CentralSurfacesScope
+ static NotificationListContainer provideListContainer(
+ NotificationStackScrollLayoutController nsslController) {
+ return nsslController.getNotificationListContainer();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 244103c..ccb37ae 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -68,6 +68,7 @@
private UserHandle mCurrentUser;
private boolean mInitialized;
+ private final String mSafetySpec;
protected final Context mContext;
protected final QSTileHost mHost;
@@ -113,6 +114,13 @@
mIsReduceBrightColorsAvailable = isReduceBrightColorsAvailable;
mDeviceControlsController = deviceControlsController;
mWalletController = walletController;
+ String safetySpecRes;
+ try {
+ safetySpecRes = context.getResources().getString(R.string.safety_quick_settings_tile);
+ } catch (Resources.NotFoundException | NullPointerException e) {
+ safetySpecRes = null;
+ }
+ mSafetySpec = safetySpecRes;
}
/**
@@ -155,6 +163,9 @@
if (!mAutoTracker.isAdded(WALLET)) {
initWalletController();
}
+ if (mSafetySpec != null && !mAutoTracker.isAdded(mSafetySpec)) {
+ initSafetyTile();
+ }
int settingsN = mAutoAddSettingList.size();
for (int i = 0; i < settingsN; i++) {
@@ -315,6 +326,15 @@
}
}
+ private void initSafetyTile() {
+ if (mSafetySpec == null) {
+ return;
+ }
+ if (mAutoTracker.isAdded(mSafetySpec)) return;
+ mHost.addTile(CustomTile.getComponentFromSpec(mSafetySpec), true);
+ mAutoTracker.setTileAdded(mSafetySpec);
+ }
+
@VisibleForTesting
final NightDisplayListener.Callback mNightDisplayCallback =
new NightDisplayListener.Callback() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index d5d1cea..fe637c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -717,7 +717,7 @@
public void run() {
mNotificationShadeWindowController.setForceDozeBrightness(false);
}
- }, StatusBar.FADE_KEYGUARD_DURATION_PULSING);
+ }, CentralSurfaces.FADE_KEYGUARD_DURATION_PULSING);
}
public void finishKeyguardFadingAway() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
similarity index 95%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
index cffdc29..5642744 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -222,7 +222,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
@@ -245,7 +245,6 @@
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.startingsurface.SplashscreenContentDrawer;
import com.android.wm.shell.startingsurface.StartingSurface;
@@ -261,8 +260,20 @@
import dagger.Lazy;
-/** */
-public class StatusBar extends CoreStartable implements
+/**
+ * A class handling initialization and coordination between some of the key central surfaces in
+ * System UI: The notification shade, the keyguard (lockscreen), and the status bar.
+ *
+ * This class is not our ideal architecture because it doesn't enforce much isolation between these
+ * three mostly disparate surfaces. In an ideal world, this class would not exist. Instead, we would
+ * break it up into three modules -- one for each of those three surfaces -- and we would define any
+ * APIs that are needed for these surfaces to communicate with each other when necessary.
+ *
+ * <b>If at all possible, please avoid adding additional code to this monstrous class! Our goal is
+ * to break up this class into many small classes, and any code added here will slow down that goal.
+ * </b>
+ */
+public class CentralSurfaces extends CoreStartable implements
ActivityStarter,
LifecycleOwner {
public static final boolean MULTIUSER_DEBUG = false;
@@ -279,7 +290,7 @@
"com.android.systemui.statusbar.banner_action_cancel";
private static final String BANNER_ACTION_SETUP =
"com.android.systemui.statusbar.banner_action_setup";
- public static final String TAG = "StatusBar";
+ public static final String TAG = "CentralSurfaces";
public static final boolean DEBUG = false;
public static final boolean SPEW = false;
public static final boolean DUMPTRUCK = true; // extra dumpsys info
@@ -344,8 +355,9 @@
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final DreamOverlayStateController mDreamOverlayStateController;
- private StatusBarCommandQueueCallbacks mCommandQueueCallbacks;
+ private CentralSurfacesCommandQueueCallbacks mCommandQueueCallbacks;
private float mTransitionToFullShadeProgress = 0f;
+ private NotificationListContainer mNotifListContainer;
void onStatusBarWindowStateChanged(@WindowVisibleState int state) {
updateBubblesVisibility();
@@ -469,7 +481,7 @@
private PhoneStatusBarTransitions mStatusBarTransitions;
private AuthRippleController mAuthRippleController;
@WindowVisibleState private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
- protected NotificationShadeWindowController mNotificationShadeWindowController;
+ protected final NotificationShadeWindowController mNotificationShadeWindowController;
private final StatusBarWindowController mStatusBarWindowController;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@VisibleForTesting
@@ -495,11 +507,8 @@
protected NotificationShadeWindowViewController mNotificationShadeWindowViewController;
private final DozeParameters mDozeParameters;
private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
- private final StatusBarComponent.Factory mStatusBarComponentFactory;
+ private final CentralSurfacesComponent.Factory mCentralSurfacesComponentFactory;
private final PluginManager mPluginManager;
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
- private final StatusBarNotificationActivityStarter.Builder
- mStatusBarNotificationActivityStarterBuilder;
private final ShadeController mShadeController;
private final InitController mInitController;
@@ -545,7 +554,7 @@
private final MessageRouter mMessageRouter;
private final WallpaperManager mWallpaperManager;
- private StatusBarComponent mStatusBarComponent;
+ private CentralSurfacesComponent mCentralSurfacesComponent;
// Flags for disabling the status bar
// Two variables becaseu the first one evidently ran out of room for new flags.
@@ -667,7 +676,7 @@
private final ActivityLaunchAnimator mActivityLaunchAnimator;
private NotificationLaunchAnimatorControllerProvider mNotificationAnimationProvider;
- protected StatusBarNotificationPresenter mPresenter;
+ protected NotificationPresenter mPresenter;
private NotificationActivityStarter mNotificationActivityStarter;
private final Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy;
private final Optional<BubblesManager> mBubblesManagerOptional;
@@ -686,13 +695,13 @@
/**
- * Public constructor for StatusBar.
+ * Public constructor for CentralSurfaces.
*
- * StatusBar is considered optional, and therefore can not be marked as @Inject directly.
+ * CentralSurfaces is considered optional, and therefore can not be marked as @Inject directly.
* Instead, an @Provide method is included. See {@link StatusBarPhoneModule}.
*/
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
- public StatusBar(
+ public CentralSurfaces(
Context context,
NotificationsController notificationsController,
FragmentService fragmentService,
@@ -752,11 +761,8 @@
DozeScrimController dozeScrimController,
VolumeComponent volumeComponent,
CommandQueue commandQueue,
- StatusBarComponent.Factory statusBarComponentFactory,
+ CentralSurfacesComponent.Factory centralSurfacesComponentFactory,
PluginManager pluginManager,
- Optional<LegacySplitScreen> splitScreenOptional,
- StatusBarNotificationActivityStarter.Builder
- statusBarNotificationActivityStarterBuilder,
ShadeController shadeController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
@@ -851,10 +857,8 @@
mNotificationShadeDepthControllerLazy = notificationShadeDepthControllerLazy;
mVolumeComponent = volumeComponent;
mCommandQueue = commandQueue;
- mStatusBarComponentFactory = statusBarComponentFactory;
+ mCentralSurfacesComponentFactory = centralSurfacesComponentFactory;
mPluginManager = pluginManager;
- mSplitScreenOptional = splitScreenOptional;
- mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder;
mShadeController = shadeController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mKeyguardViewMediatorCallback = viewMediatorCallback;
@@ -883,7 +887,7 @@
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
mStartingSurfaceOptional = startingSurfaceOptional;
mNotifPipelineFlags = notifPipelineFlags;
- lockscreenShadeTransitionController.setStatusbar(this);
+ lockscreenShadeTransitionController.setCentralSurfaces(this);
statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged);
mScreenOffAnimationController = screenOffAnimationController;
@@ -1115,7 +1119,7 @@
}
private void onFoldedStateChanged(boolean isFolded, boolean willGoToSleep) {
- Trace.beginSection("StatusBar#onFoldedStateChanged");
+ Trace.beginSection("CentralSurfaces#onFoldedStateChanged");
onFoldedStateChangedInternal(isFolded, willGoToSleep);
Trace.endSection();
}
@@ -1159,19 +1163,14 @@
updateTheme();
inflateStatusBarWindow();
- mNotificationShadeWindowViewController.setService(this, mNotificationShadeWindowController);
mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener());
mWallpaperController.setRootView(mNotificationShadeWindowView);
- // TODO: Deal with the ugliness that comes from having some of the statusbar broken out
+ // TODO: Deal with the ugliness that comes from having some of the status bar broken out
// into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.
- NotificationListContainer notifListContainer =
- mStackScrollerController.getNotificationListContainer();
- mNotificationLogger.setUpWithContainer(notifListContainer);
-
+ mNotificationLogger.setUpWithContainer(mNotifListContainer);
mNotificationIconAreaController.setupShelf(mNotificationShelfController);
mPanelExpansionStateManager.addExpansionListener(mWakeUpCoordinator);
-
mUserSwitcherController.init(mNotificationShadeWindowView);
// Allow plugins to reference DarkIconDispatcher and StatusBarStateController
@@ -1179,7 +1178,7 @@
mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);
// Set up CollapsedStatusBarFragment and PhoneStatusBarView
- StatusBarInitializer initializer = mStatusBarComponent.getStatusBarInitializer();
+ StatusBarInitializer initializer = mCentralSurfacesComponent.getStatusBarInitializer();
initializer.setStatusBarViewUpdatedListener(
(statusBarView, statusBarViewController, statusBarTransitions) -> {
mStatusBarView = statusBarView;
@@ -1196,7 +1195,7 @@
setBouncerShowingForStatusBarComponents(mBouncerShowing);
checkBarModes();
});
- initializer.initializeStatusBar(mStatusBarComponent);
+ initializer.initializeStatusBar(mCentralSurfacesComponent);
mStatusBarTouchableRegionManager.setup(this, mNotificationShadeWindowView);
mHeadsUpManager.addListener(mNotificationPanelViewController.getOnHeadsUpChangedListener());
@@ -1446,65 +1445,19 @@
mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener);
mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider(
mNotificationShadeWindowViewController,
- mStackScrollerController.getNotificationListContainer(),
+ mNotifListContainer,
mHeadsUpManager,
- mJankMonitor
- );
-
- // TODO: inject this.
- mPresenter = new StatusBarNotificationPresenter(
- mContext,
- mNotificationPanelViewController,
- mHeadsUpManager,
- mNotificationShadeWindowView,
- mStackScrollerController,
- mDozeScrimController,
- mScrimController,
- mNotificationShadeWindowController,
- mDynamicPrivacyController,
- mKeyguardStateController,
- mKeyguardIndicationController,
- this /* statusBar */,
- mShadeController,
- mLockscreenShadeTransitionController,
- mCommandQueue,
- mViewHierarchyManager,
- mLockscreenUserManager,
- mStatusBarStateController,
- mNotifShadeEventSource,
- mEntryManager,
- mMediaManager,
- mGutsManager,
- mKeyguardUpdateMonitor,
- mLockscreenGestureLogger,
- mInitController,
- mNotificationInterruptStateProvider,
- mRemoteInputManager,
- mConfigurationController,
- mNotifPipelineFlags);
-
+ mJankMonitor);
mNotificationShelfController.setOnActivatedListener(mPresenter);
mRemoteInputManager.addControllerCallback(mNotificationShadeWindowController);
-
- mNotificationActivityStarter =
- mStatusBarNotificationActivityStarterBuilder
- .setStatusBar(this)
- .setActivityLaunchAnimator(mActivityLaunchAnimator)
- .setNotificationAnimatorControllerProvider(mNotificationAnimationProvider)
- .setNotificationPresenter(mPresenter)
- .setNotificationPanelViewController(mNotificationPanelViewController)
- .build();
mStackScrollerController.setNotificationActivityStarter(mNotificationActivityStarter);
mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter);
-
mNotificationsController.initialize(
- this,
- mBubblesOptional,
mPresenter,
- mStackScrollerController.getNotificationListContainer(),
+ mNotifListContainer,
mStackScrollerController.getNotifStackController(),
mNotificationActivityStarter,
- mPresenter);
+ mCentralSurfacesComponent.getBindRowCallback());
}
/**
@@ -1562,30 +1515,34 @@
}
private void inflateStatusBarWindow() {
- if (mStatusBarComponent != null) {
+ if (mCentralSurfacesComponent != null) {
// Tear down
- for (StatusBarComponent.Startable startable : mStatusBarComponent.getStartables()) {
- startable.stop();
+ for (CentralSurfacesComponent.Startable s : mCentralSurfacesComponent.getStartables()) {
+ s.stop();
}
}
- mStatusBarComponent = mStatusBarComponentFactory.create();
- mFragmentService.addFragmentInstantiationProvider(mStatusBarComponent);
+ mCentralSurfacesComponent = mCentralSurfacesComponentFactory.create();
+ mFragmentService.addFragmentInstantiationProvider(mCentralSurfacesComponent);
- mNotificationShadeWindowView = mStatusBarComponent.getNotificationShadeWindowView();
- mNotificationShadeWindowViewController = mStatusBarComponent
+ mNotificationShadeWindowView = mCentralSurfacesComponent.getNotificationShadeWindowView();
+ mNotificationShadeWindowViewController = mCentralSurfacesComponent
.getNotificationShadeWindowViewController();
mNotificationShadeWindowController.setNotificationShadeView(mNotificationShadeWindowView);
mNotificationShadeWindowViewController.setupExpandedStatusBar();
- mNotificationPanelViewController = mStatusBarComponent.getNotificationPanelViewController();
- mStatusBarComponent.getLockIconViewController().init();
- mStackScrollerController = mStatusBarComponent.getNotificationStackScrollLayoutController();
+ mNotificationPanelViewController =
+ mCentralSurfacesComponent.getNotificationPanelViewController();
+ mCentralSurfacesComponent.getLockIconViewController().init();
+ mStackScrollerController =
+ mCentralSurfacesComponent.getNotificationStackScrollLayoutController();
mStackScroller = mStackScrollerController.getView();
-
- mNotificationShelfController = mStatusBarComponent.getNotificationShelfController();
- mAuthRippleController = mStatusBarComponent.getAuthRippleController();
+ mNotifListContainer = mCentralSurfacesComponent.getNotificationListContainer();
+ mPresenter = mCentralSurfacesComponent.getNotificationPresenter();
+ mNotificationActivityStarter = mCentralSurfacesComponent.getNotificationActivityStarter();
+ mNotificationShelfController = mCentralSurfacesComponent.getNotificationShelfController();
+ mAuthRippleController = mCentralSurfacesComponent.getAuthRippleController();
mAuthRippleController.init();
- mHeadsUpManager.addListener(mStatusBarComponent.getStatusBarHeadsUpChangeListener());
+ mHeadsUpManager.addListener(mCentralSurfacesComponent.getStatusBarHeadsUpChangeListener());
// Listen for demo mode changes
mDemoModeController.addCallback(mDemoModeCallback);
@@ -1593,18 +1550,19 @@
if (mCommandQueueCallbacks != null) {
mCommandQueue.removeCallback(mCommandQueueCallbacks);
}
- mCommandQueueCallbacks = mStatusBarComponent.getStatusBarCommandQueueCallbacks();
+ mCommandQueueCallbacks =
+ mCentralSurfacesComponent.getCentralSurfacesCommandQueueCallbacks();
// Connect in to the status bar manager service
mCommandQueue.addCallback(mCommandQueueCallbacks);
- // Perform all other initialization for StatusBarScope
- for (StatusBarComponent.Startable startable : mStatusBarComponent.getStartables()) {
- startable.start();
+ // Perform all other initialization for CentralSurfacesScope
+ for (CentralSurfacesComponent.Startable s : mCentralSurfacesComponent.getStartables()) {
+ s.start();
}
}
protected void startKeyguard() {
- Trace.beginSection("StatusBar#startKeyguard");
+ Trace.beginSection("CentralSurfaces#startKeyguard");
mBiometricUnlockController = mBiometricUnlockControllerLazy.get();
mBiometricUnlockController.setBiometricModeListener(
new BiometricUnlockController.BiometricModeListener() {
@@ -1625,7 +1583,7 @@
@Override
public void notifyBiometricAuthModeChanged() {
- StatusBar.this.notifyBiometricAuthModeChanged();
+ CentralSurfaces.this.notifyBiometricAuthModeChanged();
}
private void setWakeAndUnlocking(boolean wakeAndUnlocking) {
@@ -1634,7 +1592,7 @@
}
}
});
- mStatusBarKeyguardViewManager.registerStatusBar(
+ mStatusBarKeyguardViewManager.registerCentralSurfaces(
/* statusBar= */ this,
mNotificationPanelViewController,
mPanelExpansionStateManager,
@@ -1673,35 +1631,6 @@
return mStatusBarWindowController.getStatusBarHeight();
}
- public boolean toggleSplitScreenMode(int metricsDockAction, int metricsUndockAction) {
- if (!mSplitScreenOptional.isPresent()) {
- return false;
- }
-
- final LegacySplitScreen legacySplitScreen = mSplitScreenOptional.get();
- if (legacySplitScreen.isDividerVisible()) {
- if (legacySplitScreen.isMinimized() && !legacySplitScreen.isHomeStackResizable()) {
- // Undocking from the minimized state is not supported
- return false;
- }
-
- legacySplitScreen.onUndockingTask();
- if (metricsUndockAction != -1) {
- mMetricsLogger.action(metricsUndockAction);
- }
- return true;
- }
-
- if (legacySplitScreen.splitPrimaryTask()) {
- if (metricsDockAction != -1) {
- mMetricsLogger.action(metricsDockAction);
- }
- return true;
- }
-
- return false;
- }
-
/**
* Disable QS if device not provisioned.
* If the user switcher is simple then disable QS during setup because
@@ -1792,7 +1721,7 @@
getDelegate().onIntentStarted(willAnimate);
if (willAnimate) {
- StatusBar.this.mIsLaunchingActivityOverLockscreen = true;
+ CentralSurfaces.this.mIsLaunchingActivityOverLockscreen = true;
}
}
@@ -1802,7 +1731,7 @@
// animation so that we can assume that mIsLaunchingActivityOverLockscreen
// being true means that we will collapse the shade (or at least run the
// post collapse runnables) later on.
- StatusBar.this.mIsLaunchingActivityOverLockscreen = false;
+ CentralSurfaces.this.mIsLaunchingActivityOverLockscreen = false;
getDelegate().onLaunchAnimationEnd(isExpandingFullyAbove);
}
@@ -1812,7 +1741,7 @@
// animation so that we can assume that mIsLaunchingActivityOverLockscreen
// being true means that we will collapse the shade (or at least run the
// post collapse runnables) later on.
- StatusBar.this.mIsLaunchingActivityOverLockscreen = false;
+ CentralSurfaces.this.mIsLaunchingActivityOverLockscreen = false;
getDelegate().onLaunchAnimationCancelled();
}
};
@@ -2636,7 +2565,7 @@
// ordering.
mMainExecutor.execute(mShadeController::runPostCollapseRunnables);
}
- } else if (StatusBar.this.isInLaunchTransition()
+ } else if (CentralSurfaces.this.isInLaunchTransition()
&& mNotificationPanelViewController.isLaunchTransitionFinished()) {
// We are not dismissing the shade, but the launch transition is already
@@ -2659,7 +2588,7 @@
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- Trace.beginSection("StatusBar#onReceive");
+ Trace.beginSection("CentralSurfaces#onReceive");
if (DEBUG) Log.v(TAG, "onReceive: " + intent);
String action = intent.getAction();
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
@@ -2805,7 +2734,9 @@
void handleVisibleToUserChangedImpl(boolean visibleToUser) {
if (visibleToUser) {
/* The LEDs are turned off when the notification panel is shown, even just a little bit.
- * See also StatusBar.setPanelExpanded for another place where we attempt to do this. */
+ * See also CentralSurfaces.setPanelExpanded for another place where we attempt to do
+ * this.
+ */
boolean pinnedHeadsUp = mHeadsUpManager.hasPinnedHeadsUp();
boolean clearNotificationEffects =
!mPresenter.isPresenterFullyCollapsed() &&
@@ -2954,8 +2885,9 @@
// turned off fully.
boolean keyguardForDozing = mDozeServiceHost.getDozingRequested()
&& (!mDeviceInteractive || isGoingToSleep() && (isScreenFullyOff() || mIsKeyguard));
+ boolean isWakingAndOccluded = isOccluded() && isWaking();
boolean shouldBeKeyguard = (mStatusBarStateController.isKeyguardRequested()
- || keyguardForDozing) && !wakeAndUnlocking;
+ || keyguardForDozing) && !wakeAndUnlocking && !isWakingAndOccluded;
if (keyguardForDozing) {
updatePanelExpansionForKeyguard();
}
@@ -2984,7 +2916,7 @@
}
public void showKeyguardImpl() {
- Trace.beginSection("StatusBar#showKeyguard");
+ Trace.beginSection("CentralSurfaces#showKeyguard");
mIsKeyguard = true;
// In case we're locking while a smartspace transition is in progress, reset it.
mKeyguardUnlockAnimationController.resetSmartspaceTransition();
@@ -3107,7 +3039,7 @@
*/
public boolean hideKeyguardImpl(boolean forceStateChange) {
mIsKeyguard = false;
- Trace.beginSection("StatusBar#hideKeyguard");
+ Trace.beginSection("CentralSurfaces#hideKeyguard");
boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide();
int previousState = mStatusBarStateController.getState();
if (!(mStatusBarStateController.setState(StatusBarState.SHADE, forceStateChange))) {
@@ -3224,7 +3156,7 @@
private void updateDozingState() {
Trace.traceCounter(Trace.TRACE_TAG_APP, "dozing", mDozing ? 1 : 0);
- Trace.beginSection("StatusBar#updateDozingState");
+ Trace.beginSection("CentralSurfaces#updateDozingState");
boolean visibleNotOccluded = mStatusBarKeyguardViewManager.isShowing()
&& !mStatusBarKeyguardViewManager.isOccluded();
@@ -3579,7 +3511,7 @@
@Override
public void onStartedGoingToSleep() {
- String tag = "StatusBar#onStartedGoingToSleep";
+ String tag = "CentralSurfaces#onStartedGoingToSleep";
DejankUtils.startDetectingBlockingIpcs(tag);
updateRevealEffect(false /* wakingUp */);
updateNotificationPanelTouchState();
@@ -3599,7 +3531,7 @@
@Override
public void onStartedWakingUp() {
- String tag = "StatusBar#onStartedWakingUp";
+ String tag = "CentralSurfaces#onStartedWakingUp";
DejankUtils.startDetectingBlockingIpcs(tag);
mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> {
mDeviceInteractive = true;
@@ -3674,7 +3606,7 @@
@Override
public void onScreenTurnedOff() {
- Trace.beginSection("StatusBar#onScreenTurnedOff");
+ Trace.beginSection("CentralSurfaces#onScreenTurnedOff");
mFalsingCollector.onScreenOff();
mScrimController.onScreenTurnedOff();
if (mCloseQsBeforeScreenOff) {
@@ -3765,6 +3697,10 @@
== WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP;
}
+ boolean isWaking() {
+ return mWakefulnessLifecycle.getWakefulness() == WakefulnessLifecycle.WAKEFULNESS_WAKING;
+ }
+
public void notifyBiometricAuthModeChanged() {
mDozeServiceHost.updateDozing();
updateScrimController();
@@ -3781,7 +3717,7 @@
@VisibleForTesting
public void updateScrimController() {
- Trace.beginSection("StatusBar#updateScrimController");
+ Trace.beginSection("CentralSurfaces#updateScrimController");
boolean unlocking = mKeyguardStateController.isShowing() && (
mBiometricUnlockController.isWakeAndUnlock()
@@ -4347,7 +4283,7 @@
if (mBrightnessMirrorController != null) {
mBrightnessMirrorController.onDensityOrFontScaleChanged();
}
- // TODO: Bring these out of StatusBar.
+ // TODO: Bring these out of CentralSurfaces.
mUserInfoControllerImpl.onDensityOrFontScaleChanged();
mUserSwitcherController.onDensityOrFontScaleChanged();
mNotificationIconAreaController.onDensityOrFontScaleChanged(mContext);
@@ -4405,7 +4341,7 @@
mDozeServiceHost.updateDozing();
updateTheme();
mNavigationBarController.touchAutoDim(mDisplayId);
- Trace.beginSection("StatusBar#updateKeyguardState");
+ Trace.beginSection("CentralSurfaces#updateKeyguardState");
if (mState == StatusBarState.KEYGUARD) {
mNotificationPanelViewController.cancelPendingPanelCollapse();
}
@@ -4428,7 +4364,7 @@
@Override
public void onDozingChanged(boolean isDozing) {
- Trace.beginSection("StatusBar#updateDozing");
+ Trace.beginSection("CentralSurfaces#updateDozing");
mDozing = isDozing;
// Collapse the notification panel if open
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
similarity index 80%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
index 4081962..536be1c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
@@ -59,26 +59,24 @@
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import java.util.Optional;
import javax.inject.Inject;
/** */
-@StatusBarComponent.StatusBarScope
-public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks {
- private final StatusBar mStatusBar;
+@CentralSurfacesComponent.CentralSurfacesScope
+public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callbacks {
+ private final CentralSurfaces mCentralSurfaces;
private final Context mContext;
private final ShadeController mShadeController;
private final CommandQueue mCommandQueue;
private final NotificationPanelViewController mNotificationPanelViewController;
- private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
private final MetricsLogger mMetricsLogger;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -107,14 +105,13 @@
VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK);
@Inject
- StatusBarCommandQueueCallbacks(
- StatusBar statusBar,
+ CentralSurfacesCommandQueueCallbacks(
+ CentralSurfaces centralSurfaces,
Context context,
@Main Resources resources,
ShadeController shadeController,
CommandQueue commandQueue,
NotificationPanelViewController notificationPanelViewController,
- Optional<LegacySplitScreen> splitScreenOptional,
RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
MetricsLogger metricsLogger,
KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -136,12 +133,11 @@
DisableFlagsLogger disableFlagsLogger,
@DisplayId int displayId) {
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mContext = context;
mShadeController = shadeController;
mCommandQueue = commandQueue;
mNotificationPanelViewController = notificationPanelViewController;
- mSplitScreenOptional = splitScreenOptional;
mRemoteInputQuickSettingsDisabler = remoteInputQuickSettingsDisabler;
mMetricsLogger = metricsLogger;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
@@ -176,12 +172,12 @@
if (!containsType(types, ITYPE_STATUS_BAR)) {
return;
}
- mStatusBar.clearTransient();
+ mCentralSurfaces.clearTransient();
}
@Override
public void addQsTile(ComponentName tile) {
- QSPanelController qsPanelController = mStatusBar.getQSPanelController();
+ QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController();
if (qsPanelController != null && qsPanelController.getHost() != null) {
qsPanelController.getHost().addTile(tile);
}
@@ -189,7 +185,7 @@
@Override
public void remQsTile(ComponentName tile) {
- QSPanelController qsPanelController = mStatusBar.getQSPanelController();
+ QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController();
if (qsPanelController != null && qsPanelController.getHost() != null) {
qsPanelController.getHost().removeTile(tile);
}
@@ -197,7 +193,7 @@
@Override
public void clickTile(ComponentName tile) {
- QSPanelController qsPanelController = mStatusBar.getQSPanelController();
+ QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController();
if (qsPanelController != null) {
qsPanelController.clickTile(tile);
}
@@ -211,9 +207,9 @@
@Override
public void animateExpandNotificationsPanel() {
- if (StatusBar.SPEW) {
- Log.d(StatusBar.TAG,
- "animateExpand: mExpandedVisible=" + mStatusBar.isExpandedVisible());
+ if (CentralSurfaces.SPEW) {
+ Log.d(CentralSurfaces.TAG,
+ "animateExpand: mExpandedVisible=" + mCentralSurfaces.isExpandedVisible());
}
if (!mCommandQueue.panelsEnabled()) {
return;
@@ -224,9 +220,9 @@
@Override
public void animateExpandSettingsPanel(@Nullable String subPanel) {
- if (StatusBar.SPEW) {
- Log.d(StatusBar.TAG,
- "animateExpand: mExpandedVisible=" + mStatusBar.isExpandedVisible());
+ if (CentralSurfaces.SPEW) {
+ Log.d(CentralSurfaces.TAG,
+ "animateExpand: mExpandedVisible=" + mCentralSurfaces.isExpandedVisible());
}
if (!mCommandQueue.panelsEnabled()) {
return;
@@ -240,21 +236,15 @@
@Override
public void appTransitionCancelled(int displayId) {
- if (displayId == mDisplayId) {
- mSplitScreenOptional.ifPresent(LegacySplitScreen::onAppTransitionFinished);
- }
}
@Override
public void appTransitionFinished(int displayId) {
- if (displayId == mDisplayId) {
- mSplitScreenOptional.ifPresent(LegacySplitScreen::onAppTransitionFinished);
- }
}
@Override
public void dismissKeyboardShortcutsMenu() {
- mStatusBar.resendMessage(StatusBar.MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU);
+ mCentralSurfaces.resendMessage(CentralSurfaces.MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU);
}
/**
* State is one or more of the DISABLE constants from StatusBarManager.
@@ -267,22 +257,22 @@
int state2BeforeAdjustment = state2;
state2 = mRemoteInputQuickSettingsDisabler.adjustDisableFlags(state2);
- Log.d(StatusBar.TAG,
+ Log.d(CentralSurfaces.TAG,
mDisableFlagsLogger.getDisableFlagsString(
/* old= */ new DisableFlagsLogger.DisableState(
- mStatusBar.getDisabled1(), mStatusBar.getDisabled2()),
+ mCentralSurfaces.getDisabled1(), mCentralSurfaces.getDisabled2()),
/* new= */ new DisableFlagsLogger.DisableState(
state1, state2BeforeAdjustment),
/* newStateAfterLocalModification= */ new DisableFlagsLogger.DisableState(
state1, state2)));
- final int old1 = mStatusBar.getDisabled1();
+ final int old1 = mCentralSurfaces.getDisabled1();
final int diff1 = state1 ^ old1;
- mStatusBar.setDisabled1(state1);
+ mCentralSurfaces.setDisabled1(state1);
- final int old2 = mStatusBar.getDisabled2();
+ final int old2 = mCentralSurfaces.getDisabled2();
final int diff2 = state2 ^ old2;
- mStatusBar.setDisabled2(state2);
+ mCentralSurfaces.setDisabled2(state2);
if ((diff1 & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((state1 & StatusBarManager.DISABLE_EXPAND) != 0) {
@@ -291,17 +281,17 @@
}
if ((diff1 & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0) {
- if (mStatusBar.areNotificationAlertsDisabled()) {
+ if (mCentralSurfaces.areNotificationAlertsDisabled()) {
mHeadsUpManager.releaseAllImmediately();
}
}
if ((diff2 & StatusBarManager.DISABLE2_QUICK_SETTINGS) != 0) {
- mStatusBar.updateQsExpansionEnabled();
+ mCentralSurfaces.updateQsExpansionEnabled();
}
if ((diff2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0) {
- mStatusBar.updateQsExpansionEnabled();
+ mCentralSurfaces.updateQsExpansionEnabled();
if ((state2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0) {
mShadeController.animateCollapsePanels();
}
@@ -314,8 +304,8 @@
*/
@Override
public void handleSystemKey(int key) {
- if (StatusBar.SPEW) {
- Log.d(StatusBar.TAG, "handleNavigationKey: " + key);
+ if (CentralSurfaces.SPEW) {
+ Log.d(CentralSurfaces.TAG, "handleNavigationKey: " + key);
}
if (!mCommandQueue.panelsEnabled() || !mKeyguardUpdateMonitor.isDeviceInteractive()
|| mKeyguardStateController.isShowing() && !mKeyguardStateController.isOccluded()) {
@@ -351,81 +341,82 @@
@Override
public void onCameraLaunchGestureDetected(int source) {
- mStatusBar.setLastCameraLaunchSource(source);
- if (mStatusBar.isGoingToSleep()) {
- if (StatusBar.DEBUG_CAMERA_LIFT) {
- Slog.d(StatusBar.TAG, "Finish going to sleep before launching camera");
+ mCentralSurfaces.setLastCameraLaunchSource(source);
+ if (mCentralSurfaces.isGoingToSleep()) {
+ if (CentralSurfaces.DEBUG_CAMERA_LIFT) {
+ Slog.d(CentralSurfaces.TAG, "Finish going to sleep before launching camera");
}
- mStatusBar.setLaunchCameraOnFinishedGoingToSleep(true);
+ mCentralSurfaces.setLaunchCameraOnFinishedGoingToSleep(true);
return;
}
if (!mNotificationPanelViewController.canCameraGestureBeLaunched()) {
- if (StatusBar.DEBUG_CAMERA_LIFT) {
- Slog.d(StatusBar.TAG, "Can't launch camera right now");
+ if (CentralSurfaces.DEBUG_CAMERA_LIFT) {
+ Slog.d(CentralSurfaces.TAG, "Can't launch camera right now");
}
return;
}
- if (!mStatusBar.isDeviceInteractive()) {
+ if (!mCentralSurfaces.isDeviceInteractive()) {
mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_CAMERA_LAUNCH,
"com.android.systemui:CAMERA_GESTURE");
}
vibrateForCameraGesture();
if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) {
- Log.v(StatusBar.TAG, "Camera launch");
+ Log.v(CentralSurfaces.TAG, "Camera launch");
mKeyguardUpdateMonitor.onCameraLaunched();
}
if (!mStatusBarKeyguardViewManager.isShowing()) {
final Intent cameraIntent = CameraIntents.getInsecureCameraIntent(mContext);
- mStatusBar.startActivityDismissingKeyguard(cameraIntent,
+ mCentralSurfaces.startActivityDismissingKeyguard(cameraIntent,
false /* onlyProvisioned */, true /* dismissShade */,
true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0,
null /* animationController */);
} else {
- if (!mStatusBar.isDeviceInteractive()) {
+ if (!mCentralSurfaces.isDeviceInteractive()) {
// Avoid flickering of the scrim when we instant launch the camera and the bouncer
// comes on.
- mStatusBar.acquireGestureWakeLock(StatusBar.LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);
+ mCentralSurfaces.acquireGestureWakeLock(
+ CentralSurfaces.LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);
}
if (isWakingUpOrAwake()) {
- if (StatusBar.DEBUG_CAMERA_LIFT) {
- Slog.d(StatusBar.TAG, "Launching camera");
+ if (CentralSurfaces.DEBUG_CAMERA_LIFT) {
+ Slog.d(CentralSurfaces.TAG, "Launching camera");
}
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
mStatusBarKeyguardViewManager.reset(true /* hide */);
}
mNotificationPanelViewController.launchCamera(
- mStatusBar.isDeviceInteractive() /* animate */, source);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.isDeviceInteractive() /* animate */, source);
+ mCentralSurfaces.updateScrimController();
} else {
// We need to defer the camera launch until the screen comes on, since otherwise
// we will dismiss us too early since we are waiting on an activity to be drawn and
// incorrectly get notified because of the screen on event (which resumes and pauses
// some activities)
- if (StatusBar.DEBUG_CAMERA_LIFT) {
- Slog.d(StatusBar.TAG, "Deferring until screen turns on");
+ if (CentralSurfaces.DEBUG_CAMERA_LIFT) {
+ Slog.d(CentralSurfaces.TAG, "Deferring until screen turns on");
}
- mStatusBar.setLaunchCameraOnFinishedWaking(true);
+ mCentralSurfaces.setLaunchCameraOnFinishedWaking(true);
}
}
}
@Override
public void onEmergencyActionLaunchGestureDetected() {
- Intent emergencyIntent = mStatusBar.getEmergencyActionIntent();
+ Intent emergencyIntent = mCentralSurfaces.getEmergencyActionIntent();
if (emergencyIntent == null) {
- Log.wtf(StatusBar.TAG, "Couldn't find an app to process the emergency intent.");
+ Log.wtf(CentralSurfaces.TAG, "Couldn't find an app to process the emergency intent.");
return;
}
if (isGoingToSleep()) {
- mStatusBar.setLaunchEmergencyActionOnFinishedGoingToSleep(true);
+ mCentralSurfaces.setLaunchEmergencyActionOnFinishedGoingToSleep(true);
return;
}
- if (!mStatusBar.isDeviceInteractive()) {
+ if (!mCentralSurfaces.isDeviceInteractive()) {
mPowerManager.wakeUp(SystemClock.uptimeMillis(),
PowerManager.WAKE_REASON_GESTURE,
"com.android.systemui:EMERGENCY_GESTURE");
@@ -434,17 +425,18 @@
// app-side haptic experimentation.
if (!mStatusBarKeyguardViewManager.isShowing()) {
- mStatusBar.startActivityDismissingKeyguard(emergencyIntent,
+ mCentralSurfaces.startActivityDismissingKeyguard(emergencyIntent,
false /* onlyProvisioned */, true /* dismissShade */,
true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0,
null /* animationController */);
return;
}
- if (!mStatusBar.isDeviceInteractive()) {
+ if (!mCentralSurfaces.isDeviceInteractive()) {
// Avoid flickering of the scrim when we instant launch the camera and the bouncer
// comes on.
- mStatusBar.acquireGestureWakeLock(StatusBar.LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);
+ mCentralSurfaces.acquireGestureWakeLock(
+ CentralSurfaces.LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);
}
if (isWakingUpOrAwake()) {
@@ -458,12 +450,12 @@
// we will dismiss us too early since we are waiting on an activity to be drawn and
// incorrectly get notified because of the screen on event (which resumes and pauses
// some activities)
- mStatusBar.setLaunchEmergencyActionOnFinishedWaking(true);
+ mCentralSurfaces.setLaunchEmergencyActionOnFinishedWaking(true);
}
@Override
public void onRecentsAnimationStateChanged(boolean running) {
- mStatusBar.setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, running);
+ mCentralSurfaces.setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, running);
}
@@ -474,12 +466,12 @@
if (displayId != mDisplayId) {
return;
}
- boolean barModeChanged = mStatusBar.setAppearance(appearance);
+ boolean barModeChanged = mCentralSurfaces.setAppearance(appearance);
mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged,
- mStatusBar.getBarMode(), navbarColorManagedByIme);
+ mCentralSurfaces.getBarMode(), navbarColorManagedByIme);
- mStatusBar.updateBubblesVisibility();
+ mCentralSurfaces.updateBubblesVisibility();
mStatusBarStateController.setSystemBarAttributes(
appearance, behavior, requestedVisibilities, packageName);
}
@@ -493,12 +485,12 @@
if (!containsType(types, ITYPE_STATUS_BAR)) {
return;
}
- mStatusBar.showTransientUnchecked();
+ mCentralSurfaces.showTransientUnchecked();
}
@Override
public void toggleKeyboardShortcutsMenu(int deviceId) {
- mStatusBar.resendMessage(new StatusBar.KeyboardShortcutsMessage(deviceId));
+ mCentralSurfaces.resendMessage(new CentralSurfaces.KeyboardShortcutsMessage(deviceId));
}
@Override
@@ -514,12 +506,12 @@
@Override
public void showPinningEnterExitToast(boolean entering) {
- mStatusBar.showPinningEnterExitToast(entering);
+ mCentralSurfaces.showPinningEnterExitToast(entering);
}
@Override
public void showPinningEscapeToast() {
- mStatusBar.showPinningEscapeToast();
+ mCentralSurfaces.showPinningEscapeToast();
}
@Override
@@ -529,12 +521,12 @@
return;
}
// Show screen pinning request, since this comes from an app, show 'no thanks', button.
- mStatusBar.showScreenPinningRequest(taskId, true);
+ mCentralSurfaces.showScreenPinningRequest(taskId, true);
}
@Override
public void showWirelessChargingAnimation(int batteryLevel) {
- mStatusBar.showWirelessChargingAnimation(batteryLevel);
+ mCentralSurfaces.showWirelessChargingAnimation(batteryLevel);
}
@Override
@@ -544,23 +536,18 @@
@Override
public void suppressAmbientDisplay(boolean suppressed) {
- mDozeServiceHost.setDozeSuppressed(suppressed);
+ mDozeServiceHost.setAlwaysOnSuppressed(suppressed);
}
@Override
public void togglePanel() {
- if (mStatusBar.isPanelExpanded()) {
+ if (mCentralSurfaces.isPanelExpanded()) {
mShadeController.animateCollapsePanels();
} else {
animateExpandNotificationsPanel();
}
}
- @Override
- public void toggleSplitScreen() {
- mStatusBar.toggleSplitScreenMode(-1 /* metricsDockAction */, -1 /* metricsUndockAction */);
- }
-
private boolean isGoingToSleep() {
return mWakefulnessLifecycle.getWakefulness()
== WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP;
@@ -591,8 +578,8 @@
// Make sure to pass -1 for repeat so VibratorManagerService doesn't stop us when going
// to sleep.
return VibrationEffect.createWaveform(
- StatusBar.CAMERA_LAUNCH_GESTURE_VIBRATION_TIMINGS,
- StatusBar.CAMERA_LAUNCH_GESTURE_VIBRATION_AMPLITUDES,
+ CentralSurfaces.CAMERA_LAUNCH_GESTURE_VIBRATION_TIMINGS,
+ CentralSurfaces.CAMERA_LAUNCH_GESTURE_VIBRATION_AMPLITUDES,
/* repeat= */ -1);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
index 05fba54..55b310f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeServiceHost.java
@@ -97,8 +97,8 @@
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private NotificationPanelViewController mNotificationPanel;
private View mAmbientIndicationContainer;
- private StatusBar mStatusBar;
- private boolean mSuppressed;
+ private CentralSurfaces mCentralSurfaces;
+ private boolean mAlwaysOnSuppressed;
@Inject
public DozeServiceHost(DozeLog dozeLog, PowerManager powerManager,
@@ -146,12 +146,12 @@
* Initialize instance with objects only available later during execution.
*/
public void initialize(
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
NotificationShadeWindowViewController notificationShadeWindowViewController,
NotificationPanelViewController notificationPanel,
View ambientIndicationContainer) {
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mNotificationPanel = notificationPanel;
mNotificationShadeWindowViewController = notificationShadeWindowViewController;
@@ -205,7 +205,7 @@
mDozingRequested = true;
updateDozing();
mDozeLog.traceDozing(mStatusBarStateController.isDozing());
- mStatusBar.updateIsKeyguard();
+ mCentralSurfaces.updateIsKeyguard();
}
}
@@ -247,13 +247,13 @@
&& mWakeLockScreenPerformsAuth;
// Set the state to pulsing, so ScrimController will know what to do once we ask it to
// execute the transition. The pulse callback will then be invoked when the scrims
- // are black, indicating that StatusBar is ready to present the rest of the UI.
+ // are black, indicating that CentralSurfaces is ready to present the rest of the UI.
mPulsing = true;
mDozeScrimController.pulse(new PulseCallback() {
@Override
public void onPulseStarted() {
callback.onPulseStarted();
- mStatusBar.updateNotificationPanelTouchState();
+ mCentralSurfaces.updateNotificationPanelTouchState();
setPulsing(true);
}
@@ -261,7 +261,7 @@
public void onPulseFinished() {
mPulsing = false;
callback.onPulseFinished();
- mStatusBar.updateNotificationPanelTouchState();
+ mCentralSurfaces.updateNotificationPanelTouchState();
mScrimController.setWakeLockScreenSensorActive(false);
setPulsing(false);
}
@@ -274,14 +274,14 @@
if (mKeyguardUpdateMonitor != null && passiveAuthInterrupt) {
mKeyguardUpdateMonitor.onAuthInterruptDetected(pulsing /* active */);
}
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
mPulseExpansionHandler.setPulsing(pulsing);
mNotificationWakeUpCoordinator.setPulsing(pulsing);
}
}, reason);
// DozeScrimController is in pulse state, now let's ask ScrimController to start
// pulsing and draw the black frame, if necessary.
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
}
@Override
@@ -332,15 +332,6 @@
}
@Override
- public boolean isBlockingDoze() {
- if (mBiometricUnlockControllerLazy.get().hasPendingAuthentication()) {
- Log.i(StatusBar.TAG, "Blocking AOD because fingerprint has authenticated");
- return true;
- }
- return false;
- }
-
- @Override
public void extendPulse(int reason) {
if (reason == DozeLog.PULSE_REASON_SENSOR_WAKE_REACH) {
mScrimController.setWakeLockScreenSensorActive(true);
@@ -412,14 +403,14 @@
Log.w(TAG, "Overlapping onDisplayOffCallback. Ignoring previous one.");
}
mPendingScreenOffCallback = onDisplayOffCallback;
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
}
@Override
public void cancelGentleSleep() {
mPendingScreenOffCallback = null;
if (mScrimController.getState() == ScrimState.OFF) {
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
}
}
@@ -452,18 +443,25 @@
return mIgnoreTouchWhilePulsing;
}
- void setDozeSuppressed(boolean suppressed) {
- if (suppressed == mSuppressed) {
+ /**
+ * Suppresses always-on-display and waking up the display for notifications.
+ * Does not disable wakeup gestures like pickup and tap.
+ */
+ void setAlwaysOnSuppressed(boolean suppressed) {
+ if (suppressed == mAlwaysOnSuppressed) {
return;
}
- mSuppressed = suppressed;
- mDozeLog.traceDozingSuppressed(mSuppressed);
+ mAlwaysOnSuppressed = suppressed;
for (Callback callback : mCallbacks) {
- callback.onDozeSuppressedChanged(suppressed);
+ callback.onAlwaysOnSuppressedChanged(suppressed);
}
}
- public boolean isDozeSuppressed() {
- return mSuppressed;
+ /**
+ * Whether always-on-display is being suppressed. This does not affect wakeup gestures like
+ * pickup and tap.
+ */
+ public boolean isAlwaysOnSuppressed() {
+ return mAlwaysOnSuppressed;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 84103c0..541aeab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -118,7 +118,7 @@
KeyguardStateController.Callback,
AccessibilityController.AccessibilityStateChangedCallback {
- final static String TAG = "StatusBar/KeyguardBottomAreaView";
+ final static String TAG = "CentralSurfaces/KeyguardBottomAreaView";
public static final String CAMERA_LAUNCH_SOURCE_AFFORDANCE = "lockscreen_affordance";
public static final String CAMERA_LAUNCH_SOURCE_WIGGLE = "wiggle_gesture";
@@ -169,7 +169,7 @@
private FlashlightController mFlashlightController;
private PreviewInflater mPreviewInflater;
private AccessibilityController mAccessibilityController;
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
private KeyguardAffordanceHelper mAffordanceHelper;
private FalsingManager mFalsingManager;
private boolean mUserSetupComplete;
@@ -274,7 +274,7 @@
};
public void initFrom(KeyguardBottomAreaView oldBottomArea) {
- setStatusBar(oldBottomArea.mStatusBar);
+ setCentralSurfaces(oldBottomArea.mCentralSurfaces);
// if it exists, continue to use the original ambient indication container
// instead of the newly inflated one
@@ -473,8 +473,8 @@
mRightAffordanceView.setContentDescription(state.contentDescription);
}
- public void setStatusBar(StatusBar statusBar) {
- mStatusBar = statusBar;
+ public void setCentralSurfaces(CentralSurfaces centralSurfaces) {
+ mCentralSurfaces = centralSurfaces;
updateCameraVisibility(); // in case onFinishInflate() was called too early
}
@@ -732,7 +732,7 @@
} else {
boolean dismissShade = !TextUtils.isEmpty(mRightButtonStr)
&& Dependency.get(TunerService.class).getValue(LOCKSCREEN_RIGHT_UNLOCK, 1) != 0;
- mStatusBar.executeRunnableDismissingKeyguard(runnable, null /* cancelAction */,
+ mCentralSurfaces.executeRunnableDismissingKeyguard(runnable, null /* cancelAction */,
dismissShade, false /* afterKeyguardGone */, true /* deferred */);
}
}
@@ -1019,7 +1019,8 @@
@Override
public IconState getIcon() {
- boolean isCameraDisabled = (mStatusBar != null) && !mStatusBar.isCameraAllowedByAdmin();
+ boolean isCameraDisabled = (mCentralSurfaces != null)
+ && !mCentralSurfaces.isCameraAllowedByAdmin();
mIconState.isVisible = !isCameraDisabled
&& mShowCameraAffordance
&& mUserSetupComplete
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
index 9bdefcd..2c4fc6c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardEnvironmentImpl.java
@@ -14,8 +14,8 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
-import static com.android.systemui.statusbar.phone.StatusBar.MULTIUSER_DEBUG;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.MULTIUSER_DEBUG;
import android.service.notification.StatusBarNotification;
import android.util.Log;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index a0f8d05..61760fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -184,11 +184,12 @@
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.MediaContainerView;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.phone.panelstate.PanelState;
@@ -221,7 +222,7 @@
import javax.inject.Inject;
import javax.inject.Provider;
-@StatusBarComponent.StatusBarScope
+@CentralSurfacesComponent.CentralSurfacesScope
public class NotificationPanelViewController extends PanelViewController
implements NotifPanelEventSource {
@@ -665,6 +666,8 @@
private final ListenerSet<Callbacks> mNotifEventSourceCallbacks = new ListenerSet<>();
+ private final NotificationListContainer mNotificationListContainer;
+
private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
@@ -792,7 +795,8 @@
InteractionJankMonitor interactionJankMonitor,
QsFrameTranslateController qsFrameTranslateController,
SysUiState sysUiState,
- KeyguardUnlockAnimationController keyguardUnlockAnimationController) {
+ KeyguardUnlockAnimationController keyguardUnlockAnimationController,
+ NotificationListContainer notificationListContainer) {
super(view,
falsingManager,
dozeLog,
@@ -823,6 +827,7 @@
mMediaHierarchyManager = mediaHierarchyManager;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mNotificationsQSContainerController = notificationsQSContainerController;
+ mNotificationListContainer = notificationListContainer;
mNotificationsQSContainerController.init();
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
mGroupManager = groupManager;
@@ -1127,10 +1132,10 @@
return mKeyguardStatusViewController.hasCustomClock();
}
- private void setStatusBar(StatusBar bar) {
+ private void setCentralSurfaces(CentralSurfaces centralSurfaces) {
// TODO: this can be injected.
- mStatusBar = bar;
- mKeyguardBottomArea.setStatusBar(mStatusBar);
+ mCentralSurfaces = centralSurfaces;
+ mKeyguardBottomArea.setCentralSurfaces(mCentralSurfaces);
}
public void updateResources() {
@@ -1141,8 +1146,13 @@
R.dimen.split_shade_notifications_scrim_margin_bottom);
int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width);
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
- mShouldUseSplitNotificationShade =
+
+ final boolean newShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mResources);
+ final boolean splitNotificationShadeChanged =
+ mShouldUseSplitNotificationShade != newShouldUseSplitNotificationShade;
+
+ mShouldUseSplitNotificationShade = newShouldUseSplitNotificationShade;
if (mQs != null) {
mQs.setInSplitShade(mShouldUseSplitNotificationShade);
}
@@ -1188,6 +1198,10 @@
updateKeyguardStatusViewAlignment(/* animate= */false);
mKeyguardMediaController.refreshMediaPosition();
+
+ if (splitNotificationShadeChanged) {
+ updateClockAppearance();
+ }
}
private static void ensureAllViewsHaveIds(ViewGroup parentView) {
@@ -1311,7 +1325,7 @@
mAffordanceHelper = new KeyguardAffordanceHelper(
mKeyguardAffordanceHelperCallback, mView.getContext(), mFalsingManager);
mKeyguardBottomArea.setAffordanceHelper(mAffordanceHelper);
- mKeyguardBottomArea.setStatusBar(mStatusBar);
+ mKeyguardBottomArea.setCentralSurfaces(mCentralSurfaces);
mKeyguardBottomArea.setUserSetupComplete(mUserSetupComplete);
mKeyguardBottomArea.setFalsingManager(mFalsingManager);
mKeyguardBottomArea.initWallet(mQuickAccessWalletController);
@@ -1574,7 +1588,7 @@
float lockIconPadding = 0;
if (mLockIconViewController.getTop() != 0) {
- lockIconPadding = mStatusBar.getDisplayHeight() - mLockIconViewController.getTop()
+ lockIconPadding = mCentralSurfaces.getDisplayHeight() - mLockIconViewController.getTop()
+ mResources.getDimensionPixelSize(R.dimen.min_lock_icon_padding);
}
@@ -1728,7 +1742,7 @@
mAffordanceHelper.reset(false);
mLastCameraLaunchSource = KeyguardBottomAreaView.CAMERA_LAUNCH_SOURCE_AFFORDANCE;
}
- mStatusBar.getGutsManager().closeAndSaveGuts(true /* leavebehind */, true /* force */,
+ mCentralSurfaces.getGutsManager().closeAndSaveGuts(true /* leavebehind */, true /* force */,
true /* controls */, -1 /* x */, -1 /* y */, true /* resetMenu */);
if (animate && !isFullyCollapsed()) {
animateCloseQs(true /* animateAway */);
@@ -1827,7 +1841,7 @@
@Override
public void fling(float vel, boolean expand) {
- GestureRecorder gr = mStatusBar.getGestureRecorder();
+ GestureRecorder gr = mCentralSurfaces.getGestureRecorder();
if (gr != null) {
gr.tag("fling " + ((vel > 0) ? "open" : "closed"), "notifications,v=" + vel);
}
@@ -2016,8 +2030,8 @@
mBarState == KEYGUARD ? MetricsEvent.ACTION_LS_QS
: MetricsEvent.ACTION_SHADE_QS_PULL;
mLockscreenGestureLogger.write(gesture,
- (int) ((y - mInitialTouchY) / mStatusBar.getDisplayDensity()),
- (int) (vel / mStatusBar.getDisplayDensity()));
+ (int) ((y - mInitialTouchY) / mCentralSurfaces.getDisplayDensity()),
+ (int) (vel / mCentralSurfaces.getDisplayDensity()));
}
private boolean flingExpandsQs(float vel) {
@@ -2295,7 +2309,7 @@
}
private int getFalsingThreshold() {
- float factor = mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
+ float factor = mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
return (int) (mQsFalsingThreshold * factor);
}
@@ -2322,7 +2336,7 @@
// When expanding QS, let's authenticate the user if possible,
// this will speed up notification actions.
if (height == 0) {
- mStatusBar.requestFaceAuth(false);
+ mCentralSurfaces.requestFaceAuth(false);
}
}
@@ -2333,7 +2347,7 @@
updateQsState();
requestPanelHeightUpdate();
mFalsingCollector.setQsExpanded(expanded);
- mStatusBar.setQsExpanded(expanded);
+ mCentralSurfaces.setQsExpanded(expanded);
mNotificationsQSContainerController.setQsExpanded(expanded);
mPulseExpansionHandler.setQsExpanded(expanded);
mKeyguardBypassController.setQSExpanded(expanded);
@@ -2417,7 +2431,7 @@
if (!mFalsingManager.isUnlockingDisabled() && mQsFullyExpanded
&& mFalsingCollector.shouldEnforceBouncer()) {
- mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
+ mCentralSurfaces.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */);
}
if (DEBUG) {
@@ -3105,7 +3119,7 @@
if (mPanelExpanded != isExpanded) {
mHeadsUpManager.setIsPanelExpanded(isExpanded);
mStatusBarTouchableRegionManager.setPanelExpanded(isExpanded);
- mStatusBar.setPanelExpanded(isExpanded);
+ mCentralSurfaces.setPanelExpanded(isExpanded);
mPanelExpanded = isExpanded;
if (!isExpanded && mQs != null && mQs.isCustomizing()) {
@@ -3230,7 +3244,7 @@
mKeyguardBottomArea.setImportantForAccessibility(
alpha == 0f ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
: View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
- View ambientIndicationContainer = mStatusBar.getAmbientIndicationContainer();
+ View ambientIndicationContainer = mCentralSurfaces.getAmbientIndicationContainer();
if (ambientIndicationContainer != null) {
ambientIndicationContainer.setAlpha(alpha);
}
@@ -3569,7 +3583,7 @@
@Override
protected void onClosingFinished() {
- mStatusBar.onClosingFinished();
+ mCentralSurfaces.onClosingFinished();
setClosingWithAlphaFadeout(false);
mMediaHierarchyManager.closeGuts();
}
@@ -3631,7 +3645,7 @@
}
public void clearNotificationEffects() {
- mStatusBar.clearNotificationEffects();
+ mCentralSurfaces.clearNotificationEffects();
}
@Override
@@ -3693,7 +3707,7 @@
* Whether the camera application can be launched for the camera launch gesture.
*/
public boolean canCameraGestureBeLaunched() {
- if (!mStatusBar.isCameraAllowedByAdmin()) {
+ if (!mCentralSurfaces.isCameraAllowedByAdmin()) {
return false;
}
@@ -4037,8 +4051,7 @@
}
public boolean hasPulsingNotifications() {
- return mNotificationStackScrollLayoutController
- .getNotificationListContainer().hasPulsingNotifications();
+ return mNotificationListContainer.hasPulsingNotifications();
}
public ActivatableNotificationView getActivatedChild() {
@@ -4073,10 +4086,10 @@
* @param hideExpandedRunnable a runnable to run when we need to hide the expanded panel.
*/
public void initDependencies(
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
Runnable hideExpandedRunnable,
NotificationShelfController notificationShelfController) {
- setStatusBar(statusBar);
+ setCentralSurfaces(centralSurfaces);
mHideExpandedRunnable = hideExpandedRunnable;
mNotificationStackScrollLayoutController.setShelfController(notificationShelfController);
mNotificationShelfController = notificationShelfController;
@@ -4149,7 +4162,7 @@
initDownStates(event);
// Do not let touches go to shade or QS if the bouncer is visible,
// but still let user swipe down to expand the panel, dismissing the bouncer.
- if (mStatusBar.isBouncerShowing()) {
+ if (mCentralSurfaces.isBouncerShowing()) {
return true;
}
if (mCommandQueue.panelsEnabled()
@@ -4192,8 +4205,8 @@
// Do not allow panel expansion if bouncer is scrimmed or showing over a dream,
// otherwise user would be able to pull down QS or expand the shade.
- if (mStatusBar.isBouncerShowingScrimmed()
- || mStatusBar.isBouncerShowingOverDream()) {
+ if (mCentralSurfaces.isBouncerShowingScrimmed()
+ || mCentralSurfaces.isBouncerShowingOverDream()) {
return false;
}
@@ -4257,15 +4270,15 @@
new PhoneStatusBarView.TouchEventHandler() {
@Override
public void onInterceptTouchEvent(MotionEvent event) {
- mStatusBar.onTouchEvent(event);
+ mCentralSurfaces.onTouchEvent(event);
}
@Override
public boolean handleTouchEvent(MotionEvent event) {
- mStatusBar.onTouchEvent(event);
+ mCentralSurfaces.onTouchEvent(event);
// TODO(b/202981994): Move the touch debugging in this method to a central
- // location. (Right now, it's split between StatusBar and here.)
+ // location. (Right now, it's split between CentralSurfaces and here.)
// If panels aren't enabled, ignore the gesture and don't pass it down to the
// panel view.
@@ -4482,7 +4495,7 @@
: !rightPage;
mIsLaunchTransitionRunning = true;
mLaunchAnimationEndRunnable = null;
- float displayDensity = mStatusBar.getDisplayDensity();
+ float displayDensity = mCentralSurfaces.getDisplayDensity();
int lengthDp = Math.abs((int) (translation / displayDensity));
int velocityDp = Math.abs((int) (vel / displayDensity));
if (start) {
@@ -4490,7 +4503,7 @@
mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_DIALER);
mFalsingCollector.onLeftAffordanceOn();
if (mFalsingCollector.shouldEnforceBouncer()) {
- mStatusBar.executeRunnableDismissingKeyguard(
+ mCentralSurfaces.executeRunnableDismissingKeyguard(
() -> mKeyguardBottomArea.launchLeftAffordance(), null,
true /* dismissShade */, false /* afterKeyguardGone */,
true /* deferred */);
@@ -4506,7 +4519,7 @@
}
mFalsingCollector.onCameraOn();
if (mFalsingCollector.shouldEnforceBouncer()) {
- mStatusBar.executeRunnableDismissingKeyguard(
+ mCentralSurfaces.executeRunnableDismissingKeyguard(
() -> mKeyguardBottomArea.launchCamera(mLastCameraLaunchSource), null,
true /* dismissShade */, false /* afterKeyguardGone */,
true /* deferred */);
@@ -4514,7 +4527,7 @@
mKeyguardBottomArea.launchCamera(mLastCameraLaunchSource);
}
}
- mStatusBar.startLaunchTransitionTimeout();
+ mCentralSurfaces.startLaunchTransitionTimeout();
mBlockTouches = true;
}
@@ -4526,7 +4539,7 @@
mLaunchAnimationEndRunnable.run();
mLaunchAnimationEndRunnable = null;
}
- mStatusBar.readyForKeyguardDone();
+ mCentralSurfaces.readyForKeyguardDone();
}
@Override
@@ -4563,18 +4576,18 @@
mHintAnimationRunning = true;
mAffordanceHelper.startHintAnimation(rightIcon, () -> {
mHintAnimationRunning = false;
- mStatusBar.onHintFinished();
+ mCentralSurfaces.onHintFinished();
});
rightIcon =
mView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? !rightIcon
: rightIcon;
if (rightIcon) {
- mStatusBar.onCameraHintStarted();
+ mCentralSurfaces.onCameraHintStarted();
} else {
if (mKeyguardBottomArea.isLeftVoiceAssist()) {
- mStatusBar.onVoiceAssistHintStarted();
+ mCentralSurfaces.onVoiceAssistHintStarted();
} else {
- mStatusBar.onPhoneHintStarted();
+ mCentralSurfaces.onPhoneHintStarted();
}
}
}
@@ -4605,7 +4618,7 @@
@Override
public float getAffordanceFalsingFactor() {
- return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
+ return mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
}
@Override
@@ -5121,7 +5134,7 @@
mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
if (state == STATE_OPENING) {
- mStatusBar.makeExpandedVisible(false);
+ mCentralSurfaces.makeExpandedVisible(false);
}
if (state == STATE_CLOSED) {
// Close the status bar in the next frame so we can show the end of the
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
index 5caf4f6..0ff010a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
@@ -840,7 +840,7 @@
Set<String> mComponentsForcingTopUi = new HashSet<>();
/**
- * The {@link StatusBar} state from the status bar.
+ * The status bar state from {@link CentralSurfaces}.
*/
int mStatusBarState;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
index fb0e306..1e3a02b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowView.java
@@ -58,7 +58,7 @@
*/
public class NotificationShadeWindowView extends FrameLayout {
public static final String TAG = "NotificationShadeWindowView";
- public static final boolean DEBUG = StatusBar.DEBUG;
+ public static final boolean DEBUG = CentralSurfaces.DEBUG;
private int mRightInset = 0;
private int mLeftInset = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
index 396703b..101c86f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java
@@ -44,6 +44,7 @@
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.tuner.TunerService;
@@ -57,6 +58,7 @@
/**
* Controller for {@link NotificationShadeWindowView}.
*/
+@CentralSurfacesComponent.CentralSurfacesScope
public class NotificationShadeWindowViewController {
private static final String TAG = "NotifShadeWindowVC";
private final FalsingCollector mFalsingCollector;
@@ -77,8 +79,8 @@
private boolean mExpandAnimationRunning;
private NotificationStackScrollLayout mStackScrollLayout;
private PhoneStatusBarViewController mStatusBarViewController;
- private StatusBar mService;
- private NotificationShadeWindowController mNotificationShadeWindowController;
+ private final CentralSurfaces mService;
+ private final NotificationShadeWindowController mNotificationShadeWindowController;
private DragDownHelper mDragDownHelper;
private boolean mDoubleTapEnabled;
private boolean mSingleTapEnabled;
@@ -105,7 +107,9 @@
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
StatusBarWindowStateController statusBarWindowStateController,
LockIconViewController lockIconViewController,
- Optional<LowLightClockController> lowLightClockController) {
+ Optional<LowLightClockController> lowLightClockController,
+ CentralSurfaces centralSurfaces,
+ NotificationShadeWindowController controller) {
mLockscreenShadeTransitionController = transitionController;
mFalsingCollector = falsingCollector;
mTunerService = tunerService;
@@ -120,6 +124,8 @@
mStatusBarWindowStateController = statusBarWindowStateController;
mLockIconViewController = lockIconViewController;
mLowLightClockController = lowLightClockController;
+ mService = centralSurfaces;
+ mNotificationShadeWindowController = controller;
// This view is not part of the newly inflated expanded status bar.
mBrightnessMirror = mView.findViewById(R.id.brightness_mirror_container);
@@ -452,11 +458,6 @@
mStatusBarViewController = statusBarViewController;
}
- public void setService(StatusBar statusBar, NotificationShadeWindowController controller) {
- mService = statusBar;
- mNotificationShadeWindowController = controller;
- }
-
/**
* Tell the controller that dozing has begun or ended.
* @param dozing True if dozing has begun.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 249f988..45dc943 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -27,7 +27,7 @@
public static final String TAG = PanelView.class.getSimpleName();
private PanelViewController.TouchHandler mTouchHandler;
- protected StatusBar mStatusBar;
+ protected CentralSurfaces mCentralSurfaces;
protected HeadsUpManagerPhone mHeadsUpManager;
protected KeyguardBottomAreaView mKeyguardBottomArea;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
index 85e8042..7c1775e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
@@ -113,7 +113,7 @@
Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args));
}
- protected StatusBar mStatusBar;
+ protected CentralSurfaces mCentralSurfaces;
protected HeadsUpManagerPhone mHeadsUpManager;
protected final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
@@ -349,9 +349,9 @@
//TODO: keyguard opens QS a different way; log that too?
// Log the position of the swipe that opened the panel
- float width = mStatusBar.getDisplayWidth();
- float height = mStatusBar.getDisplayHeight();
- int rot = mStatusBar.getRotation();
+ float width = mCentralSurfaces.getDisplayWidth();
+ float height = mCentralSurfaces.getDisplayHeight();
+ int rot = mCentralSurfaces.getRotation();
mLockscreenGestureLogger.writeAtFractionalPosition(MetricsEvent.ACTION_PANEL_VIEW_EXPAND,
(int) (event.getX() / width * 100), (int) (event.getY() / height * 100), rot);
@@ -433,10 +433,11 @@
}
mDozeLog.traceFling(expand, mTouchAboveFalsingThreshold,
- mStatusBar.isFalsingThresholdNeeded(), mStatusBar.isWakeUpComingFromTouch());
+ mCentralSurfaces.isFalsingThresholdNeeded(),
+ mCentralSurfaces.isWakeUpComingFromTouch());
// Log collapse gesture if on lock screen.
if (!expand && onKeyguard) {
- float displayDensity = mStatusBar.getDisplayDensity();
+ float displayDensity = mCentralSurfaces.getDisplayDensity();
int heightDp = (int) Math.abs((y - mInitialTouchY) / displayDensity);
int velocityDp = (int) Math.abs(vel / displayDensity);
mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_UNLOCK, heightDp, velocityDp);
@@ -453,7 +454,7 @@
if (mUpdateFlingOnLayout) {
mUpdateFlingVelocity = vel;
}
- } else if (!mStatusBar.isBouncerShowing()
+ } else if (!mCentralSurfaces.isBouncerShowing()
&& !mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating()
&& !mKeyguardStateController.isKeyguardGoingAway()) {
boolean expands = onEmptySpaceClick(mInitialTouchX);
@@ -469,7 +470,7 @@
}
private int getFalsingThreshold() {
- float factor = mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
+ float factor = mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f;
return (int) (mUnlockFalsingThreshold * factor);
}
@@ -479,14 +480,14 @@
protected void onTrackingStopped(boolean expand) {
mTracking = false;
- mStatusBar.onTrackingStopped(expand);
+ mCentralSurfaces.onTrackingStopped(expand);
updatePanelExpansionAndVisibility();
}
protected void onTrackingStarted() {
endClosing();
mTracking = true;
- mStatusBar.onTrackingStarted();
+ mCentralSurfaces.onTrackingStarted();
notifyExpandingStarted();
updatePanelExpansionAndVisibility();
}
@@ -556,7 +557,7 @@
*/
private boolean isFalseTouch(float x, float y,
@Classifier.InteractionType int interactionType) {
- if (!mStatusBar.isFalsingThresholdNeeded()) {
+ if (!mCentralSurfaces.isFalsingThresholdNeeded()) {
return false;
}
if (mFalsingManager.isClassifierEnabled()) {
@@ -921,7 +922,7 @@
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
return;
}
- if (mStatusBar.getNotificationShadeWindowView().isVisibleToUser()) {
+ if (mCentralSurfaces.getNotificationShadeWindowView().isVisibleToUser()) {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (mAnimateAfterExpanding) {
notifyExpandingStarted();
@@ -976,11 +977,11 @@
}
protected void onUnlockHintFinished() {
- mStatusBar.onHintFinished();
+ mCentralSurfaces.onHintFinished();
}
protected void onUnlockHintStarted() {
- mStatusBar.onUnlockHintStarted();
+ mCentralSurfaces.onUnlockHintStarted();
}
public boolean isUnlockHintRunning() {
@@ -1018,7 +1019,7 @@
View[] viewsToAnimate = {
mKeyguardBottomArea.getIndicationArea(),
- mStatusBar.getAmbientIndicationContainer()};
+ mCentralSurfaces.getAmbientIndicationContainer()};
for (View v : viewsToAnimate) {
if (v == null) {
continue;
@@ -1210,7 +1211,7 @@
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
- mStatusBar.userActivity();
+ mCentralSurfaces.userActivity();
mAnimatingOnDown = mHeightAnimator != null && !mIsSpringBackAnimation;
mMinExpandHeight = 0.0f;
mDownTime = SystemClock.uptimeMillis();
@@ -1340,7 +1341,7 @@
onTrackingStarted();
}
if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp()
- && !mStatusBar.isBouncerShowing()) {
+ && !mCentralSurfaces.isBouncerShowing()) {
startOpening(event);
}
break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
index 224b2e4..9da2ef73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
@@ -31,6 +31,7 @@
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.android.systemui.util.ViewController
import com.android.systemui.util.kotlin.getOrNull
+import com.android.systemui.util.view.ViewUtil
import java.util.Optional
@@ -43,6 +44,7 @@
@Named(UNFOLD_STATUS_BAR) private val progressProvider: ScopedUnfoldTransitionProgressProvider?,
private val moveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController?,
private val userSwitcherController: StatusBarUserSwitcherController,
+ private val viewUtil: ViewUtil,
touchEventHandler: PhoneStatusBarView.TouchEventHandler,
private val configurationController: ConfigurationController
) : ViewController<PhoneStatusBarView>(view) {
@@ -118,12 +120,7 @@
* view's range and false otherwise.
*/
fun touchIsWithinView(x: Float, y: Float): Boolean {
- val left = mView.locationOnScreen[0]
- val top = mView.locationOnScreen[1]
- return left <= x &&
- x <= left + mView.width &&
- top <= y &&
- y <= top + mView.height
+ return viewUtil.touchIsWithinView(mView, x, y)
}
class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
@@ -163,6 +160,7 @@
@Named(UNFOLD_STATUS_BAR)
private val progressProvider: Optional<ScopedUnfoldTransitionProgressProvider>,
private val userSwitcherController: StatusBarUserSwitcherController,
+ private val viewUtil: ViewUtil,
private val configurationController: ConfigurationController
) {
fun create(
@@ -174,6 +172,7 @@
progressProvider.getOrNull(),
unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController(),
userSwitcherController,
+ viewUtil,
touchEventHandler,
configurationController
)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
index ea61a8b..c817466 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenOffAnimationController.kt
@@ -37,8 +37,8 @@
private val animations: List<ScreenOffAnimation> =
listOfNotNull(foldToAodAnimation, unlockedScreenOffAnimation)
- fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {
- animations.forEach { it.initialize(statusBar, lightRevealScrim) }
+ fun initialize(centralSurfaces: CentralSurfaces, lightRevealScrim: LightRevealScrim) {
+ animations.forEach { it.initialize(centralSurfaces, lightRevealScrim) }
wakefulnessLifecycle.addObserver(this)
}
@@ -131,7 +131,7 @@
animations.any { it.isKeyguardHideDelayed() }
/**
- * Return true to make the StatusBar expanded so we can animate [LightRevealScrim]
+ * Return true to make the status bar expanded so we can animate [LightRevealScrim]
*/
fun shouldShowLightRevealScrim(): Boolean =
animations.any { it.shouldPlayAnimation() }
@@ -197,7 +197,7 @@
}
interface ScreenOffAnimation {
- fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {}
+ fun initialize(centralSurfaces: CentralSurfaces, lightRevealScrim: LightRevealScrim) {}
/**
* Called when started going to sleep, should return true if the animation will be played
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 8d64041..a3c795f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -413,7 +413,7 @@
}
if (mKeyguardUpdateMonitor.needsSlowUnlockTransition() && mState == ScrimState.UNLOCKED) {
- mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY;
+ mAnimationDelay = CentralSurfaces.FADE_KEYGUARD_START_DELAY;
scheduleUpdate();
} else if (((oldState == ScrimState.AOD || oldState == ScrimState.PULSING) // leaving doze
&& (!mDozeParameters.getAlwaysOn() || mState == ScrimState.UNLOCKED))
@@ -1255,7 +1255,7 @@
public void setScrimBehindChangeRunnable(Runnable changeRunnable) {
// TODO: remove this. This is necessary because of an order-of-operations limitation.
- // The fix is to move more of these class into @StatusBarScope
+ // The fix is to move more of these class into @CentralSurfacesScope
if (mScrimBehind == null) {
mScrimBehindChangeRunnable = changeRunnable;
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index bfd625b..9028870 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -238,7 +238,7 @@
mAnimationDuration = mKeyguardFadingAway
? mKeyguardFadingAwayDuration
- : StatusBar.FADE_KEYGUARD_DURATION;
+ : CentralSurfaces.FADE_KEYGUARD_DURATION;
boolean fromAod = previousState == AOD || previousState == PULSING;
mAnimateChange = !mLaunchingAffordanceWithPreview && !fromAod;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
index 24bb7f2..83ee125 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
@@ -18,9 +18,9 @@
/**
* {@link ShadeController} is an abstraction of the work that used to be hard-coded in
- * {@link StatusBar}. The shade itself represents the concept of the status bar window state, and
- * can be in multiple states: dozing, locked, showing the bouncer, occluded, etc. All/some of these
- * are coordinated with {@link StatusBarKeyguardViewManager} via
+ * {@link CentralSurfaces}. The shade itself represents the concept of the status bar window state,
+ * and can be in multiple states: dozing, locked, showing the bouncer, occluded, etc. All/some of
+ * these are coordinated with {@link StatusBarKeyguardViewManager} via
* {@link com.android.systemui.keyguard.KeyguardViewMediator} and others.
*/
public interface ShadeController {
@@ -38,7 +38,7 @@
/**
* Collapse the shade animated, showing the bouncer when on {@link StatusBarState#KEYGUARD} or
- * dismissing {@link StatusBar} when on {@link StatusBarState#SHADE}.
+ * dismissing {@link CentralSurfaces} when on {@link StatusBarState#SHADE}.
*/
void animateCollapsePanels(int flags, boolean force);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
index 53ef97d..cee8b33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
@@ -47,7 +47,7 @@
protected final NotificationShadeWindowController mNotificationShadeWindowController;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private final int mDisplayId;
- protected final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
+ protected final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
private final Lazy<AssistManager> mAssistManagerLazy;
private final ArrayList<Runnable> mPostCollapseRunnables = new ArrayList<>();
@@ -59,7 +59,7 @@
NotificationShadeWindowController notificationShadeWindowController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
WindowManager windowManager,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
Lazy<AssistManager> assistManagerLazy
) {
mCommandQueue = commandQueue;
@@ -67,15 +67,15 @@
mNotificationShadeWindowController = notificationShadeWindowController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mDisplayId = windowManager.getDefaultDisplay().getDisplayId();
- // TODO: Remove circular reference to StatusBar when possible.
- mStatusBarOptionalLazy = statusBarOptionalLazy;
+ // TODO: Remove circular reference to CentralSurfaces when possible.
+ mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
mAssistManagerLazy = assistManagerLazy;
}
@Override
public void instantExpandNotificationsPanel() {
// Make our window larger and the panel expanded.
- getStatusBar().makeExpandedVisible(true /* force */);
+ getCentralSurfaces().makeExpandedVisible(true /* force */);
getNotificationPanelViewController().expand(false /* animate */);
mCommandQueue.recomputeDisableFlags(mDisplayId, false /* animate */);
}
@@ -110,7 +110,7 @@
}
if (SPEW) {
Log.d(TAG, "animateCollapse():"
- + " mExpandedVisible=" + getStatusBar().isExpandedVisible()
+ + " mExpandedVisible=" + getCentralSurfaces().isExpandedVisible()
+ " flags=" + flags);
}
@@ -124,7 +124,7 @@
// release focus immediately to kick off focus change transition
mNotificationShadeWindowController.setNotificationShadeFocusable(false);
- getStatusBar().getNotificationShadeWindowViewController().cancelExpandHelper();
+ getCentralSurfaces().getNotificationShadeWindowViewController().cancelExpandHelper();
getNotificationPanelViewController()
.collapsePanel(true /* animate */, delayed, speedUpFactor);
}
@@ -136,7 +136,7 @@
if (!getNotificationPanelViewController().isFullyCollapsed()) {
mCommandQueue.animateCollapsePanels(
CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */);
- getStatusBar().visibilityChanged(false);
+ getCentralSurfaces().visibilityChanged(false);
mAssistManagerLazy.get().hideAssist();
}
return false;
@@ -155,7 +155,7 @@
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
- if (getStatusBar().getNotificationShadeWindowView().isVisibleToUser()) {
+ if (getCentralSurfaces().getNotificationShadeWindowView().isVisibleToUser()) {
getNotificationPanelViewController().removeOnGlobalLayoutListener(this);
getNotificationPanelViewController().getView().post(executable);
}
@@ -185,7 +185,7 @@
// close the shade if it was open
animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
true /* force */, true /* delayed */);
- getStatusBar().visibilityChanged(false);
+ getCentralSurfaces().visibilityChanged(false);
return true;
} else {
@@ -201,26 +201,26 @@
runPostCollapseRunnables();
}
} else if (!getPresenter().isPresenterFullyCollapsed()) {
- getStatusBar().instantCollapseNotificationPanel();
- getStatusBar().visibilityChanged(false);
+ getCentralSurfaces().instantCollapseNotificationPanel();
+ getCentralSurfaces().visibilityChanged(false);
} else {
runPostCollapseRunnables();
}
}
- private StatusBar getStatusBar() {
- return mStatusBarOptionalLazy.get().get();
+ private CentralSurfaces getCentralSurfaces() {
+ return mCentralSurfacesOptionalLazy.get().get();
}
private NotificationPresenter getPresenter() {
- return getStatusBar().getPresenter();
+ return getCentralSurfaces().getPresenter();
}
protected NotificationShadeWindowView getNotificationShadeWindowView() {
- return getStatusBar().getNotificationShadeWindowView();
+ return getCentralSurfaces().getNotificationShadeWindowView();
}
private NotificationPanelViewController getNotificationPanelViewController() {
- return getStatusBar().getPanelController();
+ return getCentralSurfaces().getPanelController();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt
index a1be5ac..7555356 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt
@@ -30,7 +30,7 @@
import com.android.systemui.qs.ChipVisibilityListener
import com.android.systemui.qs.HeaderPrivacyIconsController
import com.android.systemui.qs.carrier.QSCarrierGroupController
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_BATTERY_CONTROLLER
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_HEADER
import java.io.FileDescriptor
@@ -38,7 +38,7 @@
import javax.inject.Inject
import javax.inject.Named
-@StatusBarScope
+@CentralSurfacesScope
class SplitShadeHeaderController @Inject constructor(
@Named(SPLIT_SHADE_HEADER) private val statusBar: View,
private val statusBarIconController: StatusBarIconController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
index 6eeae7f..50f2169 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeadsUpChangeListener.java
@@ -22,14 +22,16 @@
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.init.NotificationsController;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.window.StatusBarWindowController;
import javax.inject.Inject;
-/** Ties the {@link StatusBar} to {@link com.android.systemui.statusbar.policy.HeadsUpManager}. */
-@StatusBarComponent.StatusBarScope
+/**
+ * Ties the {@link CentralSurfaces} to {@link com.android.systemui.statusbar.policy.HeadsUpManager}.
+ */
+@CentralSurfacesComponent.CentralSurfacesScope
public class StatusBarHeadsUpChangeListener implements OnHeadsUpChangedListener {
private final NotificationShadeWindowController mNotificationShadeWindowController;
private final StatusBarWindowController mStatusBarWindowController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
index 81fb903..31d9266 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -48,6 +48,7 @@
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
+import com.android.systemui.util.Assert;
import java.util.ArrayList;
import java.util.List;
@@ -66,6 +67,8 @@
void addIconGroup(IconManager iconManager);
/** */
void removeIconGroup(IconManager iconManager);
+ /** Refresh the state of an IconManager by recreating the views */
+ void refreshIconGroup(IconManager iconManager);
/** */
void setExternalIcon(String slot);
/** */
@@ -243,6 +246,7 @@
protected final int mIconSize;
// Whether or not these icons show up in dumpsys
protected boolean mShouldLog = false;
+ private StatusBarIconController mController;
// Enables SystemUI demo mode to take effect in this group
protected boolean mDemoable = true;
@@ -267,13 +271,17 @@
mDemoable = demoable;
}
- public void setBlockList(@Nullable List<String> blockList) {
- mBlockList.clear();
- if (blockList == null || blockList.isEmpty()) {
- return;
- }
+ void setController(StatusBarIconController controller) {
+ mController = controller;
+ }
+ public void setBlockList(@Nullable List<String> blockList) {
+ Assert.isMainThread();
+ mBlockList.clear();
mBlockList.addAll(blockList);
+ if (mController != null) {
+ mController.refreshIconGroup(this);
+ }
}
public void setShouldLog(boolean should) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index c5d3937..623ec5e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -100,6 +100,7 @@
}
}
+ group.setController(this);
mIconGroups.add(group);
List<Slot> allSlots = getSlots();
for (int i = 0; i < allSlots.size(); i++) {
@@ -115,6 +116,12 @@
}
}
+ @Override
+ public void refreshIconGroup(IconManager iconManager) {
+ removeIconGroup(iconManager);
+ addIconGroup(iconManager);
+ }
+
private void refreshIconGroups() {
for (int i = mIconGroups.size() - 1; i >= 0; --i) {
IconManager group = mIconGroups.get(i);
@@ -245,7 +252,7 @@
/**
* Accept a list of CallIndicatorIconStates, and show the call strength icons.
- * @param slot StatusBar slot for the call strength icons
+ * @param slot statusbar slot for the call strength icons
* @param states All of the no Calling & SMS icon states
*/
@Override
@@ -272,7 +279,7 @@
/**
* Accept a list of CallIndicatorIconStates, and show the no calling icons.
- * @param slot StatusBar slot for the no calling icons
+ * @param slot statusbar slot for the no calling icons
* @param states All of the no Calling & SMS icon states
*/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index a96ba56..c160c22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -124,8 +124,8 @@
@Override
public void onFullyShown() {
updateStates();
- mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(),
- mStatusBar.getBouncerContainer(), "BOUNCER_VISIBLE");
+ mCentralSurfaces.wakeUpIfDozing(SystemClock.uptimeMillis(),
+ mCentralSurfaces.getBouncerContainer(), "BOUNCER_VISIBLE");
}
@Override
@@ -175,7 +175,7 @@
protected LockPatternUtils mLockPatternUtils;
protected ViewMediatorCallback mViewMediatorCallback;
- protected StatusBar mStatusBar;
+ protected CentralSurfaces mCentralSurfaces;
private NotificationPanelViewController mNotificationPanelViewController;
private BiometricUnlockController mBiometricUnlockController;
@@ -277,16 +277,16 @@
}
@Override
- public void registerStatusBar(StatusBar statusBar,
+ public void registerCentralSurfaces(CentralSurfaces centralSurfaces,
NotificationPanelViewController notificationPanelViewController,
PanelExpansionStateManager panelExpansionStateManager,
BiometricUnlockController biometricUnlockController,
View notificationContainer,
KeyguardBypassController bypassController) {
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mBiometricUnlockController = biometricUnlockController;
- ViewGroup container = mStatusBar.getBouncerContainer();
+ ViewGroup container = mCentralSurfaces.getBouncerContainer();
mBouncer = mKeyguardBouncerFactory.create(container, mExpansionCallback);
mNotificationPanelViewController = notificationPanelViewController;
if (panelExpansionStateManager != null) {
@@ -354,13 +354,13 @@
} else if (mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED
&& mKeyguardUpdateManager.isUdfpsEnrolled()) {
// Don't expand to the bouncer. Instead transition back to the lock screen (see
- // StatusBar#showBouncerOrLockScreenIfKeyguard) where the user can use the UDFPS
+ // CentralSurfaces#showBouncerOrLockScreenIfKeyguard) where the user can use the UDFPS
// affordance to enter the device (or swipe up to the input bouncer)
return;
} else if (bouncerNeedsScrimming()) {
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
} else if (mShowing) {
- if (!isWakeAndUnlocking() && !mStatusBar.isInLaunchTransition()) {
+ if (!isWakeAndUnlocking() && !mCentralSurfaces.isInLaunchTransition()) {
mBouncer.setExpansion(fraction);
}
if (fraction != KeyguardBouncer.EXPANSION_HIDDEN && tracking
@@ -371,7 +371,9 @@
} else if (mPulsing && fraction == KeyguardBouncer.EXPANSION_VISIBLE) {
// Panel expanded while pulsing but didn't translate the bouncer (because we are
// unlocked.) Let's simply wake-up to dismiss the lock screen.
- mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mStatusBar.getBouncerContainer(),
+ mCentralSurfaces.wakeUpIfDozing(
+ SystemClock.uptimeMillis(),
+ mCentralSurfaces.getBouncerContainer(),
"BOUNCER_VISIBLE");
}
}
@@ -408,10 +410,10 @@
protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) {
if (mBouncer.needsFullscreenBouncer() && !mDozing) {
// The keyguard might be showing (already). So we need to hide it.
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
mBouncer.show(true /* resetSecuritySelection */);
} else {
- mStatusBar.showKeyguard();
+ mCentralSurfaces.showKeyguard();
if (hideBouncerWhenShowing) {
hideBouncer(false /* destroyView */);
mBouncer.prepare();
@@ -540,7 +542,7 @@
mNotificationPanelViewController.resetViews(/* animate= */ true);
// Hide bouncer and quick-quick settings.
if (mOccluded && !mDozing) {
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
if (hideBouncerWhenShowing || mBouncer.needsFullscreenBouncer()) {
hideBouncer(false /* destroyView */);
}
@@ -570,15 +572,15 @@
mBypassController.setAltBouncerShowing(isShowingAlternateAuth());
if (updateScrim) {
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
}
}
@Override
public void onStartedWakingUp() {
- mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ mCentralSurfaces.getNotificationShadeWindowView().getWindowInsetsController()
.setAnimationsDisabled(false);
- NavigationBarView navBarView = mStatusBar.getNavigationBarView();
+ NavigationBarView navBarView = mCentralSurfaces.getNavigationBarView();
if (navBarView != null) {
navBarView.forEachView(view ->
view.animate()
@@ -590,9 +592,9 @@
@Override
public void onStartedGoingToSleep() {
- mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ mCentralSurfaces.getNotificationShadeWindowView().getWindowInsetsController()
.setAnimationsDisabled(true);
- NavigationBarView navBarView = mStatusBar.getNavigationBarView();
+ NavigationBarView navBarView = mCentralSurfaces.getNavigationBarView();
if (navBarView != null) {
navBarView.forEachView(view ->
view.animate()
@@ -628,7 +630,7 @@
}
/**
- * If {@link StatusBar} is pulsing.
+ * If {@link CentralSurfaces} is pulsing.
*/
public void setPulsing(boolean pulsing) {
if (mPulsing != pulsing) {
@@ -649,13 +651,13 @@
@Override
public void setOccluded(boolean occluded, boolean animate) {
- mStatusBar.setOccluded(occluded);
+ mCentralSurfaces.setOccluded(occluded);
if (occluded && !mOccluded && mShowing) {
SysUiStatsLog.write(SysUiStatsLog.KEYGUARD_STATE_CHANGED,
SysUiStatsLog.KEYGUARD_STATE_CHANGED__STATE__OCCLUDED);
- if (mStatusBar.isInLaunchTransition()) {
+ if (mCentralSurfaces.isInLaunchTransition()) {
setOccludedAndUpdateStates(true);
- mStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
+ mCentralSurfaces.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
new Runnable() {
@Override
public void run() {
@@ -666,7 +668,7 @@
return;
}
- if (mStatusBar.isLaunchingActivityOverLockscreen()) {
+ if (mCentralSurfaces.isLaunchingActivityOverLockscreen()) {
setOccludedAndUpdateStates(true);
// When isLaunchingActivityOverLockscreen() is true, we know for sure that the post
@@ -695,7 +697,7 @@
reset(isOccluding /* hideBouncerWhenShowing*/);
}
if (animate && !occluded && mShowing && !mBouncer.isShowing()) {
- mStatusBar.animateKeyguardUnoccluding();
+ mCentralSurfaces.animateKeyguardUnoccluding();
}
}
@@ -712,7 +714,7 @@
public void startPreHideAnimation(Runnable finishRunnable) {
if (mBouncer.isShowing()) {
mBouncer.startPreHideAnimation(finishRunnable);
- mStatusBar.onBouncerPreHideAnimation();
+ mCentralSurfaces.onBouncerPreHideAnimation();
// We update the state (which will show the keyguard) only if an animation will run on
// the keyguard. If there is no animation, we wait before updating the state so that we
@@ -745,11 +747,11 @@
long uptimeMillis = SystemClock.uptimeMillis();
long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
- if (mStatusBar.isInLaunchTransition()
+ if (mCentralSurfaces.isInLaunchTransition()
|| mKeyguardStateController.isFlingingToDismissKeyguard()) {
final boolean wasFlingingToDismissKeyguard =
mKeyguardStateController.isFlingingToDismissKeyguard();
- mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
+ mCentralSurfaces.fadeKeyguardAfterLaunchTransition(new Runnable() {
@Override
public void run() {
mNotificationShadeWindowController.setKeyguardShowing(false);
@@ -760,11 +762,11 @@
}, new Runnable() {
@Override
public void run() {
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
mNotificationShadeWindowController.setKeyguardFadingAway(false);
if (wasFlingingToDismissKeyguard) {
- mStatusBar.finishKeyguardFadingAway();
+ mCentralSurfaces.finishKeyguardFadingAway();
}
mViewMediatorCallback.keyguardGone();
@@ -783,7 +785,7 @@
delay = 0;
fadeoutDuration = 240;
}
- mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration, needsFading);
+ mCentralSurfaces.setKeyguardFadingAway(startTime, delay, fadeoutDuration, needsFading);
mBiometricUnlockController.startKeyguardFadingAway();
hideBouncer(true /* destroyView */);
if (wakeUnlockPulsing) {
@@ -793,11 +795,11 @@
mNotificationContainer,
fadeoutDuration,
() -> {
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
onKeyguardFadedAway();
});
} else {
- mStatusBar.fadeKeyguardWhilePulsing();
+ mCentralSurfaces.fadeKeyguardWhilePulsing();
}
wakeAndUnlockDejank();
} else {
@@ -810,20 +812,20 @@
mNotificationContainer,
fadeoutDuration,
() -> {
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
});
} else {
- mStatusBar.hideKeyguard();
+ mCentralSurfaces.hideKeyguard();
}
// hide() will happen asynchronously and might arrive after the scrims
// were already hidden, this means that the transition callback won't
// be triggered anymore and StatusBarWindowController will be forever in
// the fadingAway state.
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
wakeAndUnlockDejank();
} else {
- mStatusBar.hideKeyguard();
- mStatusBar.finishKeyguardFadingAway();
+ mCentralSurfaces.hideKeyguard();
+ mCentralSurfaces.finishKeyguardFadingAway();
mBiometricUnlockController.finishKeyguardFadingAway();
}
}
@@ -866,7 +868,7 @@
mNotificationContainer.postDelayed(() -> mNotificationShadeWindowController
.setKeyguardFadingAway(false), 100);
ViewGroupFadeHelper.reset(mNotificationPanelViewController.getView());
- mStatusBar.finishKeyguardFadingAway();
+ mCentralSurfaces.finishKeyguardFadingAway();
mBiometricUnlockController.finishKeyguardFadingAway();
WindowManagerGlobal.getInstance().trimMemory(
ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
@@ -897,7 +899,7 @@
@Override
public void dismissAndCollapse() {
- mStatusBar.executeRunnableDismissingKeyguard(null, null, true, false, true);
+ mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, true, false, true);
}
/**
@@ -922,7 +924,7 @@
*/
public boolean onBackPressed(boolean hideImmediately) {
if (mBouncer.isShowing()) {
- mStatusBar.endAffordanceLaunch();
+ mCentralSurfaces.endAffordanceLaunch();
// The second condition is for SIM card locked bouncer
if (mBouncer.isScrimmed() && !mBouncer.needsFullscreenBouncer()) {
hideBouncer(false);
@@ -978,11 +980,11 @@
private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
@Override
public void run() {
- NavigationBarView view = mStatusBar.getNavigationBarView();
+ NavigationBarView view = mCentralSurfaces.getNavigationBarView();
if (view != null) {
view.setVisibility(View.VISIBLE);
}
- mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ mCentralSurfaces.getNotificationShadeWindowView().getWindowInsetsController()
.show(navigationBars());
}
};
@@ -1013,7 +1015,7 @@
if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
mNotificationShadeWindowController.setBouncerShowing(bouncerShowing);
- mStatusBar.setBouncerShowing(bouncerShowing);
+ mCentralSurfaces.setBouncerShowing(bouncerShowing);
}
if (occluded != mLastOccluded || mFirstUpdate) {
@@ -1040,11 +1042,11 @@
mLastBiometricMode = mBiometricUnlockController.getMode();
mLastGesturalNav = mGesturalNav;
mLastIsDocked = mIsDocked;
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
}
private View getCurrentNavBarView() {
- final NavigationBarView navBarView = mStatusBar.getNavigationBarView();
+ final NavigationBarView navBarView = mCentralSurfaces.getNavigationBarView();
return navBarView != null ? navBarView.getCurrentView() : null;
}
@@ -1052,7 +1054,7 @@
* Updates the visibility of the nav bar window (which will cause insets changes).
*/
protected void updateNavigationBarVisibility(boolean navBarVisible) {
- if (mStatusBar.getNavigationBarView() != null) {
+ if (mCentralSurfaces.getNavigationBarView() != null) {
if (navBarVisible) {
long delay = getNavBarShowDelay();
if (delay == 0) {
@@ -1063,7 +1065,7 @@
}
} else {
mNotificationContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
- mStatusBar.getNotificationShadeWindowView().getWindowInsetsController()
+ mCentralSurfaces.getNotificationShadeWindowView().getWindowInsetsController()
.hide(navigationBars());
}
}
@@ -1120,7 +1122,7 @@
@Override
public boolean shouldDisableWindowAnimationsForUnlock() {
- return mStatusBar.isInLaunchTransition();
+ return mCentralSurfaces.isInLaunchTransition();
}
@Override
@@ -1139,7 +1141,7 @@
@Override
public void keyguardGoingAway() {
- mStatusBar.keyguardGoingAway();
+ mCentralSurfaces.keyguardGoingAway();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
index 09fca100..56b6dfc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarLaunchAnimatorController.kt
@@ -10,34 +10,34 @@
*/
class StatusBarLaunchAnimatorController(
private val delegate: ActivityLaunchAnimator.Controller,
- private val statusBar: StatusBar,
+ private val centralSurfaces: CentralSurfaces,
private val isLaunchForActivity: Boolean = true
) : ActivityLaunchAnimator.Controller by delegate {
// Always sync the opening window with the shade, given that we draw a hole punch in the shade
// of the same size and position as the opening app to make it visible.
override val openingWindowSyncView: View?
- get() = statusBar.notificationShadeWindowView
+ get() = centralSurfaces.notificationShadeWindowView
override fun onIntentStarted(willAnimate: Boolean) {
delegate.onIntentStarted(willAnimate)
if (!willAnimate) {
- statusBar.collapsePanelOnMainThread()
+ centralSurfaces.collapsePanelOnMainThread()
}
}
override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {
delegate.onLaunchAnimationStart(isExpandingFullyAbove)
- statusBar.notificationPanelViewController.setIsLaunchAnimationRunning(true)
+ centralSurfaces.notificationPanelViewController.setIsLaunchAnimationRunning(true)
if (!isExpandingFullyAbove) {
- statusBar.collapsePanelWithDuration(
+ centralSurfaces.collapsePanelWithDuration(
ActivityLaunchAnimator.TIMINGS.totalDuration.toInt())
}
}
override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
delegate.onLaunchAnimationEnd(isExpandingFullyAbove)
- statusBar.notificationPanelViewController.setIsLaunchAnimationRunning(false)
- statusBar.onLaunchAnimationEnd(isExpandingFullyAbove)
+ centralSurfaces.notificationPanelViewController.setIsLaunchAnimationRunning(false)
+ centralSurfaces.onLaunchAnimationEnd(isExpandingFullyAbove)
}
override fun onLaunchAnimationProgress(
@@ -46,11 +46,11 @@
linearProgress: Float
) {
delegate.onLaunchAnimationProgress(state, progress, linearProgress)
- statusBar.notificationPanelViewController.applyLaunchAnimationProgress(linearProgress)
+ centralSurfaces.notificationPanelViewController.applyLaunchAnimationProgress(linearProgress)
}
override fun onLaunchAnimationCancelled() {
delegate.onLaunchAnimationCancelled()
- statusBar.onLaunchAnimationCancelled(isLaunchForActivity)
+ centralSurfaces.onLaunchAnimationCancelled(isLaunchForActivity)
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index ff86d74..edbddbb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -18,7 +18,7 @@
import static android.service.notification.NotificationListenerService.REASON_CLICK;
-import static com.android.systemui.statusbar.phone.StatusBar.getActivityOptions;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.getActivityOptions;
import android.app.ActivityManager;
import android.app.KeyguardManager;
@@ -51,9 +51,6 @@
import com.android.systemui.EventLogTags;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.assist.AssistManager;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
@@ -75,6 +72,7 @@
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowDragController;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.wmshell.BubblesManager;
@@ -89,7 +87,8 @@
/**
* Status bar implementation of {@link NotificationActivityStarter}.
*/
-public class StatusBarNotificationActivityStarter implements NotificationActivityStarter {
+@CentralSurfacesComponent.CentralSurfacesScope
+class StatusBarNotificationActivityStarter implements NotificationActivityStarter {
private final Context mContext;
@@ -123,7 +122,7 @@
private final MetricsLogger mMetricsLogger;
private final StatusBarNotificationActivityStarterLogger mLogger;
- private final StatusBar mStatusBar;
+ private final CentralSurfaces mCentralSurfaces;
private final NotificationPresenter mPresenter;
private final NotificationPanelViewController mNotificationPanel;
private final ActivityLaunchAnimator mActivityLaunchAnimator;
@@ -132,7 +131,8 @@
private boolean mIsCollapsingToShowActivityOverLockscreen;
- private StatusBarNotificationActivityStarter(
+ @Inject
+ StatusBarNotificationActivityStarter(
Context context,
CommandQueue commandQueue,
Handler mainThreadHandler,
@@ -162,7 +162,7 @@
MetricsLogger metricsLogger,
StatusBarNotificationActivityStarterLogger logger,
OnUserInteractionCallback onUserInteractionCallback,
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
NotificationPresenter presenter,
NotificationPanelViewController panel,
ActivityLaunchAnimator activityLaunchAnimator,
@@ -199,7 +199,7 @@
mOnUserInteractionCallback = onUserInteractionCallback;
// TODO: use KeyguardStateController#isOccluded to remove this dependency
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mPresenter = presenter;
mNotificationPanel = panel;
mActivityLaunchAnimator = activityLaunchAnimator;
@@ -259,7 +259,7 @@
&& mActivityIntentHelper.wouldLaunchResolverActivity(intent.getIntent(),
mLockscreenUserManager.getCurrentUserId());
final boolean animate = !willLaunchResolverActivity
- && mStatusBar.shouldAnimateLaunch(isActivityIntent);
+ && mCentralSurfaces.shouldAnimateLaunch(isActivityIntent);
boolean showOverLockscreen = mKeyguardStateController.isShowing() && intent != null
&& mActivityIntentHelper.wouldShowOverLockscreen(intent.getIntent(),
mLockscreenUserManager.getCurrentUserId());
@@ -300,7 +300,7 @@
mShadeController.addPostCollapseAction(runnable);
mShadeController.collapsePanel(true /* animate */);
} else if (mKeyguardStateController.isShowing()
- && mStatusBar.isOccluded()) {
+ && mCentralSurfaces.isOccluded()) {
mStatusBarKeyguardViewManager.addAfterKeyguardGoneRunnable(runnable);
mShadeController.collapsePanel();
} else {
@@ -475,7 +475,8 @@
try {
ActivityLaunchAnimator.Controller animationController =
new StatusBarLaunchAnimatorController(
- mNotificationAnimationProvider.getAnimatorController(row), mStatusBar,
+ mNotificationAnimationProvider.getAnimatorController(row),
+ mCentralSurfaces,
isActivityIntent);
mActivityLaunchAnimator.startPendingIntentWithAnimation(animationController,
@@ -483,11 +484,11 @@
long eventTime = row.getAndResetLastActionUpTime();
Bundle options = eventTime > 0
? getActivityOptions(
- mStatusBar.getDisplayId(),
+ mCentralSurfaces.getDisplayId(),
adapter,
mKeyguardStateController.isShowing(),
eventTime)
- : getActivityOptions(mStatusBar.getDisplayId(), adapter);
+ : getActivityOptions(mCentralSurfaces.getDisplayId(), adapter);
return intent.sendAndReturnResult(mContext, 0, fillInIntent, null,
null, null, options);
});
@@ -502,7 +503,7 @@
@Override
public void startNotificationGutsIntent(final Intent intent, final int appUid,
ExpandableNotificationRow row) {
- boolean animate = mStatusBar.shouldAnimateLaunch(true /* isActivityIntent */);
+ boolean animate = mCentralSurfaces.shouldAnimateLaunch(true /* isActivityIntent */);
ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() {
@Override
public boolean onDismiss() {
@@ -510,14 +511,14 @@
ActivityLaunchAnimator.Controller animationController =
new StatusBarLaunchAnimatorController(
mNotificationAnimationProvider.getAnimatorController(row),
- mStatusBar, true /* isActivityIntent */);
+ mCentralSurfaces, true /* isActivityIntent */);
mActivityLaunchAnimator.startIntentWithAnimation(
animationController, animate, intent.getPackage(),
(adapter) -> TaskStackBuilder.create(mContext)
.addNextIntentWithParentStack(intent)
.startActivities(getActivityOptions(
- mStatusBar.getDisplayId(),
+ mCentralSurfaces.getDisplayId(),
adapter),
new UserHandle(UserHandle.getUserId(appUid))));
});
@@ -535,7 +536,7 @@
@Override
public void startHistoryIntent(View view, boolean showHistory) {
- boolean animate = mStatusBar.shouldAnimateLaunch(true /* isActivityIntent */);
+ boolean animate = mCentralSurfaces.shouldAnimateLaunch(true /* isActivityIntent */);
ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() {
@Override
public boolean onDismiss() {
@@ -555,13 +556,14 @@
);
ActivityLaunchAnimator.Controller animationController =
viewController == null ? null
- : new StatusBarLaunchAnimatorController(viewController, mStatusBar,
+ : new StatusBarLaunchAnimatorController(viewController,
+ mCentralSurfaces,
true /* isActivityIntent */);
mActivityLaunchAnimator.startIntentWithAnimation(animationController, animate,
intent.getPackage(),
(adapter) -> tsb.startActivities(
- getActivityOptions(mStatusBar.getDisplayId(), adapter),
+ getActivityOptions(mCentralSurfaces.getDisplayId(), adapter),
UserHandle.CURRENT));
});
return true;
@@ -615,7 +617,7 @@
try {
EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION,
entry.getKey());
- mStatusBar.wakeUpForFullScreenIntent();
+ mCentralSurfaces.wakeUpForFullScreenIntent();
fullscreenIntent.send();
entry.notifyFullScreenIntentLaunched();
mMetricsLogger.count("note_fullscreen", 1);
@@ -657,180 +659,4 @@
return entry.shouldSuppressFullScreenIntent();
}
-
- // --------------------- NotificationEntryManager/NotifPipeline methods ------------------------
-
- /**
- * Public builder for {@link StatusBarNotificationActivityStarter}.
- */
- @SysUISingleton
- public static class Builder {
- private final Context mContext;
- private final CommandQueue mCommandQueue;
- private final Handler mMainThreadHandler;
-
- private final Executor mUiBgExecutor;
- private final NotificationEntryManager mEntryManager;
- private final NotifPipeline mNotifPipeline;
- private final NotificationVisibilityProvider mVisibilityProvider;
- private final HeadsUpManagerPhone mHeadsUpManager;
- private final ActivityStarter mActivityStarter;
- private final NotificationClickNotifier mClickNotifier;
- private final StatusBarStateController mStatusBarStateController;
- private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
- private final KeyguardManager mKeyguardManager;
- private final IDreamManager mDreamManager;
- private final Optional<BubblesManager> mBubblesManagerOptional;
- private final Lazy<AssistManager> mAssistManagerLazy;
- private final NotificationRemoteInputManager mRemoteInputManager;
- private final GroupMembershipManager mGroupMembershipManager;
- private final NotificationLockscreenUserManager mLockscreenUserManager;
- private final ShadeController mShadeController;
- private final KeyguardStateController mKeyguardStateController;
- private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
- private final LockPatternUtils mLockPatternUtils;
- private final StatusBarRemoteInputCallback mRemoteInputCallback;
- private final ActivityIntentHelper mActivityIntentHelper;;
- private final MetricsLogger mMetricsLogger;
- private final StatusBarNotificationActivityStarterLogger mLogger;
- private final OnUserInteractionCallback mOnUserInteractionCallback;
- private final NotifPipelineFlags mNotifPipelineFlags;
- private StatusBar mStatusBar;
- private NotificationPresenter mNotificationPresenter;
- private NotificationPanelViewController mNotificationPanelViewController;
- private ActivityLaunchAnimator mActivityLaunchAnimator;
- private NotificationLaunchAnimatorControllerProvider mNotificationAnimationProvider;
-
- @Inject
- public Builder(
- Context context,
- CommandQueue commandQueue,
- @Main Handler mainThreadHandler,
- @UiBackground Executor uiBgExecutor,
- NotificationEntryManager entryManager,
- NotifPipeline notifPipeline,
- NotificationVisibilityProvider visibilityProvider,
- HeadsUpManagerPhone headsUpManager,
- ActivityStarter activityStarter,
- NotificationClickNotifier clickNotifier,
- StatusBarStateController statusBarStateController,
- StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- KeyguardManager keyguardManager,
- IDreamManager dreamManager,
- Optional<BubblesManager> bubblesManager,
- Lazy<AssistManager> assistManagerLazy,
- NotificationRemoteInputManager remoteInputManager,
- GroupMembershipManager groupMembershipManager,
- NotificationLockscreenUserManager lockscreenUserManager,
- ShadeController shadeController,
- KeyguardStateController keyguardStateController,
- NotificationInterruptStateProvider notificationInterruptStateProvider,
- LockPatternUtils lockPatternUtils,
- StatusBarRemoteInputCallback remoteInputCallback,
- ActivityIntentHelper activityIntentHelper,
- NotifPipelineFlags notifPipelineFlags,
- MetricsLogger metricsLogger,
- StatusBarNotificationActivityStarterLogger logger,
- OnUserInteractionCallback onUserInteractionCallback) {
-
- mContext = context;
- mCommandQueue = commandQueue;
- mMainThreadHandler = mainThreadHandler;
- mUiBgExecutor = uiBgExecutor;
- mEntryManager = entryManager;
- mNotifPipeline = notifPipeline;
- mVisibilityProvider = visibilityProvider;
- mHeadsUpManager = headsUpManager;
- mActivityStarter = activityStarter;
- mClickNotifier = clickNotifier;
- mStatusBarStateController = statusBarStateController;
- mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
- mKeyguardManager = keyguardManager;
- mDreamManager = dreamManager;
- mBubblesManagerOptional = bubblesManager;
- mAssistManagerLazy = assistManagerLazy;
- mRemoteInputManager = remoteInputManager;
- mGroupMembershipManager = groupMembershipManager;
- mLockscreenUserManager = lockscreenUserManager;
- mShadeController = shadeController;
- mKeyguardStateController = keyguardStateController;
- mNotificationInterruptStateProvider = notificationInterruptStateProvider;
- mLockPatternUtils = lockPatternUtils;
- mRemoteInputCallback = remoteInputCallback;
- mActivityIntentHelper = activityIntentHelper;
- mNotifPipelineFlags = notifPipelineFlags;
- mMetricsLogger = metricsLogger;
- mLogger = logger;
- mOnUserInteractionCallback = onUserInteractionCallback;
- }
-
- /** Sets the status bar to use as {@link StatusBar}. */
- public Builder setStatusBar(StatusBar statusBar) {
- mStatusBar = statusBar;
- return this;
- }
-
- public Builder setNotificationPresenter(NotificationPresenter notificationPresenter) {
- mNotificationPresenter = notificationPresenter;
- return this;
- }
-
- /** Set the ActivityLaunchAnimator. */
- public Builder setActivityLaunchAnimator(ActivityLaunchAnimator activityLaunchAnimator) {
- mActivityLaunchAnimator = activityLaunchAnimator;
- return this;
- }
-
- /** Set the NotificationLaunchAnimatorControllerProvider. */
- public Builder setNotificationAnimatorControllerProvider(
- NotificationLaunchAnimatorControllerProvider notificationAnimationProvider) {
- mNotificationAnimationProvider = notificationAnimationProvider;
- return this;
- }
-
- /** Set the NotificationPanelViewController. */
- public Builder setNotificationPanelViewController(
- NotificationPanelViewController notificationPanelViewController) {
- mNotificationPanelViewController = notificationPanelViewController;
- return this;
- }
-
- public StatusBarNotificationActivityStarter build() {
- return new StatusBarNotificationActivityStarter(
- mContext,
- mCommandQueue,
- mMainThreadHandler,
- mUiBgExecutor,
- mEntryManager,
- mNotifPipeline,
- mVisibilityProvider,
- mHeadsUpManager,
- mActivityStarter,
- mClickNotifier,
- mStatusBarStateController,
- mStatusBarKeyguardViewManager,
- mKeyguardManager,
- mDreamManager,
- mBubblesManagerOptional,
- mAssistManagerLazy,
- mRemoteInputManager,
- mGroupMembershipManager,
- mLockscreenUserManager,
- mShadeController,
- mKeyguardStateController,
- mNotificationInterruptStateProvider,
- mLockPatternUtils,
- mRemoteInputCallback,
- mActivityIntentHelper,
- mNotifPipelineFlags,
- mMetricsLogger,
- mLogger,
- mOnUserInteractionCallback,
- mStatusBar,
- mNotificationPresenter,
- mNotificationPanelViewController,
- mActivityLaunchAnimator,
- mNotificationAnimationProvider);
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterModule.java
new file mode 100644
index 0000000..caa149e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterModule.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2022 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.phone;
+
+import com.android.systemui.statusbar.notification.NotificationActivityStarter;
+
+import dagger.Binds;
+import dagger.Module;
+
+@Module
+public abstract class StatusBarNotificationActivityStarterModule {
+ @Binds
+ abstract NotificationActivityStarter bindActivityStarter(
+ StatusBarNotificationActivityStarter impl);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index c8e1cdc..aa061d7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -14,9 +14,9 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.statusbar.phone.StatusBar.CLOSE_PANEL_WHEN_EMPTIED;
-import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
-import static com.android.systemui.statusbar.phone.StatusBar.MULTIUSER_DEBUG;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.CLOSE_PANEL_WHEN_EMPTIED;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.MULTIUSER_DEBUG;
import android.app.KeyguardManager;
import android.content.Context;
@@ -68,20 +68,25 @@
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.row.NotificationInfo.CheckSaveListener;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.util.List;
-public class StatusBarNotificationPresenter implements NotificationPresenter,
+import javax.inject.Inject;
+
+@CentralSurfacesComponent.CentralSurfacesScope
+class StatusBarNotificationPresenter implements NotificationPresenter,
ConfigurationController.ConfigurationListener,
NotificationRowBinderImpl.BindRowCallback,
CommandQueue.Callbacks {
private static final String TAG = "StatusBarNotificationPresenter";
- private final ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class);
+ private final ActivityStarter mActivityStarter;
private final KeyguardStateController mKeyguardStateController;
private final NotificationViewHierarchyManager mViewHierarchyManager;
private final NotificationLockscreenUserManager mLockscreenUserManager;
@@ -99,7 +104,7 @@
private final DozeScrimController mDozeScrimController;
private final ScrimController mScrimController;
private final KeyguardIndicationController mKeyguardIndicationController;
- private final StatusBar mStatusBar;
+ private final CentralSurfaces mCentralSurfaces;
private final ShadeController mShadeController;
private final LockscreenShadeTransitionController mShadeTransitionController;
private final CommandQueue mCommandQueue;
@@ -110,16 +115,19 @@
private final NotifPipelineFlags mNotifPipelineFlags;
private final IStatusBarService mBarService;
private final DynamicPrivacyController mDynamicPrivacyController;
+ private final NotificationListContainer mNotifListContainer;
private boolean mReinflateNotificationsOnUserSwitched;
private boolean mDispatchUiModeChangeOnUserSwitched;
private TextView mNotificationPanelDebugText;
protected boolean mVrMode;
- public StatusBarNotificationPresenter(Context context,
+ @Inject
+ StatusBarNotificationPresenter(Context context,
NotificationPanelViewController panel,
HeadsUpManagerPhone headsUp,
NotificationShadeWindowView statusBarWindow,
+ ActivityStarter activityStarter,
NotificationStackScrollLayoutController stackScrollerController,
DozeScrimController dozeScrimController,
ScrimController scrimController,
@@ -127,7 +135,7 @@
DynamicPrivacyController dynamicPrivacyController,
KeyguardStateController keyguardStateController,
KeyguardIndicationController keyguardIndicationController,
- StatusBar statusBar,
+ CentralSurfaces centralSurfaces,
ShadeController shadeController,
LockscreenShadeTransitionController shadeTransitionController,
CommandQueue commandQueue,
@@ -144,14 +152,17 @@
NotificationInterruptStateProvider notificationInterruptStateProvider,
NotificationRemoteInputManager remoteInputManager,
ConfigurationController configurationController,
- NotifPipelineFlags notifPipelineFlags) {
+ NotifPipelineFlags notifPipelineFlags,
+ NotificationRemoteInputManager.Callback remoteInputManagerCallback,
+ NotificationListContainer notificationListContainer) {
+ mActivityStarter = activityStarter;
mKeyguardStateController = keyguardStateController;
mNotificationPanel = panel;
mHeadsUpManager = headsUp;
mDynamicPrivacyController = dynamicPrivacyController;
mKeyguardIndicationController = keyguardIndicationController;
// TODO: use KeyguardStateController#isOccluded to remove this dependency
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mShadeController = shadeController;
mShadeTransitionController = shadeTransitionController;
mCommandQueue = commandQueue;
@@ -175,6 +186,7 @@
mKeyguardManager = context.getSystemService(KeyguardManager.class);
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ mNotifListContainer = notificationListContainer;
IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
Context.VR_SERVICE));
@@ -186,14 +198,14 @@
}
}
remoteInputManager.setUpWithCallback(
- Dependency.get(NotificationRemoteInputManager.Callback.class),
+ remoteInputManagerCallback,
mNotificationPanel.createRemoteInputDelegate());
initController.addPostInitTask(() -> {
mKeyguardIndicationController.init();
mViewHierarchyManager.setUpWithPresenter(this,
stackScrollerController.getNotifStackController(),
- stackScrollerController.getNotificationListContainer());
+ mNotifListContainer);
mNotifShadeEventSource.setShadeEmptiedCallback(this::maybeClosePanelForShadeEmptied);
mNotifShadeEventSource.setNotifRemovedByUserCallback(this::maybeEndAmbientPulse);
if (!mNotifPipelineFlags.isNewPipelineEnabled()) {
@@ -206,9 +218,8 @@
notificationInterruptStateProvider.addSuppressor(mInterruptSuppressor);
mLockscreenUserManager.setUpWithPresenter(this);
mMediaManager.setUpWithPresenter(this);
- mGutsManager.setUpWithPresenter(this,
- stackScrollerController.getNotificationListContainer(), mCheckSaveListener,
- mOnSettingsClickListener);
+ mGutsManager.setUpWithPresenter(
+ this, mNotifListContainer, mCheckSaveListener, mOnSettingsClickListener);
// ForegroundServiceNotificationListener adds its listener in its constructor
// but we need to request it here in order for it to be instantiated.
// TODO: figure out how to do this correctly once Dependency.get() is gone.
@@ -341,7 +352,7 @@
updateNotificationViews("user switched");
}
mMediaManager.clearCurrentMediaNotification();
- mStatusBar.setLockscreenUser(newUserId);
+ mCentralSurfaces.setLockscreenUser(newUserId);
updateMediaMetaData(true, false);
}
@@ -395,7 +406,8 @@
public void onExpandClicked(NotificationEntry clickedEntry, View clickedView,
boolean nowExpanded) {
mHeadsUpManager.setExpanded(clickedEntry, nowExpanded);
- mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), clickedView, "NOTIFICATION_CLICK");
+ mCentralSurfaces.wakeUpIfDozing(
+ SystemClock.uptimeMillis(), clickedView, "NOTIFICATION_CLICK");
if (nowExpanded) {
if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
mShadeTransitionController.goToLockedShade(clickedEntry.getRow());
@@ -463,7 +475,7 @@
@Override
public boolean suppressAwakeHeadsUp(NotificationEntry entry) {
final StatusBarNotification sbn = entry.getSbn();
- if (mStatusBar.isOccluded()) {
+ if (mCentralSurfaces.isOccluded()) {
boolean devicePublic = mLockscreenUserManager
.isLockscreenPublicMode(mLockscreenUserManager.getCurrentUserId());
boolean userPublic = devicePublic
@@ -486,7 +498,7 @@
// we don't allow head-up on the lockscreen (unless there's a
// "showWhenLocked" activity currently showing) if
// the potential HUN has a fullscreen intent
- if (mKeyguardStateController.isShowing() && !mStatusBar.isOccluded()) {
+ if (mKeyguardStateController.isShowing() && !mCentralSurfaces.isOccluded()) {
if (DEBUG) {
Log.d(TAG, "No heads up: entry has fullscreen intent on lockscreen "
+ sbn.getKey());
@@ -511,7 +523,7 @@
@Override
public boolean suppressInterruptions(NotificationEntry entry) {
- return mStatusBar.areNotificationAlertsDisabled();
+ return mCentralSurfaces.areNotificationAlertsDisabled();
}
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterModule.java
new file mode 100644
index 0000000..26c483c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterModule.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 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.phone;
+
+import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
+
+import dagger.Binds;
+import dagger.Module;
+
+@Module
+public abstract class StatusBarNotificationPresenterModule {
+ @Binds
+ abstract NotificationPresenter bindPresenter(StatusBarNotificationPresenter impl);
+
+ @Binds
+ abstract NotificationRowBinderImpl.BindRowCallback bindBindRowCallback(
+ StatusBarNotificationPresenter impl);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
index b0206f0..ee242a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -44,7 +44,7 @@
import javax.inject.Inject;
-/** Controls the signal policies for icons shown in the StatusBar. **/
+/** Controls the signal policies for icons shown in the statusbar. **/
@SysUISingleton
public class StatusBarSignalPolicy implements SignalCallback,
SecurityController.SecurityControllerCallback, Tunable {
@@ -449,7 +449,7 @@
}
/**
- * Stores the StatusBar state for no Calling & SMS.
+ * Stores the statusbar state for no Calling & SMS.
*/
public static class CallIndicatorIconState {
public boolean isNoCalling;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
index b742394..95667cc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
@@ -59,7 +59,7 @@
private boolean mIsStatusBarExpanded = false;
private boolean mShouldAdjustInsets = false;
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
private View mNotificationShadeWindowView;
private View mNotificationPanelView;
private boolean mForceCollapsedUntilLayout = false;
@@ -119,9 +119,9 @@
}
protected void setup(
- @NonNull StatusBar statusBar,
+ @NonNull CentralSurfaces centralSurfaces,
@NonNull View notificationShadeWindowView) {
- mStatusBar = statusBar;
+ mCentralSurfaces = centralSurfaces;
mNotificationShadeWindowView = notificationShadeWindowView;
mNotificationPanelView = mNotificationShadeWindowView.findViewById(R.id.notification_panel);
}
@@ -246,7 +246,7 @@
new OnComputeInternalInsetsListener() {
@Override
public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
- if (mIsStatusBarExpanded || mStatusBar.isBouncerShowing()) {
+ if (mIsStatusBarExpanded || mCentralSurfaces.isBouncerShowing()) {
// The touchable region is always the full area when expanded
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java
index 26ba31c..582afb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java
@@ -20,7 +20,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.util.ViewController;
@@ -32,7 +32,7 @@
/**
* Controller for {@link TapAgainView}.
*/
-@StatusBarComponent.StatusBarScope
+@CentralSurfacesComponent.CentralSurfacesScope
public class TapAgainViewController extends ViewController<TapAgainView> {
private final DelayableExecutor mDelayableExecutor;
private final ConfigurationController mConfigurationController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
index 0abe8e4..c11d450 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt
@@ -60,14 +60,13 @@
private val handler: Handler = Handler()
) : WakefulnessLifecycle.Observer, ScreenOffAnimation {
- private lateinit var statusBar: StatusBar
+ private lateinit var mCentralSurfaces: CentralSurfaces
private lateinit var lightRevealScrim: LightRevealScrim
private var animatorDurationScale = 1f
private var shouldAnimateInKeyguard = false
private var lightRevealAnimationPlaying = false
private var aodUiAnimationPlaying = false
- private var callbacks = HashSet<Callback>()
/**
* The result of our decision whether to play the screen off animation in
@@ -81,9 +80,6 @@
interpolator = Interpolators.LINEAR
addUpdateListener {
lightRevealScrim.revealAmount = it.animatedValue as Float
- sendUnlockedScreenOffProgressUpdate(
- 1f - (it.animatedFraction as Float),
- 1f - (it.animatedValue as Float))
if (lightRevealScrim.isScrimAlmostOccludes &&
interactionJankMonitor.isInstrumenting(CUJ_SCREEN_OFF)) {
// ends the instrument when the scrim almost occludes the screen.
@@ -95,7 +91,6 @@
override fun onAnimationCancel(animation: Animator?) {
lightRevealScrim.revealAmount = 1f
lightRevealAnimationPlaying = false
- sendUnlockedScreenOffProgressUpdate(0f, 0f)
interactionJankMonitor.cancel(CUJ_SCREEN_OFF)
}
@@ -105,7 +100,8 @@
}
override fun onAnimationStart(animation: Animator?) {
- interactionJankMonitor.begin(statusBar.notificationShadeWindowView, CUJ_SCREEN_OFF)
+ interactionJankMonitor.begin(
+ mCentralSurfaces.notificationShadeWindowView, CUJ_SCREEN_OFF)
}
})
}
@@ -117,11 +113,11 @@
}
override fun initialize(
- statusBar: StatusBar,
+ centralSurfaces: CentralSurfaces,
lightRevealScrim: LightRevealScrim
) {
this.lightRevealScrim = lightRevealScrim
- this.statusBar = statusBar
+ this.mCentralSurfaces = centralSurfaces
updateAnimatorDurationScale()
globalSettings.registerContentObserver(
@@ -176,9 +172,9 @@
// Lock the keyguard if it was waiting for the screen off animation to end.
keyguardViewMediatorLazy.get().maybeHandlePendingLock()
- // Tell the StatusBar to become keyguard for real - we waited on that since
- // it is slow and would have caused the animation to jank.
- statusBar.updateIsKeyguard()
+ // Tell the CentralSurfaces to become keyguard for real - we waited on that
+ // since it is slow and would have caused the animation to jank.
+ mCentralSurfaces.updateIsKeyguard()
// Run the callback given to us by the KeyguardVisibilityHelper.
after.run()
@@ -196,7 +192,8 @@
override fun onAnimationStart(animation: Animator?) {
interactionJankMonitor.begin(
- statusBar.notificationShadeWindowView, CUJ_SCREEN_OFF_SHOW_AOD)
+ mCentralSurfaces.notificationShadeWindowView,
+ CUJ_SCREEN_OFF_SHOW_AOD)
}
})
.start()
@@ -213,12 +210,12 @@
override fun onFinishedWakingUp() {
// Set this to false in onFinishedWakingUp rather than onStartedWakingUp so that other
- // observers (such as StatusBar) can ask us whether we were playing the screen off animation
- // and reset accordingly.
+ // observers (such as CentralSurfaces) can ask us whether we were playing the screen off
+ // animation and reset accordingly.
aodUiAnimationPlaying = false
- // If we can't control the screen off animation, we shouldn't mess with the StatusBar's
- // keyguard state unnecessarily.
+ // If we can't control the screen off animation, we shouldn't mess with the
+ // CentralSurfaces's keyguard state unnecessarily.
if (dozeParameters.get().canControlUnlockedScreenOff()) {
// Make sure the status bar is in the correct keyguard state, forcing it if necessary.
// This is required if the screen off animation is cancelled, since it might be
@@ -227,7 +224,7 @@
// even if we're going from SHADE to SHADE or KEYGUARD to KEYGUARD, since we might have
// changed parts of the UI (such as showing AOD in the shade) without actually changing
// the StatusBarState. This ensures that the UI definitely reflects the desired state.
- statusBar.updateIsKeyguard(true /* forceStateChange */)
+ mCentralSurfaces.updateIsKeyguard(true /* forceStateChange */)
}
}
@@ -249,7 +246,7 @@
// Show AOD. That'll cause the KeyguardVisibilityHelper to call
// #animateInKeyguard.
- statusBar.notificationPanelViewController.showAodUi()
+ mCentralSurfaces.notificationPanelViewController.showAodUi()
}
}, (ANIMATE_IN_KEYGUARD_DELAY * animatorDurationScale).toLong())
@@ -285,8 +282,8 @@
// We currently draw both the light reveal scrim, and the AOD UI, in the shade. If it's
// already expanded and showing notifications/QS, the animation looks really messy. For now,
// disable it if the notification panel is not fully collapsed.
- if ((!this::statusBar.isInitialized ||
- !statusBar.notificationPanelViewController.isFullyCollapsed) &&
+ if ((!this::mCentralSurfaces.isInitialized ||
+ !mCentralSurfaces.notificationPanelViewController.isFullyCollapsed) &&
// Status bar might be expanded because we have started
// playing the animation already
!isAnimationPlaying()
@@ -309,20 +306,6 @@
override fun shouldDelayDisplayDozeTransition(): Boolean =
dozeParameters.get().shouldControlUnlockedScreenOff()
- fun addCallback(callback: Callback) {
- callbacks.add(callback)
- }
-
- fun removeCallback(callback: Callback) {
- callbacks.remove(callback)
- }
-
- private fun sendUnlockedScreenOffProgressUpdate(linear: Float, eased: Float) {
- callbacks.forEach {
- it.onUnlockedScreenOffProgressUpdate(linear, eased)
- }
- }
-
/**
* Whether we're doing the light reveal animation or we're done with that and animating in the
* AOD UI.
@@ -356,8 +339,4 @@
fun isScreenOffLightRevealAnimationPlaying(): Boolean {
return lightRevealAnimationPlaying
}
-
- interface Callback {
- fun onUnlockedScreenOffProgressUpdate(linear: Float, eased: Float)
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
similarity index 69%
rename from packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
index ad8e79e..59c9d0b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
@@ -22,16 +22,23 @@
import com.android.keyguard.LockIconViewController;
import com.android.systemui.biometrics.AuthRippleController;
+import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationShelfController;
import com.android.systemui.statusbar.core.StatusBarInitializer;
+import com.android.systemui.statusbar.notification.NotificationActivityStarter;
+import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
import com.android.systemui.statusbar.notification.collection.render.StatusBarNotifPanelEventSourceModule;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutListContainerModule;
+import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController;
import com.android.systemui.statusbar.phone.SplitShadeHeaderController;
-import com.android.systemui.statusbar.phone.StatusBarCommandQueueCallbacks;
import com.android.systemui.statusbar.phone.StatusBarHeadsUpChangeListener;
+import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarterModule;
+import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import java.lang.annotation.Documented;
@@ -45,7 +52,7 @@
/**
* Dagger subcomponent for classes (semi-)related to the status bar. The component is created once
- * inside {@link com.android.systemui.statusbar.phone.StatusBar} and never re-created.
+ * inside {@link com.android.systemui.statusbar.phone.CentralSurfaces} and never re-created.
*
* TODO(b/197137564): This should likely be re-factored a bit. It includes classes that aren't
* directly related to status bar functionality, like multiple notification classes. And, the fact
@@ -53,81 +60,82 @@
* outside the component. Should more items be moved *into* this component to avoid so many getters?
*/
@Subcomponent(modules = {
+ NotificationStackScrollLayoutListContainerModule.class,
StatusBarNotifPanelEventSourceModule.class,
- StatusBarViewModule.class
+ StatusBarViewModule.class,
+ StatusBarNotificationActivityStarterModule.class,
+ StatusBarNotificationPresenterModule.class,
})
-@StatusBarComponent.StatusBarScope
-public interface StatusBarComponent {
+@CentralSurfacesComponent.CentralSurfacesScope
+public interface CentralSurfacesComponent {
/**
- * Builder for {@link StatusBarComponent}.
+ * Builder for {@link CentralSurfacesComponent}.
*/
@Subcomponent.Factory
interface Factory {
- StatusBarComponent create();
+ CentralSurfacesComponent create();
}
/**
- * Scope annotation for singleton items within the StatusBarComponent.
+ * Scope annotation for singleton items within the CentralSurfacesComponent.
*/
@Documented
@Retention(RUNTIME)
@Scope
- @interface StatusBarScope {}
+ @interface CentralSurfacesScope {}
+
+ /**
+ * Performs initialization logic after {@link CentralSurfacesComponent} has been constructed.
+ */
+ interface Startable {
+ void start();
+ void stop();
+ }
/**
* Creates a {@link NotificationShadeWindowView}.
*/
- @StatusBarScope
NotificationShadeWindowView getNotificationShadeWindowView();
/** */
- @StatusBarScope
NotificationShelfController getNotificationShelfController();
/** */
- @StatusBarScope
NotificationStackScrollLayoutController getNotificationStackScrollLayoutController();
/**
* Creates a NotificationShadeWindowViewController.
*/
- @StatusBarScope
NotificationShadeWindowViewController getNotificationShadeWindowViewController();
/**
* Creates a NotificationPanelViewController.
*/
- @StatusBarScope
NotificationPanelViewController getNotificationPanelViewController();
/**
* Creates a LockIconViewController. Must be init after creation.
*/
- @StatusBarScope
LockIconViewController getLockIconViewController();
/**
* Creates an AuthRippleViewController. Must be init after creation.
*/
- @StatusBarScope
AuthRippleController getAuthRippleController();
/**
* Creates a StatusBarHeadsUpChangeListener.
*/
- @StatusBarScope
StatusBarHeadsUpChangeListener getStatusBarHeadsUpChangeListener();
/**
- * Creates a StatusBarCommandQueueCallbacks.
+ * Creates a CentralSurfacesCommandQueueCallbacks.
*/
- @StatusBarScope
- StatusBarCommandQueueCallbacks getStatusBarCommandQueueCallbacks();
+ CentralSurfacesCommandQueueCallbacks getCentralSurfacesCommandQueueCallbacks();
/**
* Creates a SplitShadeHeaderController.
*/
- @StatusBarScope
SplitShadeHeaderController getSplitShadeHeaderController();
/**
@@ -140,20 +148,18 @@
/**
* Creates a StatusBarInitializer
*/
- @StatusBarScope
StatusBarInitializer getStatusBarInitializer();
/**
- * Set of startables to be run after a StatusBarComponent has been constructed.
+ * Set of startables to be run after a CentralSurfacesComponent has been constructed.
*/
- @StatusBarScope
Set<Startable> getStartables();
- /**
- * Performs initialization logic after {@link StatusBarComponent} has been constructed.
- */
- interface Startable {
- void start();
- void stop();
- }
+ NotificationActivityStarter getNotificationActivityStarter();
+
+ NotificationPresenter getNotificationPresenter();
+
+ NotificationRowBinderImpl.BindRowCallback getBindRowCallback();
+
+ NotificationListContainer getNotificationListContainer();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index c6b5b1d..c024c72 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -92,10 +92,9 @@
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
@@ -115,7 +114,6 @@
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.startingsurface.StartingSurface;
import java.util.Optional;
@@ -128,16 +126,16 @@
import dagger.Provides;
/**
- * Dagger Module providing {@link StatusBar}.
+ * Dagger Module providing {@link CentralSurfaces}.
*/
@Module
public interface StatusBarPhoneModule {
/**
- * Provides our instance of StatusBar which is considered optional.
+ * Provides our instance of CentralSurfaces which is considered optional.
*/
@Provides
@SysUISingleton
- static StatusBar provideStatusBar(
+ static CentralSurfaces provideCentralSurfaces(
Context context,
NotificationsController notificationsController,
FragmentService fragmentService,
@@ -197,11 +195,8 @@
DozeScrimController dozeScrimController,
VolumeComponent volumeComponent,
CommandQueue commandQueue,
- StatusBarComponent.Factory statusBarComponentFactory,
+ CentralSurfacesComponent.Factory statusBarComponentFactory,
PluginManager pluginManager,
- Optional<LegacySplitScreen> splitScreenOptional,
- StatusBarNotificationActivityStarter.Builder
- statusBarNotificationActivityStarterBuilder,
ShadeController shadeController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
@@ -236,7 +231,7 @@
DeviceStateManager deviceStateManager,
DreamOverlayStateController dreamOverlayStateController,
WiredChargingRippleController wiredChargingRippleController) {
- return new StatusBar(
+ return new CentralSurfaces(
context,
notificationsController,
fragmentService,
@@ -298,8 +293,6 @@
commandQueue,
statusBarComponentFactory,
pluginManager,
- splitScreenOptional,
- statusBarNotificationActivityStarterBuilder,
shadeController,
statusBarKeyguardViewManager,
viewMediatorCallback,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
index ebd58fb..79fe700 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java
@@ -61,6 +61,9 @@
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.tuner.TunerService;
+import com.android.systemui.util.settings.SecureSettings;
+
+import java.util.concurrent.Executor;
import javax.inject.Named;
@@ -77,7 +80,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationShadeWindowView providesNotificationShadeWindowView(
LayoutInflater layoutInflater) {
NotificationShadeWindowView notificationShadeWindowView = (NotificationShadeWindowView)
@@ -92,7 +95,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationStackScrollLayout providesNotificationStackScrollLayout(
NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.findViewById(R.id.notification_stack_scroller);
@@ -100,7 +103,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationShelf providesNotificationShelf(LayoutInflater layoutInflater,
NotificationStackScrollLayout notificationStackScrollLayout) {
NotificationShelf view = (NotificationShelf) layoutInflater.inflate(
@@ -115,7 +118,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationShelfController providesStatusBarWindowView(
NotificationShelfComponent.Builder notificationShelfComponentBuilder,
NotificationShelf notificationShelf) {
@@ -131,7 +134,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationPanelView getNotificationPanelView(
NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.getNotificationPanelView();
@@ -139,7 +142,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static LockIconView getLockIconView(
NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.findViewById(R.id.lock_icon_view);
@@ -147,7 +150,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
@Nullable
public static AuthRippleView getAuthRippleView(
NotificationShadeWindowView notificationShadeWindowView) {
@@ -157,7 +160,7 @@
/** */
@Provides
@Named(SPLIT_SHADE_HEADER)
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static View getSplitShadeStatusBarView(
NotificationShadeWindowView notificationShadeWindowView,
FeatureFlags featureFlags) {
@@ -172,7 +175,7 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static OngoingPrivacyChip getSplitShadeOngoingPrivacyChip(
@Named(SPLIT_SHADE_HEADER) View header) {
return header.findViewById(R.id.privacy_chip);
@@ -180,21 +183,21 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
static StatusIconContainer providesStatusIconContainer(@Named(SPLIT_SHADE_HEADER) View header) {
return header.findViewById(R.id.statusIcons);
}
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
@Named(SPLIT_SHADE_BATTERY_VIEW)
static BatteryMeterView getBatteryMeterView(@Named(SPLIT_SHADE_HEADER) View view) {
return view.findViewById(R.id.batteryRemainingIcon);
}
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
@Named(SPLIT_SHADE_BATTERY_CONTROLLER)
static BatteryMeterViewController getBatteryMeterViewController(
@Named(SPLIT_SHADE_BATTERY_VIEW) BatteryMeterView batteryMeterView,
@@ -218,14 +221,14 @@
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static TapAgainView getTapAgainView(NotificationPanelView npv) {
return npv.getTapAgainView();
}
/** */
@Provides
- @StatusBarComponent.StatusBarScope
+ @CentralSurfacesComponent.CentralSurfacesScope
public static NotificationsQuickSettingsContainer getNotificationsQuickSettingsContainer(
NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.findViewById(R.id.notification_container_parent);
@@ -235,9 +238,9 @@
* Creates a new {@link CollapsedStatusBarFragment}.
*
* **IMPORTANT**: This method intentionally does not have
- * {@link StatusBarComponent.StatusBarScope}, which means a new fragment *will* be created each
- * time this method is called. This is intentional because we need fragments to re-created in
- * certain lifecycle scenarios.
+ * {@link CentralSurfacesComponent.CentralSurfacesScope}, which means a new fragment *will* be
+ * created each time this method is called. This is intentional because we need fragments to
+ * re-created in certain lifecycle scenarios.
*
* This provider is {@link Named} such that it does not conflict with the provider inside of
* {@link StatusBarFragmentComponent}.
@@ -260,7 +263,9 @@
StatusBarStateController statusBarStateController,
CommandQueue commandQueue,
CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger,
- OperatorNameViewController.Factory operatorNameViewControllerFactory
+ OperatorNameViewController.Factory operatorNameViewControllerFactory,
+ SecureSettings secureSettings,
+ @Main Executor mainExecutor
) {
return new CollapsedStatusBarFragment(statusBarFragmentComponentFactory,
ongoingCallController,
@@ -277,6 +282,8 @@
statusBarStateController,
commandQueue,
collapsedStatusBarFragmentLogger,
- operatorNameViewControllerFactory);
+ operatorNameViewControllerFactory,
+ secureSettings,
+ mainExecutor);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
index 2af0772..2c84219 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
@@ -30,8 +30,10 @@
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.app.Fragment;
+import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Parcelable;
+import android.provider.Settings;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,8 +41,11 @@
import android.view.ViewStub;
import android.widget.LinearLayout;
+import androidx.annotation.VisibleForTesting;
+
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
@@ -66,9 +71,11 @@
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.EncryptionHelper;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.settings.SecureSettings;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* Contains the collapsed status bar and handles hiding/showing based on disable flags
@@ -110,6 +117,8 @@
private final PanelExpansionStateManager mPanelExpansionStateManager;
private final StatusBarIconController mStatusBarIconController;
private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;
+ private final SecureSettings mSecureSettings;
+ private final Executor mMainExecutor;
private List<String> mBlockedIcons = new ArrayList<>();
@@ -145,7 +154,9 @@
StatusBarStateController statusBarStateController,
CommandQueue commandQueue,
CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger,
- OperatorNameViewController.Factory operatorNameViewControllerFactory
+ OperatorNameViewController.Factory operatorNameViewControllerFactory,
+ SecureSettings secureSettings,
+ @Main Executor mainExecutor
) {
mStatusBarFragmentComponentFactory = statusBarFragmentComponentFactory;
mOngoingCallController = ongoingCallController;
@@ -163,6 +174,8 @@
mCommandQueue = commandQueue;
mCollapsedStatusBarFragmentLogger = collapsedStatusBarFragmentLogger;
mOperatorNameViewControllerFactory = operatorNameViewControllerFactory;
+ mSecureSettings = secureSettings;
+ mMainExecutor = mainExecutor;
}
@Override
@@ -187,10 +200,7 @@
}
mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons), mFeatureFlags);
mDarkIconManager.setShouldLog(true);
- mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
- mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
- mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength));
- mDarkIconManager.setBlockList(mBlockedIcons);
+ updateBlockedIcons();
mStatusBarIconController.addIconGroup(mDarkIconManager);
mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
mClockView = mStatusBar.findViewById(R.id.clock);
@@ -203,6 +213,24 @@
mAnimationScheduler.addCallback(this);
}
+ @VisibleForTesting
+ void updateBlockedIcons() {
+ mBlockedIcons.clear();
+
+ if (mSecureSettings.getInt(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0) == 0) {
+ mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
+ }
+ mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
+ mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength));
+
+ mMainExecutor.execute(() -> mDarkIconManager.setBlockList(mBlockedIcons));
+ }
+
+ @VisibleForTesting
+ List<String> getBlockedIcons() {
+ return mBlockedIcons;
+ }
+
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
@@ -217,6 +245,11 @@
mCommandQueue.addCallback(this);
mStatusBarStateController.addCallback(this);
initOngoingCallChip();
+
+ mSecureSettings.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON),
+ false,
+ mVolumeSettingObserver);
}
@Override
@@ -225,6 +258,7 @@
mCommandQueue.removeCallback(this);
mStatusBarStateController.removeCallback(this);
mOngoingCallController.removeCallback(mOngoingCallListener);
+ mSecureSettings.unregisterContentObserver(mVolumeSettingObserver);
}
@Override
@@ -584,6 +618,13 @@
mLocationPublisher.updateStatusBarMargin(leftMargin, rightMargin);
}
+ private final ContentObserver mVolumeSettingObserver = new ContentObserver(null) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateBlockedIcons();
+ }
+ };
+
// Listen for view end changes of PhoneStatusBarView and publish that to the privacy dot
private View.OnLayoutChangeListener mStatusBarLayoutListener =
(view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java
index 22b7f64..2eba325 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java
@@ -18,12 +18,14 @@
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.dagger.qualifiers.RootView;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.LightsOutNotifController;
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
import com.android.systemui.statusbar.phone.StatusBarDemoMode;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import dagger.BindsInstance;
@@ -39,12 +41,6 @@
*
* Anything that depends on {@link CollapsedStatusBarFragment} or {@link PhoneStatusBarView}
* should be included here or in {@link StatusBarFragmentModule}.
- *
- * Note that this is completely separate from
- * {@link com.android.systemui.statusbar.phone.dagger.StatusBarComponent}. This component gets
- * re-created on each new fragment creation, whereas
- * {@link com.android.systemui.statusbar.phone.dagger.StatusBarComponent} is only created once in
- * {@link com.android.systemui.statusbar.phone.StatusBar} and never re-created.
*/
@Subcomponent(modules = {StatusBarFragmentModule.class})
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
index 6e7231e..de05eb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt
@@ -21,6 +21,7 @@
import android.app.IUidObserver
import android.app.Notification
import android.app.Notification.CallStyle.CALL_TYPE_ONGOING
+import android.content.Context
import android.content.Intent
import android.util.Log
import android.view.View
@@ -52,6 +53,7 @@
*/
@SysUISingleton
class OngoingCallController @Inject constructor(
+ private val context: Context,
private val notifCollection: CommonNotifCollection,
private val ongoingCallFlags: OngoingCallFlags,
private val systemClock: SystemClock,
@@ -244,7 +246,9 @@
private fun setUpUidObserver(currentCallNotificationInfo: CallNotificationInfo) {
try {
isCallAppVisible = isProcessVisibleToUser(
- iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null)
+ iActivityManager.getUidProcessState(
+ currentCallNotificationInfo.uid, context.opPackageName
+ )
)
} catch (se: SecurityException) {
Log.e(TAG, "Security exception when trying to get process state: $se")
@@ -286,7 +290,7 @@
uidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE,
ActivityManager.PROCESS_STATE_UNKNOWN,
- null
+ context.opPackageName
)
} catch (se: SecurityException) {
Log.e(TAG, "Security exception when trying to register uid observer: $se")
@@ -306,7 +310,7 @@
swipeStatusBarAwayGestureHandler.ifPresent { it.removeOnGestureDetectedCallback(TAG) }
} else {
swipeStatusBarAwayGestureHandler.ifPresent {
- it.addOnGestureDetectedCallback(TAG, this::onSwipeAwayGestureDetected)
+ it.addOnGestureDetectedCallback(TAG) { _ -> onSwipeAwayGestureDetected() }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index f4e53e2..d1c9b3f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -76,14 +76,11 @@
import com.android.systemui.qs.QSUserSwitcherEvent;
import com.android.systemui.qs.user.UserSwitchDialogController.DialogShower;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.telephony.TelephonyListenerManager;
import com.android.systemui.user.CreateUserActivity;
import com.android.systemui.util.settings.SecureSettings;
-import dagger.Lazy;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -129,7 +126,6 @@
private final InteractionJankMonitor mInteractionJankMonitor;
private final LatencyTracker mLatencyTracker;
private final DialogLaunchAnimator mDialogLaunchAnimator;
- private final Lazy<ShadeController> mShadeController;
private ArrayList<UserRecord> mUsers = new ArrayList<>();
@VisibleForTesting
@@ -178,7 +174,6 @@
InteractionJankMonitor interactionJankMonitor,
LatencyTracker latencyTracker,
DumpManager dumpManager,
- Lazy<ShadeController> shadeController,
DialogLaunchAnimator dialogLaunchAnimator) {
mContext = context;
mActivityManager = activityManager;
@@ -207,7 +202,6 @@
mActivityStarter = activityStarter;
mUserManager = userManager;
mDialogLaunchAnimator = dialogLaunchAnimator;
- mShadeController = shadeController;
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_ADDED);
@@ -1206,8 +1200,12 @@
if (ActivityManager.isUserAMonkey()) {
return;
}
- mShadeController.get().collapsePanel();
- getContext().startActivity(CreateUserActivity.createIntentForStart(getContext()));
+ // Use broadcast instead of ShadeController, as this dialog may have started in
+ // another process and normal dagger bindings are not available
+ getContext().sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ getContext().startActivityAsUser(
+ CreateUserActivity.createIntentForStart(getContext()),
+ mUserTracker.getUserHandle());
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
index 6f587fd..c53d510 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
@@ -68,6 +68,7 @@
private final StatusBarContentInsetsProvider mContentInsetsProvider;
private int mBarHeight = -1;
private final State mCurrentState = new State();
+ private boolean mIsAttached;
private final ViewGroup mStatusBarWindowView;
// The container in which we should run launch animations started from the status bar and
@@ -136,6 +137,8 @@
mContentInsetsProvider.addCallback(this::calculateStatusBarLocationsForAllRotations);
calculateStatusBarLocationsForAllRotations();
+ mIsAttached = true;
+ apply(mCurrentState);
}
/** Adds the given view to the status bar window view. */
@@ -282,6 +285,9 @@
}
private void apply(State state) {
+ if (!mIsAttached) {
+ return;
+ }
applyForceStatusBarVisibleFlag(state);
applyHeight(state);
if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt
index 3a14914..60f6df6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt
@@ -25,7 +25,7 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.DisplayId
import com.android.systemui.statusbar.CommandQueue
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import javax.inject.Inject
/**
@@ -80,8 +80,8 @@
}
windowState = state
- if (StatusBar.DEBUG_WINDOW_STATE) {
- Log.d(StatusBar.TAG, "Status bar " + windowStateToString(state))
+ if (CentralSurfaces.DEBUG_WINDOW_STATE) {
+ Log.d(CentralSurfaces.TAG, "Status bar " + windowStateToString(state))
}
listeners.forEach { it.onStatusBarWindowStateChanged(state) }
}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
index e2374ad..d6dfcea 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
@@ -26,7 +26,7 @@
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.phone.ScreenOffAnimation
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.unfold.FoldAodAnimationController.FoldAodAnimationStatus
import com.android.systemui.util.settings.GlobalSettings
@@ -50,7 +50,7 @@
private val globalSettings: GlobalSettings
) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer {
- private lateinit var statusBar: StatusBar
+ private lateinit var mCentralSurfaces: CentralSurfaces
private var isFolded = false
private var isFoldHandled = true
@@ -66,14 +66,14 @@
private val statusListeners = arrayListOf<FoldAodAnimationStatus>()
private val startAnimationRunnable = Runnable {
- statusBar.notificationPanelViewController.startFoldToAodAnimation {
+ mCentralSurfaces.notificationPanelViewController.startFoldToAodAnimation {
// End action
setAnimationState(playing = false)
}
}
- override fun initialize(statusBar: StatusBar, lightRevealScrim: LightRevealScrim) {
- this.statusBar = statusBar
+ override fun initialize(centralSurfaces: CentralSurfaces, lightRevealScrim: LightRevealScrim) {
+ this.mCentralSurfaces = centralSurfaces
deviceStateManager.registerCallback(executor, FoldListener())
wakefulnessLifecycle.addObserver(this)
@@ -88,7 +88,7 @@
globalSettings.getString(Settings.Global.ANIMATOR_DURATION_SCALE) != "0"
) {
setAnimationState(playing = true)
- statusBar.notificationPanelViewController.prepareFoldToAodAnimation()
+ mCentralSurfaces.notificationPanelViewController.prepareFoldToAodAnimation()
true
} else {
setAnimationState(playing = false)
@@ -98,7 +98,7 @@
override fun onStartedWakingUp() {
if (isAnimationPlaying) {
handler.removeCallbacks(startAnimationRunnable)
- statusBar.notificationPanelViewController.cancelFoldToAodAnimation()
+ mCentralSurfaces.notificationPanelViewController.cancelFoldToAodAnimation()
}
setAnimationState(playing = false)
@@ -131,12 +131,14 @@
// We should play the folding to AOD animation
setAnimationState(playing = true)
- statusBar.notificationPanelViewController.prepareFoldToAodAnimation()
+ mCentralSurfaces.notificationPanelViewController.prepareFoldToAodAnimation()
// We don't need to wait for the scrim as it is already displayed
// but we should wait for the initial animation preparations to be drawn
// (setting initial alpha/translation)
- OneShotPreDrawListener.add(statusBar.notificationPanelViewController.view, onReady)
+ OneShotPreDrawListener.add(
+ mCentralSurfaces.notificationPanelViewController.view, onReady
+ )
} else {
// No animation, call ready callback immediately
onReady.run()
diff --git a/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt
new file mode 100644
index 0000000..613a797
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/view/ViewUtil.kt
@@ -0,0 +1,26 @@
+package com.android.systemui.util.view
+
+import android.view.View
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+/**
+ * A class with generic view utility methods.
+ *
+ * Doesn't use static methods so that it can be easily mocked out in tests.
+ */
+@SysUISingleton
+class ViewUtil @Inject constructor() {
+ /**
+ * Returns true if the given (x, y) point (in screen coordinates) is within the status bar
+ * view's range and false otherwise.
+ */
+ fun touchIsWithinView(view: View, x: Float, y: Float): Boolean {
+ val left = view.locationOnScreen[0]
+ val top = view.locationOnScreen[1]
+ return left <= x &&
+ x <= left + view.width &&
+ top <= y &&
+ y <= top + view.height
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index b2a79b0..c3c3f90 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -58,7 +58,6 @@
import com.android.wm.shell.compatui.CompatUI;
import com.android.wm.shell.draganddrop.DragAndDrop;
import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.nano.WmShellTraceProto;
import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.onehanded.OneHandedEventCallback;
@@ -108,7 +107,6 @@
// Shell interfaces
private final Optional<Pip> mPipOptional;
- private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
private final Optional<OneHanded> mOneHandedOptional;
private final Optional<HideDisplayCutout> mHideDisplayCutoutOptional;
@@ -128,7 +126,6 @@
private final Executor mSysUiMainExecutor;
private boolean mIsSysUiStateValid;
- private KeyguardUpdateMonitorCallback mLegacySplitScreenKeyguardCallback;
private KeyguardUpdateMonitorCallback mSplitScreenKeyguardCallback;
private KeyguardUpdateMonitorCallback mPipKeyguardCallback;
private KeyguardUpdateMonitorCallback mOneHandedKeyguardCallback;
@@ -138,7 +135,6 @@
@Inject
public WMShell(Context context,
Optional<Pip> pipOptional,
- Optional<LegacySplitScreen> legacySplitScreenOptional,
Optional<SplitScreen> splitScreenOptional,
Optional<OneHanded> oneHandedOptional,
Optional<HideDisplayCutout> hideDisplayCutoutOptional,
@@ -163,7 +159,6 @@
mScreenLifecycle = screenLifecycle;
mSysUiState = sysUiState;
mPipOptional = pipOptional;
- mLegacySplitScreenOptional = legacySplitScreenOptional;
mSplitScreenOptional = splitScreenOptional;
mOneHandedOptional = oneHandedOptional;
mHideDisplayCutoutOptional = hideDisplayCutoutOptional;
@@ -183,7 +178,6 @@
mProtoTracer.add(this);
mCommandQueue.addCallback(this);
mPipOptional.ifPresent(this::initPip);
- mLegacySplitScreenOptional.ifPresent(this::initLegacySplitScreen);
mSplitScreenOptional.ifPresent(this::initSplitScreen);
mOneHandedOptional.ifPresent(this::initOneHanded);
mHideDisplayCutoutOptional.ifPresent(this::initHideDisplayCutout);
@@ -238,21 +232,6 @@
}
@VisibleForTesting
- void initLegacySplitScreen(LegacySplitScreen legacySplitScreen) {
- mLegacySplitScreenKeyguardCallback = new KeyguardUpdateMonitorCallback() {
- @Override
- public void onKeyguardVisibilityChanged(boolean showing) {
- // Hide the divider when keyguard is showing. Even though keyguard/statusbar is
- // above everything, it is actually transparent except for notifications, so
- // we still need to hide any surfaces that are below it.
- // TODO(b/148906453): Figure out keyguard dismiss animation for divider view.
- legacySplitScreen.onKeyguardVisibilityChanged(showing);
- }
- };
- mKeyguardUpdateMonitor.registerCallback(mLegacySplitScreenKeyguardCallback);
- }
-
- @VisibleForTesting
void initSplitScreen(SplitScreen splitScreen) {
mSplitScreenKeyguardCallback = new KeyguardUpdateMonitorCallback() {
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
index 5128ccc..ec2c1de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt
@@ -32,7 +32,7 @@
import com.android.systemui.statusbar.commandline.CommandRegistry
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.leak.RotationUtils
@@ -61,7 +61,7 @@
private lateinit var staticMockSession: MockitoSession
private lateinit var controller: AuthRippleController
- @Mock private lateinit var statusBar: StatusBar
+ @Mock private lateinit var mCentralSurfaces: CentralSurfaces
@Mock private lateinit var rippleView: AuthRippleView
@Mock private lateinit var commandRegistry: CommandRegistry
@Mock private lateinit var configurationController: ConfigurationController
@@ -89,7 +89,7 @@
`when`(udfpsControllerProvider.get()).thenReturn(udfpsController)
controller = AuthRippleController(
- statusBar,
+ mCentralSurfaces,
context,
authController,
configurationController,
@@ -105,7 +105,7 @@
rippleView
)
controller.init()
- `when`(statusBar.lightRevealScrim).thenReturn(lightRevealScrim)
+ `when`(mCentralSurfaces.lightRevealScrim).thenReturn(lightRevealScrim)
}
@After
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 35e838b..1856fda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -65,7 +65,7 @@
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
@@ -121,7 +121,7 @@
@Mock
private StatusBarStateController mStatusBarStateController;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
index e9a4e15..7fb42b6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
@@ -166,7 +166,7 @@
mController.onViewAttached();
verify(mView, atLeast(1)).setPauseAuth(true);
- verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount);
+ verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount, true);
}
@Test
@@ -193,7 +193,7 @@
final float eased = .65f;
mStatusBarStateListener.onDozeAmountChanged(linear, eased);
- verify(mView).onDozeAmountChanged(linear, eased);
+ verify(mView).onDozeAmountChanged(linear, eased, true);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
index 9908d44..da25c62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt
@@ -16,15 +16,22 @@
package com.android.systemui.controls.ui
+import android.database.ContentObserver
+import android.net.Uri
+import android.os.Handler
+import android.provider.Settings
+import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.settings.SecureSettings
import com.android.wm.shell.TaskViewFactory
+import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -44,7 +51,6 @@
@SmallTest
@RunWith(AndroidTestingRunner::class)
class ControlActionCoordinatorImplTest : SysuiTestCase() {
-
@Mock
private lateinit var vibratorHelper: VibratorHelper
@Mock
@@ -61,6 +67,10 @@
private lateinit var cvh: ControlViewHolder
@Mock
private lateinit var metricsLogger: ControlsMetricsLogger
+ @Mock
+ private lateinit var secureSettings: SecureSettings
+ @Mock
+ private lateinit var mainHandler: Handler
companion object {
fun <T> any(): T = Mockito.any<T>()
@@ -75,16 +85,24 @@
fun setUp() {
MockitoAnnotations.initMocks(this)
+ `when`(secureSettings.getUriFor(Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS))
+ .thenReturn(Settings.Secure
+ .getUriFor(Settings.Secure.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS))
+
coordinator = spy(ControlActionCoordinatorImpl(
- mContext,
- bgExecutor,
- uiExecutor,
- activityStarter,
- keyguardStateController,
- taskViewFactory,
- metricsLogger,
- vibratorHelper
- ))
+ mContext,
+ bgExecutor,
+ uiExecutor,
+ activityStarter,
+ keyguardStateController,
+ taskViewFactory,
+ metricsLogger,
+ vibratorHelper,
+ secureSettings,
+ mainHandler))
+
+ verify(secureSettings).registerContentObserver(any(Uri::class.java),
+ anyBoolean(), any(ContentObserver::class.java))
`when`(cvh.cws.ci.controlId).thenReturn(ID)
`when`(cvh.cws.control?.isAuthRequired()).thenReturn(true)
@@ -126,10 +144,23 @@
fun testToggleRunsWhenLockedAndAuthNotRequired() {
`when`(keyguardStateController.isShowing()).thenReturn(true)
`when`(keyguardStateController.isUnlocked()).thenReturn(false)
- `when`(cvh.cws.control?.isAuthRequired()).thenReturn(false)
+ doReturn(false).`when`(coordinator).isAuthRequired(
+ any(), anyBoolean())
coordinator.toggle(cvh, "", true)
+
verify(coordinator).bouncerOrRun(action, false /* authRequired */)
verify(action).invoke()
}
+
+ @Test
+ fun testIsAuthRequired() {
+ `when`(cvh.cws.control?.isAuthRequired).thenReturn(true)
+ assertThat(coordinator.isAuthRequired(cvh, false)).isTrue()
+
+ `when`(cvh.cws.control?.isAuthRequired).thenReturn(false)
+ assertThat(coordinator.isAuthRequired(cvh, false)).isTrue()
+
+ assertThat(coordinator.isAuthRequired(cvh, true)).isFalse()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index 5684429..3340f2f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -143,8 +143,8 @@
}
@Test
- public void testInitialize_dozeSuppressed_alwaysOnDisabled_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testInitialize_alwaysOnSuppressed_alwaysOnDisabled_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(false);
mMachine.requestState(INITIALIZED);
@@ -154,8 +154,8 @@
}
@Test
- public void testInitialize_dozeSuppressed_alwaysOnEnabled_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testInitialize_alwaysOnSuppressed_alwaysOnEnabled_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
mMachine.requestState(INITIALIZED);
@@ -165,8 +165,8 @@
}
@Test
- public void testInitialize_dozeSuppressed_afterDocked_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testInitialize_alwaysOnSuppressed_afterDocked_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mDockManager.isDocked()).thenReturn(true);
mMachine.requestState(INITIALIZED);
@@ -176,8 +176,8 @@
}
@Test
- public void testInitialize_dozeSuppressed_alwaysOnDisabled_afterDockPaused_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testInitialize_alwaysOnSuppressed_alwaysOnDisabled_afterDockPaused_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(false);
when(mDockManager.isDocked()).thenReturn(true);
when(mDockManager.isHidden()).thenReturn(true);
@@ -189,8 +189,8 @@
}
@Test
- public void testInitialize_dozeSuppressed_alwaysOnEnabled_afterDockPaused_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testInitialize_alwaysOnSuppressed_alwaysOnEnabled_afterDockPaused_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
when(mDockManager.isDocked()).thenReturn(true);
when(mDockManager.isHidden()).thenReturn(true);
@@ -228,8 +228,8 @@
}
@Test
- public void testPulseDone_dozeSuppressed_goesToSuppressed() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testPulseDone_alwaysOnSuppressed_goesToSuppressed() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
mMachine.requestState(INITIALIZED);
mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
@@ -266,8 +266,8 @@
}
@Test
- public void testPulseDone_dozeSuppressed_afterDocked_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testPulseDone_alwaysOnSuppressed_afterDocked_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mDockManager.isDocked()).thenReturn(true);
mMachine.requestState(INITIALIZED);
mMachine.requestPulse(DozeLog.PULSE_REASON_NOTIFICATION);
@@ -295,8 +295,8 @@
}
@Test
- public void testPulseDone_dozeSuppressed_afterDockPaused_goesToDoze() {
- when(mHost.isDozeSuppressed()).thenReturn(true);
+ public void testPulseDone_alwaysOnSuppressed_afterDockPaused_goesToDoze() {
+ when(mHost.isAlwaysOnSuppressed()).thenReturn(true);
when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
when(mDockManager.isDocked()).thenReturn(true);
when(mDockManager.isHidden()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuppressorTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuppressorTest.java
new file mode 100644
index 0000000..aa0a909
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuppressorTest.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2022 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 andatest
+ * limitations under the License.
+ */
+
+package com.android.systemui.doze;
+
+import static com.android.systemui.doze.DozeMachine.State.DOZE;
+import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD;
+import static com.android.systemui.doze.DozeMachine.State.FINISH;
+import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
+import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.UiModeManager;
+import android.content.BroadcastReceiver;
+import android.content.res.Configuration;
+import android.hardware.display.AmbientDisplayConfiguration;
+import android.testing.AndroidTestingRunner;
+import android.testing.UiThreadTest;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.broadcast.BroadcastDispatcher;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import dagger.Lazy;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@UiThreadTest
+public class DozeSuppressorTest extends SysuiTestCase {
+
+ DozeSuppressor mDozeSuppressor;
+ @Mock
+ private DozeLog mDozeLog;
+ @Mock
+ private DozeHost mDozeHost;
+ @Mock
+ private AmbientDisplayConfiguration mConfig;
+ @Mock
+ private BroadcastDispatcher mBroadcastDispatcher;
+ @Mock
+ private UiModeManager mUiModeManager;
+ @Mock
+ private Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
+ @Mock
+ private BiometricUnlockController mBiometricUnlockController;
+
+ @Mock
+ private DozeMachine mDozeMachine;
+
+ @Captor
+ private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor;
+ private BroadcastReceiver mBroadcastReceiver;
+
+ @Captor
+ private ArgumentCaptor<DozeHost.Callback> mDozeHostCaptor;
+ private DozeHost.Callback mDozeHostCallback;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ // setup state for NOT ending doze immediately
+ when(mBiometricUnlockControllerLazy.get()).thenReturn(mBiometricUnlockController);
+ when(mBiometricUnlockController.hasPendingAuthentication()).thenReturn(false);
+ when(mDozeHost.isProvisioned()).thenReturn(true);
+
+ mDozeSuppressor = new DozeSuppressor(
+ mDozeHost,
+ mConfig,
+ mDozeLog,
+ mBroadcastDispatcher,
+ mUiModeManager,
+ mBiometricUnlockControllerLazy);
+
+ mDozeSuppressor.setDozeMachine(mDozeMachine);
+ }
+
+ @After
+ public void tearDown() {
+ mDozeSuppressor.destroy();
+ }
+
+ @Test
+ public void testRegistersListenersOnInitialized_unregisteredOnFinish() {
+ // check that receivers and callbacks registered
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+ captureBroadcastReceiver();
+ captureDozeHostCallback();
+
+ // check that receivers and callbacks are unregistered
+ mDozeSuppressor.transitionTo(INITIALIZED, FINISH);
+ verify(mBroadcastDispatcher).unregisterReceiver(mBroadcastReceiver);
+ verify(mDozeHost).removeCallback(mDozeHostCallback);
+ }
+
+ @Test
+ public void testEndDoze_carMode() {
+ // GIVEN car mode
+ when(mUiModeManager.getCurrentModeType()).thenReturn(Configuration.UI_MODE_TYPE_CAR);
+
+ // WHEN dozing begins
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+
+ // THEN doze immediately ends
+ verify(mDozeMachine).requestState(FINISH);
+ }
+
+ @Test
+ public void testEndDoze_unprovisioned() {
+ // GIVEN device unprovisioned
+ when(mDozeHost.isProvisioned()).thenReturn(false);
+
+ // WHEN dozing begins
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+
+ // THEN doze immediately ends
+ verify(mDozeMachine).requestState(FINISH);
+ }
+
+ @Test
+ public void testEndDoze_hasPendingUnlock() {
+ // GIVEN device unprovisioned
+ when(mBiometricUnlockController.hasPendingAuthentication()).thenReturn(true);
+
+ // WHEN dozing begins
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+
+ // THEN doze immediately ends
+ verify(mDozeMachine).requestState(FINISH);
+ }
+
+ @Test
+ public void testPowerSaveChanged_active() {
+ // GIVEN AOD power save is active and doze is initialized
+ when(mDozeHost.isPowerSaveActive()).thenReturn(true);
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+ captureDozeHostCallback();
+
+ // WHEN power save change gets triggered (even if active = false, since it
+ // may differ from the aodPowerSaveActive state reported by DostHost)
+ mDozeHostCallback.onPowerSaveChanged(false);
+
+ // THEN the state changes to DOZE
+ verify(mDozeMachine).requestState(DOZE);
+ }
+
+ @Test
+ public void testPowerSaveChanged_notActive() {
+ // GIVEN DOZE (not showing aod content)
+ when(mConfig.alwaysOnEnabled(anyInt())).thenReturn(true);
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+ when(mDozeMachine.getState()).thenReturn(DOZE);
+ captureDozeHostCallback();
+
+ // WHEN power save mode is no longer active
+ when(mDozeHost.isPowerSaveActive()).thenReturn(false);
+ mDozeHostCallback.onPowerSaveChanged(false);
+
+ // THEN the state changes to DOZE_AOD
+ verify(mDozeMachine).requestState(DOZE_AOD);
+ }
+
+ @Test
+ public void testAlwaysOnSuppressedChanged_nowSuppressed() {
+ // GIVEN DOZE_AOD
+ when(mConfig.alwaysOnEnabled(anyInt())).thenReturn(true);
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+ when(mDozeMachine.getState()).thenReturn(DOZE_AOD);
+ captureDozeHostCallback();
+
+ // WHEN alwaysOnSuppressedChanged to suppressed=true
+ mDozeHostCallback.onAlwaysOnSuppressedChanged(true);
+
+ // THEN DOZE requested
+ verify(mDozeMachine).requestState(DOZE);
+ }
+
+ @Test
+ public void testAlwaysOnSuppressedChanged_notSuppressed() {
+ // GIVEN DOZE
+ when(mConfig.alwaysOnEnabled(anyInt())).thenReturn(true);
+ mDozeSuppressor.transitionTo(UNINITIALIZED, INITIALIZED);
+ when(mDozeMachine.getState()).thenReturn(DOZE);
+ captureDozeHostCallback();
+
+ // WHEN alwaysOnSuppressedChanged to suppressed=false
+ mDozeHostCallback.onAlwaysOnSuppressedChanged(false);
+
+ // THEN DOZE_AOD requested
+ verify(mDozeMachine).requestState(DOZE_AOD);
+ }
+
+ private void captureDozeHostCallback() {
+ verify(mDozeHost).addCallback(mDozeHostCaptor.capture());
+ mDozeHostCallback = mDozeHostCaptor.getValue();
+ }
+
+ private void captureBroadcastReceiver() {
+ verify(mBroadcastDispatcher).registerReceiver(mBroadcastReceiverCaptor.capture(),
+ anyObject());
+ mBroadcastReceiver = mBroadcastReceiverCaptor.getValue();
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
index 8ce10b8..d0e10fb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
@@ -18,7 +18,6 @@
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -49,6 +48,7 @@
private static final int DREAM_OVERLAY_NOTIFICATIONS_DRAG_AREA_HEIGHT = 100;
private static final int MAX_BURN_IN_OFFSET = 20;
private static final long BURN_IN_PROTECTION_UPDATE_INTERVAL = 10;
+ private static final long MILLIS_UNTIL_FULL_JITTER = 240 * 1000;
@Mock
Resources mResources;
@@ -100,7 +100,8 @@
mDreamOverlayStatusBarViewController,
mHandler,
MAX_BURN_IN_OFFSET,
- BURN_IN_PROTECTION_UPDATE_INTERVAL);
+ BURN_IN_PROTECTION_UPDATE_INTERVAL,
+ MILLIS_UNTIL_FULL_JITTER);
}
@Test
@@ -129,14 +130,14 @@
}
@Test
- public void testBurnInProtectionUpdatesPeriodically() {
+ public void testBurnInProtectionOffsetsStartAtZero() {
ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
mController.onViewAttached();
verify(mHandler).postDelayed(
runnableCaptor.capture(), eq(BURN_IN_PROTECTION_UPDATE_INTERVAL));
runnableCaptor.getValue().run();
- verify(mDreamOverlayContainerView).setTranslationX(anyFloat());
- verify(mDreamOverlayContainerView).setTranslationY(anyFloat());
+ verify(mDreamOverlayContainerView).setTranslationX(0.f);
+ verify(mDreamOverlayContainerView).setTranslationY(0.f);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
index ad8d44d..a32ff80 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
@@ -17,19 +17,34 @@
package com.android.systemui.dreams;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AlarmManager;
+import android.content.res.Resources;
+import android.hardware.SensorPrivacyManager;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.provider.Settings;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.StatusBarNotification;
import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
+import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.NotificationListener;
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
+import com.android.systemui.statusbar.policy.NextAlarmController;
+import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.touch.TouchInsetManager;
+import com.android.systemui.util.time.DateFormatUtil;
import org.junit.Before;
import org.junit.Test;
@@ -41,6 +56,8 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
+ private static final String NOTIFICATION_INDICATOR_FORMATTER_STRING =
+ "{count, plural, =1 {# notification} other {# notifications}}";
@Mock
DreamOverlayStatusBarView mView;
@@ -52,14 +69,55 @@
Network mNetwork;
@Mock
TouchInsetManager.TouchInsetSession mTouchSession;
+ @Mock
+ Resources mResources;
+ @Mock
+ AlarmManager mAlarmManager;
+ @Mock
+ AlarmManager.AlarmClockInfo mAlarmClockInfo;
+ @Mock
+ NextAlarmController mNextAlarmController;
+ @Mock
+ DateFormatUtil mDateFormatUtil;
+ @Mock
+ IndividualSensorPrivacyController mSensorPrivacyController;
+ @Mock
+ StatusBarNotification mStatusBarNotification;
+ @Mock
+ NotificationListenerService.RankingMap mRankingMap;
+ @Mock
+ NotificationListener mNotificationListener;
+ @Mock
+ ZenModeController mZenModeController;
DreamOverlayStatusBarViewController mController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mController = new DreamOverlayStatusBarViewController(mView, mConnectivityManager,
- mTouchSession);
+
+ when(mResources.getString(R.string.dream_overlay_status_bar_notification_indicator))
+ .thenReturn(NOTIFICATION_INDICATOR_FORMATTER_STRING);
+
+ mController = new DreamOverlayStatusBarViewController(
+ mView,
+ mResources,
+ mConnectivityManager,
+ mTouchSession,
+ mAlarmManager,
+ mNextAlarmController,
+ mDateFormatUtil,
+ mSensorPrivacyController,
+ mNotificationListener,
+ mZenModeController);
+ }
+
+ @Test
+ public void testOnViewAttachedAddsCallbacks() {
+ mController.onViewAttached();
+ verify(mNextAlarmController).addCallback(any());
+ verify(mSensorPrivacyController).addCallback(any());
+ verify(mZenModeController).addCallback(any());
}
@Test
@@ -71,28 +129,97 @@
}
@Test
- public void testOnViewAttachedShowsWifiStatusWhenWifiUnavailable() {
+ public void testOnViewAttachedShowsWifiIconWhenWifiUnavailable() {
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
.thenReturn(false);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached();
- verify(mView).showWifiStatus(true);
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true);
}
@Test
- public void testOnViewAttachedHidesWifiStatusWhenWifiAvailable() {
+ public void testOnViewAttachedHidesWifiIconWhenWifiAvailable() {
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
.thenReturn(true);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached();
- verify(mView).showWifiStatus(false);
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false);
}
@Test
- public void testOnViewAttachedShowsWifiStatusWhenNetworkCapabilitiesUnavailable() {
+ public void testOnViewAttachedShowsWifiIconWhenNetworkCapabilitiesUnavailable() {
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(null);
mController.onViewAttached();
- verify(mView).showWifiStatus(true);
+ }
+
+ @Test
+ public void testOnViewAttachedShowsAlarmIconWhenAlarmExists() {
+ when(mAlarmClockInfo.getTriggerTime()).thenReturn(1L);
+ when(mAlarmManager.getNextAlarmClock(anyInt())).thenReturn(mAlarmClockInfo);
+ mController.onViewAttached();
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET), eq(true), any());
+ }
+
+ @Test
+ public void testOnViewAttachedHidesAlarmIconWhenNoAlarmExists() {
+ when(mAlarmManager.getNextAlarmClock(anyInt())).thenReturn(null);
+ mController.onViewAttached();
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_ALARM_SET), eq(false), isNull());
+ }
+
+ @Test
+ public void testOnViewAttachedShowsMicCameraIconWhenDisabled() {
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE))
+ .thenReturn(true);
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
+ .thenReturn(true);
+ mController.onViewAttached();
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true);
+ }
+
+ @Test
+ public void testOnViewAttachedHidesMicCameraIconWhenEnabled() {
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE))
+ .thenReturn(false);
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
+ .thenReturn(false);
+ mController.onViewAttached();
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false);
+ }
+
+ @Test
+ public void testOnViewAttachedShowsNotificationsIconWhenNotificationsExist() {
+ StatusBarNotification[] notifications = { mStatusBarNotification };
+ when(mNotificationListener.getActiveNotifications()).thenReturn(notifications);
+ mController.onViewAttached();
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any());
+ }
+
+ @Test
+ public void testOnViewAttachedHidesNotificationsIconWhenNoNotificationsExist() {
+ when(mNotificationListener.getActiveNotifications()).thenReturn(null);
+ mController.onViewAttached();
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(false), isNull());
+ }
+
+ @Test
+ public void testOnViewAttachedShowsPriorityModeIconWhenEnabled() {
+ when(mZenModeController.getZen()).thenReturn(
+ Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
+ mController.onViewAttached();
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true);
+ }
+
+ @Test
+ public void testOnViewAttachedHidesPriorityModeIconWhenDisabled() {
+ when(mZenModeController.getZen()).thenReturn(
+ Settings.Global.ZEN_MODE_OFF);
+ mController.onViewAttached();
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false);
}
@Test
@@ -103,10 +230,19 @@
}
@Test
- public void testWifiStatusHiddenWhenWifiBecomesAvailable() {
- // Make sure wifi starts out unavailable when onViewAttached is called.
+ public void testOnViewDetachedRemovesCallbacks() {
+ mController.onViewDetached();
+ verify(mNextAlarmController).removeCallback(any());
+ verify(mSensorPrivacyController).removeCallback(any());
+ verify(mZenModeController).removeCallback(any());
+ }
+
+ @Test
+ public void testWifiIconHiddenWhenWifiBecomesAvailable() {
+ // Make sure wifi starts out unavailable when onViewAttached is called, and then returns
+ // true on the second query.
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
- .thenReturn(false);
+ .thenReturn(false).thenReturn(true);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached();
@@ -114,14 +250,15 @@
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture());
callbackCapture.getValue().onAvailable(mNetwork);
- verify(mView).showWifiStatus(false);
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false);
}
@Test
- public void testWifiStatusShownWhenWifiBecomesUnavailable() {
- // Make sure wifi starts out available when onViewAttached is called.
+ public void testWifiIconShownWhenWifiBecomesUnavailable() {
+ // Make sure wifi starts out available when onViewAttached is called, then returns false
+ // on the second query.
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
- .thenReturn(true);
+ .thenReturn(true).thenReturn(false);
when(mConnectivityManager.getNetworkCapabilities(any())).thenReturn(mNetworkCapabilities);
mController.onViewAttached();
@@ -129,11 +266,11 @@
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
verify(mConnectivityManager).registerNetworkCallback(any(), callbackCapture.capture());
callbackCapture.getValue().onLost(mNetwork);
- verify(mView).showWifiStatus(true);
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, true);
}
@Test
- public void testWifiStatusHiddenWhenCapabilitiesChange() {
+ public void testWifiIconHiddenWhenCapabilitiesChange() {
// Make sure wifi starts out unavailable when onViewAttached is called.
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
.thenReturn(false);
@@ -146,6 +283,102 @@
when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
.thenReturn(true);
callbackCapture.getValue().onCapabilitiesChanged(mNetwork, mNetworkCapabilities);
- verify(mView).showWifiStatus(false);
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_WIFI_UNAVAILABLE, false);
+ }
+
+ @Test
+ public void testNotificationsIconShownWhenNotificationAdded() {
+ mController.onViewAttached();
+
+ StatusBarNotification[] notifications = { mStatusBarNotification };
+ when(mNotificationListener.getActiveNotifications()).thenReturn(notifications);
+
+ final ArgumentCaptor<NotificationListener.NotificationHandler> callbackCapture =
+ ArgumentCaptor.forClass(NotificationListener.NotificationHandler.class);
+ verify(mNotificationListener).addNotificationHandler(callbackCapture.capture());
+ callbackCapture.getValue().onNotificationPosted(mStatusBarNotification, mRankingMap);
+
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any());
+ }
+
+ @Test
+ public void testNotificationsIconHiddenWhenLastNotificationRemoved() {
+ StatusBarNotification[] notifications = { mStatusBarNotification };
+ when(mNotificationListener.getActiveNotifications()).thenReturn(notifications)
+ .thenReturn(null);
+ mController.onViewAttached();
+
+ final ArgumentCaptor<NotificationListener.NotificationHandler> callbackCapture =
+ ArgumentCaptor.forClass(NotificationListener.NotificationHandler.class);
+ verify(mNotificationListener).addNotificationHandler(callbackCapture.capture());
+ callbackCapture.getValue().onNotificationPosted(mStatusBarNotification, mRankingMap);
+
+ verify(mView).showIcon(
+ eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(false), any());
+ }
+
+ @Test
+ public void testMicCameraIconShownWhenSensorsBlocked() {
+ mController.onViewAttached();
+
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE))
+ .thenReturn(true);
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
+ .thenReturn(true);
+
+ final ArgumentCaptor<IndividualSensorPrivacyController.Callback> callbackCapture =
+ ArgumentCaptor.forClass(IndividualSensorPrivacyController.Callback.class);
+ verify(mSensorPrivacyController).addCallback(callbackCapture.capture());
+ callbackCapture.getValue().onSensorBlockedChanged(
+ SensorPrivacyManager.Sensors.MICROPHONE, true);
+
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, true);
+ }
+
+ @Test
+ public void testMicCameraIconHiddenWhenSensorsNotBlocked() {
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.MICROPHONE))
+ .thenReturn(true).thenReturn(false);
+ when(mSensorPrivacyController.isSensorBlocked(SensorPrivacyManager.Sensors.CAMERA))
+ .thenReturn(true).thenReturn(false);
+ mController.onViewAttached();
+
+ final ArgumentCaptor<IndividualSensorPrivacyController.Callback> callbackCapture =
+ ArgumentCaptor.forClass(IndividualSensorPrivacyController.Callback.class);
+ verify(mSensorPrivacyController).addCallback(callbackCapture.capture());
+ callbackCapture.getValue().onSensorBlockedChanged(
+ SensorPrivacyManager.Sensors.MICROPHONE, false);
+
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_MIC_CAMERA_DISABLED, false);
+ }
+
+ @Test
+ public void testPriorityModeIconShownWhenZenModeEnabled() {
+ mController.onViewAttached();
+
+ when(mZenModeController.getZen()).thenReturn(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS);
+
+ final ArgumentCaptor<ZenModeController.Callback> callbackCapture =
+ ArgumentCaptor.forClass(ZenModeController.Callback.class);
+ verify(mZenModeController).addCallback(callbackCapture.capture());
+ callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS);
+
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, true);
+ }
+
+ @Test
+ public void testPriorityModeIconHiddenWhenZenModeDisabled() {
+ when(mZenModeController.getZen()).thenReturn(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS)
+ .thenReturn(Settings.Global.ZEN_MODE_OFF);
+ mController.onViewAttached();
+
+
+ final ArgumentCaptor<ZenModeController.Callback> callbackCapture =
+ ArgumentCaptor.forClass(ZenModeController.Callback.class);
+ verify(mZenModeController).addCallback(callbackCapture.capture());
+ callbackCapture.getValue().onZenChanged(Settings.Global.ZEN_MODE_OFF);
+
+ verify(mView).showIcon(DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
index cad98f4..6e01541 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
@@ -27,19 +26,21 @@
import static org.mockito.Mockito.when;
import android.animation.ValueAnimator;
+import android.graphics.Rect;
+import android.graphics.Region;
import android.testing.AndroidTestingRunner;
+import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.VelocityTracker;
-import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.shared.system.InputChannelCompat;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.wm.shell.animation.FlingAnimationUtils;
@@ -51,8 +52,6 @@
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import java.util.Random;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class BouncerSwipeTouchHandlerTest extends SysuiTestCase {
@@ -60,7 +59,7 @@
StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock
- StatusBar mStatusBar;
+ CentralSurfaces mCentralSurfaces;
@Mock
NotificationShadeWindowController mNotificationShadeWindowController;
@@ -89,38 +88,51 @@
@Mock
VelocityTracker mVelocityTracker;
+ final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
+
private static final float TOUCH_REGION = .3f;
- private static final float SCREEN_HEIGHT_PX = 100;
+ private static final int SCREEN_WIDTH_PX = 1024;
+ private static final int SCREEN_HEIGHT_PX = 100;
@Before
public void setup() {
+ mDisplayMetrics.widthPixels = SCREEN_WIDTH_PX;
+ mDisplayMetrics.heightPixels = SCREEN_HEIGHT_PX;
+
MockitoAnnotations.initMocks(this);
mTouchHandler = new BouncerSwipeTouchHandler(
+ mDisplayMetrics,
mStatusBarKeyguardViewManager,
- mStatusBar,
+ mCentralSurfaces,
mNotificationShadeWindowController,
mValueAnimatorCreator,
mVelocityTrackerFactory,
mFlingAnimationUtils,
mFlingAnimationUtilsClosing,
TOUCH_REGION);
- when(mStatusBar.getDisplayHeight()).thenReturn(SCREEN_HEIGHT_PX);
+
+ when(mCentralSurfaces.getDisplayHeight()).thenReturn((float) SCREEN_HEIGHT_PX);
when(mValueAnimatorCreator.create(anyFloat(), anyFloat())).thenReturn(mValueAnimator);
when(mVelocityTrackerFactory.obtain()).thenReturn(mVelocityTracker);
}
- private static void beginValidSwipe(GestureDetector.OnGestureListener listener) {
- listener.onDown(MotionEvent.obtain(0, 0,
- MotionEvent.ACTION_DOWN, 0,
- SCREEN_HEIGHT_PX - (.5f * TOUCH_REGION * SCREEN_HEIGHT_PX), 0));
- }
-
/**
* Ensures expansion only happens when touch down happens in valid part of the screen.
*/
- @FlakyTest
@Test
public void testSessionStart() {
+ final Region region = Region.obtain();
+ mTouchHandler.getTouchInitiationRegion(region);
+
+ final Rect bounds = region.getBounds();
+
+ final Rect expected = new Rect();
+
+ expected.set(0, Math.round(SCREEN_HEIGHT_PX * (1 - TOUCH_REGION)), SCREEN_WIDTH_PX,
+ SCREEN_HEIGHT_PX);
+
+ assertThat(bounds).isEqualTo(expected);
+
mTouchHandler.onSessionStart(mTouchSession);
verify(mNotificationShadeWindowController).setForcePluginOpen(eq(true), any());
ArgumentCaptor<InputChannelCompat.InputEventListener> eventListenerCaptor =
@@ -130,34 +142,12 @@
verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture());
verify(mTouchSession).registerInputListener(eventListenerCaptor.capture());
- final Random random = new Random(System.currentTimeMillis());
-
- // If an initial touch down meeting criteria has been met, scroll behavior should be
- // ignored.
- assertThat(gestureListenerCaptor.getValue()
- .onScroll(Mockito.mock(MotionEvent.class),
- Mockito.mock(MotionEvent.class),
- random.nextFloat(),
- random.nextFloat())).isFalse();
-
- // A touch at the top of the screen should also not trigger listening.
- final MotionEvent touchDownEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN,
- 0, 0, 0);
-
- gestureListenerCaptor.getValue().onDown(touchDownEvent);
- assertThat(gestureListenerCaptor.getValue()
- .onScroll(Mockito.mock(MotionEvent.class),
- Mockito.mock(MotionEvent.class),
- random.nextFloat(),
- random.nextFloat())).isFalse();
-
// A touch within range at the bottom of the screen should trigger listening
- beginValidSwipe(gestureListenerCaptor.getValue());
assertThat(gestureListenerCaptor.getValue()
.onScroll(Mockito.mock(MotionEvent.class),
Mockito.mock(MotionEvent.class),
- random.nextFloat(),
- random.nextFloat())).isTrue();
+ 1,
+ 2)).isTrue();
}
/**
@@ -170,8 +160,6 @@
ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture());
- beginValidSwipe(gestureListenerCaptor.getValue());
-
final float scrollAmount = .3f;
final float distanceY = SCREEN_HEIGHT_PX * scrollAmount;
@@ -203,8 +191,6 @@
when(mVelocityTracker.getYVelocity()).thenReturn(velocityY);
- beginValidSwipe(gestureListenerCaptor.getValue());
-
final float distanceY = SCREEN_HEIGHT_PX * position;
final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
index 74b217b..29f56e0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
@@ -21,10 +21,13 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.graphics.Rect;
+import android.graphics.Region;
import android.testing.AndroidTestingRunner;
import android.util.Pair;
import android.view.GestureDetector;
@@ -137,6 +140,81 @@
}
@Test
+ public void testEntryTouchZone() {
+ final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
+ final Rect touchArea = new Rect(4, 4, 8 , 8);
+
+ doAnswer(invocation -> {
+ final Region region = (Region) invocation.getArguments()[0];
+ region.set(touchArea);
+ return null;
+ }).when(touchHandler).getTouchInitiationRegion(any());
+
+ final Environment environment = new Environment(Stream.of(touchHandler)
+ .collect(Collectors.toCollection(HashSet::new)));
+
+ // Ensure touch outside specified region is not delivered.
+ final MotionEvent initialEvent = Mockito.mock(MotionEvent.class);
+ when(initialEvent.getX()).thenReturn(0.0f);
+ when(initialEvent.getY()).thenReturn(1.0f);
+ environment.publishInputEvent(initialEvent);
+ verify(touchHandler, never()).onSessionStart(any());
+
+ // Make sure touch inside region causes session start.
+ when(initialEvent.getX()).thenReturn(5.0f);
+ when(initialEvent.getY()).thenReturn(5.0f);
+ environment.publishInputEvent(initialEvent);
+ verify(touchHandler).onSessionStart(any());
+ }
+
+ @Test
+ public void testSessionCount() {
+ final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
+ final Rect touchArea = new Rect(4, 4, 8 , 8);
+
+ final DreamTouchHandler unzonedTouchHandler = Mockito.mock(DreamTouchHandler.class);
+ doAnswer(invocation -> {
+ final Region region = (Region) invocation.getArguments()[0];
+ region.set(touchArea);
+ return null;
+ }).when(touchHandler).getTouchInitiationRegion(any());
+
+ final Environment environment = new Environment(Stream.of(touchHandler, unzonedTouchHandler)
+ .collect(Collectors.toCollection(HashSet::new)));
+
+ // Ensure touch outside specified region is delivered to unzoned touch handler.
+ final MotionEvent initialEvent = Mockito.mock(MotionEvent.class);
+ when(initialEvent.getX()).thenReturn(0.0f);
+ when(initialEvent.getY()).thenReturn(1.0f);
+ environment.publishInputEvent(initialEvent);
+
+ ArgumentCaptor<DreamTouchHandler.TouchSession> touchSessionCaptor = ArgumentCaptor.forClass(
+ DreamTouchHandler.TouchSession.class);
+
+ // Make sure only one active session.
+ {
+ verify(unzonedTouchHandler).onSessionStart(touchSessionCaptor.capture());
+ final DreamTouchHandler.TouchSession touchSession = touchSessionCaptor.getValue();
+ assertThat(touchSession.getActiveSessionCount()).isEqualTo(1);
+ touchSession.pop();
+ environment.executeAll();
+ }
+
+ // Make sure touch inside the touch region.
+ when(initialEvent.getX()).thenReturn(5.0f);
+ when(initialEvent.getY()).thenReturn(5.0f);
+ environment.publishInputEvent(initialEvent);
+
+ // Make sure there are two active sessions.
+ {
+ verify(touchHandler).onSessionStart(touchSessionCaptor.capture());
+ final DreamTouchHandler.TouchSession touchSession = touchSessionCaptor.getValue();
+ assertThat(touchSession.getActiveSessionCount()).isEqualTo(2);
+ touchSession.pop();
+ }
+ }
+
+ @Test
public void testInputEventPropagation() {
final DreamTouchHandler touchHandler = Mockito.mock(DreamTouchHandler.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
index 953be7d..6fead9e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
@@ -60,7 +60,7 @@
import com.android.systemui.settings.UserContextProvider;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager;
@@ -113,7 +113,7 @@
@Mock private Handler mHandler;
@Mock private UserContextProvider mUserContextProvider;
@Mock private VibratorHelper mVibratorHelper;
- @Mock private StatusBar mStatusBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock private DialogLaunchAnimator mDialogLaunchAnimator;
@@ -158,7 +158,7 @@
mRingerModeTracker,
mHandler,
mPackageManager,
- Optional.of(mStatusBar),
+ Optional.of(mCentralSurfaces),
mKeyguardUpdateMonitor,
mDialogLaunchAnimator);
mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();
@@ -227,7 +227,7 @@
doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems();
doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any());
doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any());
- doReturn(true).when(mStatusBar).isKeyguardShowing();
+ doReturn(true).when(mCentralSurfaces).isKeyguardShowing();
String[] actions = {
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_LOCKDOWN,
@@ -242,7 +242,7 @@
MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0);
gestureListener.onFling(start, end, 0, 1000);
verifyLogPosted(GlobalActionsDialogLite.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE);
- verify(mStatusBar).animateExpandSettingsPanel(null);
+ verify(mCentralSurfaces).animateExpandSettingsPanel(null);
}
@Test
@@ -251,7 +251,7 @@
doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems();
doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any());
doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any());
- doReturn(false).when(mStatusBar).isKeyguardShowing();
+ doReturn(false).when(mCentralSurfaces).isKeyguardShowing();
String[] actions = {
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_LOCKDOWN,
@@ -266,7 +266,7 @@
MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0);
gestureListener.onFling(start, end, 0, 1000);
verifyLogPosted(GlobalActionsDialogLite.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE);
- verify(mStatusBar).animateExpandNotificationsPanel();
+ verify(mCentralSurfaces).animateExpandNotificationsPanel();
}
@Test
@@ -432,7 +432,7 @@
doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems();
doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any());
doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any());
- doReturn(false).when(mStatusBar).isKeyguardShowing();
+ doReturn(false).when(mCentralSurfaces).isKeyguardShowing();
String[] actions = {
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialogLite.GLOBAL_ACTION_KEY_LOCKDOWN,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
index 28de176..809b890 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttChipControllerCommonTest.kt
@@ -18,6 +18,7 @@
import android.content.Context
import android.graphics.drawable.Drawable
+import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
@@ -30,7 +31,10 @@
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.capture
import com.android.systemui.util.time.FakeSystemClock
+import com.android.systemui.util.view.ViewUtil
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -39,6 +43,7 @@
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
@SmallTest
@@ -52,6 +57,8 @@
@Mock
private lateinit var windowManager: WindowManager
@Mock
+ private lateinit var viewUtil: ViewUtil
+ @Mock
private lateinit var tapGestureDetector: TapGestureDetector
@Before
@@ -62,7 +69,7 @@
fakeExecutor = FakeExecutor(fakeClock)
controllerCommon = TestControllerCommon(
- context, windowManager, fakeExecutor, tapGestureDetector
+ context, windowManager, viewUtil, fakeExecutor, tapGestureDetector
)
}
@@ -169,6 +176,40 @@
.isEqualTo(state.getAppName(context))
}
+ @Test
+ fun tapGestureDetected_outsideViewBounds_viewHidden() {
+ controllerCommon.displayChip(getState())
+ whenever(viewUtil.touchIsWithinView(any(), any(), any())).thenReturn(false)
+ val gestureCallbackCaptor = argumentCaptor<(MotionEvent) -> Unit>()
+ verify(tapGestureDetector).addOnGestureDetectedCallback(
+ any(), capture(gestureCallbackCaptor)
+ )
+ val callback = gestureCallbackCaptor.value!!
+
+ callback.invoke(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
+ )
+
+ verify(windowManager).removeView(any())
+ }
+
+ @Test
+ fun tapGestureDetected_insideViewBounds_viewNotHidden() {
+ controllerCommon.displayChip(getState())
+ whenever(viewUtil.touchIsWithinView(any(), any(), any())).thenReturn(true)
+ val gestureCallbackCaptor = argumentCaptor<(MotionEvent) -> Unit>()
+ verify(tapGestureDetector).addOnGestureDetectedCallback(
+ any(), capture(gestureCallbackCaptor)
+ )
+ val callback = gestureCallbackCaptor.value!!
+
+ callback.invoke(
+ MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
+ )
+
+ verify(windowManager, never()).removeView(any())
+ }
+
private fun getState() = MediaTttChipState(PACKAGE_NAME)
private fun getChipView(): ViewGroup {
@@ -182,10 +223,11 @@
inner class TestControllerCommon(
context: Context,
windowManager: WindowManager,
+ viewUtil: ViewUtil,
@Main mainExecutor: DelayableExecutor,
tapGestureDetector: TapGestureDetector,
) : MediaTttChipControllerCommon<MediaTttChipState>(
- context, windowManager, mainExecutor, tapGestureDetector, R.layout.media_ttt_chip
+ context, windowManager, viewUtil, mainExecutor, tapGestureDetector, R.layout.media_ttt_chip
) {
override fun updateChipView(chipState: MediaTttChipState, currentChipView: ViewGroup) {
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
index e5f4df6..86d4c1b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
@@ -37,6 +37,7 @@
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
+import com.android.systemui.util.view.ViewUtil
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -61,6 +62,8 @@
@Mock
private lateinit var windowManager: WindowManager
@Mock
+ private lateinit var viewUtil: ViewUtil
+ @Mock
private lateinit var commandQueue: CommandQueue
private lateinit var commandQueueCallback: CommandQueue.Callbacks
private lateinit var fakeAppIconDrawable: Drawable
@@ -81,6 +84,7 @@
commandQueue,
context,
windowManager,
+ viewUtil,
FakeExecutor(FakeSystemClock()),
TapGestureDetector(context),
Handler.getMain(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
index e5ba3f3..88888f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttChipControllerSenderTest.kt
@@ -38,6 +38,8 @@
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
+import com.android.systemui.util.view.ViewUtil
+
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -62,6 +64,8 @@
@Mock
private lateinit var windowManager: WindowManager
@Mock
+ private lateinit var viewUtil: ViewUtil
+ @Mock
private lateinit var commandQueue: CommandQueue
private lateinit var commandQueueCallback: CommandQueue.Callbacks
private lateinit var fakeAppIconDrawable: Drawable
@@ -82,6 +86,7 @@
commandQueue,
context,
windowManager,
+ viewUtil,
FakeExecutor(FakeSystemClock()),
TapGestureDetector(context)
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
index 3a95ed3..634d9e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
@@ -37,8 +37,7 @@
import com.android.systemui.dump.DumpManager;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import org.junit.Before;
import org.junit.Test;
@@ -91,7 +90,7 @@
mNavBarHelper = new NavBarHelper(mContext, mAccessibilityManager,
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
- () -> Optional.of(mock(StatusBar.class)),
+ () -> Optional.of(mock(CentralSurfaces.class)),
mNavigationModeController, mUserTracker, mDumpManager);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index 48d3857..eb1e1a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -28,6 +28,7 @@
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS;
import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -93,13 +94,11 @@
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.wm.shell.back.BackAnimation;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import org.junit.After;
@@ -161,7 +160,7 @@
@Mock
private AssistManager mAssistManager;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Rule
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
@@ -190,7 +189,7 @@
mock(AccessibilityButtonModeObserver.class),
mock(AccessibilityButtonTargetsObserver.class),
mSystemActions, mOverviewProxyService,
- () -> mock(AssistManager.class), () -> Optional.of(mStatusBar),
+ () -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
mock(NavigationModeController.class), mock(UserTracker.class),
mock(DumpManager.class)));
mNavigationBar = createNavBar(mContext);
@@ -283,7 +282,7 @@
NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class);
WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
- doReturn(mockShadeWindowView).when(mStatusBar).getNotificationShadeWindowView();
+ doReturn(mockShadeWindowView).when(mCentralSurfaces).getNotificationShadeWindowView();
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(defaultNavBar).checkNavBarModes();
doNothing().when(externalNavBar).checkNavBarModes();
@@ -319,7 +318,7 @@
@Test
public void testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange() {
NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class);
- doReturn(mockShadeWindowView).when(mStatusBar).getNotificationShadeWindowView();
+ doReturn(mockShadeWindowView).when(mCentralSurfaces).getNotificationShadeWindowView();
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(mNavigationBar).checkNavBarModes();
mNavigationBar.createView(null, /* initialVisibility= */ true);
@@ -336,7 +335,7 @@
// Verify navbar didn't alter and showing back icon when the keyguard is showing without
// requesting IME insets visible.
- doReturn(true).when(mStatusBar).isKeyguardShowing();
+ doReturn(true).when(mCentralSurfaces).isKeyguardShowing();
mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
@@ -401,9 +400,8 @@
mBroadcastDispatcher,
mCommandQueue,
Optional.of(mock(Pip.class)),
- Optional.of(mock(LegacySplitScreen.class)),
Optional.of(mock(Recents.class)),
- () -> Optional.of(mStatusBar),
+ () -> Optional.of(mCentralSurfaces),
mock(ShadeController.class),
mock(NotificationRemoteInputManager.class),
mock(NotificationShadeDepthController.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
index 721809c..373770e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
@@ -48,7 +48,7 @@
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.power.PowerUI.WarningsUI;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import org.junit.Before;
import org.junit.Test;
@@ -89,14 +89,14 @@
private IThermalEventListener mSkinThermalEventListener;
@Mock private BroadcastDispatcher mBroadcastDispatcher;
@Mock private CommandQueue mCommandQueue;
- @Mock private Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
- @Mock private StatusBar mStatusBar;
+ @Mock private Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- when(mStatusBarOptionalLazy.get()).thenReturn(Optional.of(mStatusBar));
+ when(mCentralSurfacesOptionalLazy.get()).thenReturn(Optional.of(mCentralSurfaces));
createPowerUi();
mSkinThermalEventListener = mPowerUI.new SkinThermalEventListener();
@@ -685,7 +685,7 @@
private void createPowerUi() {
mPowerUI = new PowerUI(
- mContext, mBroadcastDispatcher, mCommandQueue, mStatusBarOptionalLazy,
+ mContext, mBroadcastDispatcher, mCommandQueue, mCentralSurfacesOptionalLazy,
mMockWarnings, mEnhancedEstimates, mPowerManager);
mPowerUI.mThermalService = mThermalServiceMock;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
index f736f26..7b17c36 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/FooterActionsControllerTest.kt
@@ -33,12 +33,15 @@
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.Mock
import org.mockito.Mockito
+import org.mockito.Mockito.never
+import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
+import javax.inject.Provider
import org.mockito.Mockito.`when` as whenever
@SmallTest
-@TestableLooper.RunWithLooper
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
@RunWith(AndroidTestingRunner::class)
class FooterActionsControllerTest : LeakCheckedTest() {
@Mock
@@ -56,6 +59,8 @@
@Mock
private lateinit var multiUserSwitchController: MultiUserSwitchController
@Mock
+ private lateinit var globalActionsDialogProvider: Provider<GlobalActionsDialogLite>
+ @Mock
private lateinit var globalActionsDialog: GlobalActionsDialogLite
@Mock
private lateinit var uiEventLogger: UiEventLogger
@@ -83,15 +88,11 @@
whenever(multiUserSwitchControllerFactory.create(any()))
.thenReturn(multiUserSwitchController)
whenever(featureFlags.isEnabled(Flags.NEW_FOOTER)).thenReturn(false)
+ whenever(globalActionsDialogProvider.get()).thenReturn(globalActionsDialog)
- view = LayoutInflater.from(context)
- .inflate(R.layout.footer_actions, null) as FooterActionsView
+ view = inflateView()
- controller = FooterActionsController(view, multiUserSwitchControllerFactory,
- activityStarter, userManager, userTracker, userInfoController,
- deviceProvisionedController, securityFooterController, fgsManagerController,
- falsingManager, metricsLogger, globalActionsDialog, uiEventLogger,
- showPMLiteButton = true, fakeSettings, Handler(testableLooper.looper), featureFlags)
+ controller = constructFooterActionsController(view)
controller.init()
ViewUtils.attachView(view)
// View looper is the testable looper associated with the test
@@ -177,4 +178,36 @@
assertThat(multiUserSwitch.visibility).isNotEqualTo(View.VISIBLE)
}
+
+ @Test
+ fun testCleanUpGAD() {
+ reset(globalActionsDialogProvider)
+ whenever(globalActionsDialogProvider.get()).thenReturn(globalActionsDialog)
+ val view = inflateView()
+ controller = constructFooterActionsController(view)
+ controller.init()
+ verify(globalActionsDialogProvider, never()).get()
+
+ // GAD is constructed during attachment
+ ViewUtils.attachView(view)
+ testableLooper.processAllMessages()
+ verify(globalActionsDialogProvider).get()
+
+ ViewUtils.detachView(view)
+ testableLooper.processAllMessages()
+ verify(globalActionsDialog).destroy()
+ }
+
+ private fun inflateView(): FooterActionsView {
+ return LayoutInflater.from(context)
+ .inflate(R.layout.footer_actions, null) as FooterActionsView
+ }
+
+ private fun constructFooterActionsController(view: FooterActionsView): FooterActionsController {
+ return FooterActionsController(view, multiUserSwitchControllerFactory,
+ activityStarter, userManager, userTracker, userInfoController,
+ deviceProvisionedController, securityFooterController, fgsManagerController,
+ falsingManager, metricsLogger, globalActionsDialogProvider, uiEventLogger,
+ showPMLiteButton = true, fakeSettings, Handler(testableLooper.looper), featureFlags)
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 4ab3926..534c7e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -56,7 +56,7 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -142,7 +142,7 @@
mock(QSFactoryImpl.class), new Handler(), Looper.myLooper(),
mock(PluginManager.class), mock(TunerService.class),
() -> mock(AutoTileManager.class), mock(DumpManager.class),
- mock(BroadcastDispatcher.class), Optional.of(mock(StatusBar.class)),
+ mock(BroadcastDispatcher.class), Optional.of(mock(CentralSurfaces.class)),
mock(QSLogger.class), mock(UiEventLogger.class), mock(UserTracker.class),
mock(SecureSettings.class), mock(CustomTileStatePersister.class),
mTileServiceRequestControllerBuilder, mock(TileLifecycleManager.Factory.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt
new file mode 100644
index 0000000..ac1e86f
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt
@@ -0,0 +1,136 @@
+package com.android.systemui.qs
+
+import android.test.suitebuilder.annotation.SmallTest
+import android.testing.AndroidTestingRunner
+import com.android.internal.logging.MetricsLogger
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.media.MediaFlags
+import com.android.systemui.media.MediaHost
+import com.android.systemui.media.MediaHostState
+import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.qs.customize.QSCustomizerController
+import com.android.systemui.qs.logging.QSLogger
+import com.android.systemui.settings.brightness.BrightnessController
+import com.android.systemui.settings.brightness.BrightnessSliderController
+import com.android.systemui.tuner.TunerService
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.any
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class QSPanelControllerTest : SysuiTestCase() {
+
+ @Mock private lateinit var qsPanel: QSPanel
+ @Mock private lateinit var qsFgsManagerFooter: QSFgsManagerFooter
+ @Mock private lateinit var qsSecurityFooter: QSSecurityFooter
+ @Mock private lateinit var tunerService: TunerService
+ @Mock private lateinit var qsTileHost: QSTileHost
+ @Mock private lateinit var qsCustomizerController: QSCustomizerController
+ @Mock private lateinit var qsTileRevealControllerFactory: QSTileRevealController.Factory
+ @Mock private lateinit var dumpManager: DumpManager
+ @Mock private lateinit var metricsLogger: MetricsLogger
+ @Mock private lateinit var uiEventLogger: UiEventLogger
+ @Mock private lateinit var qsLogger: QSLogger
+ @Mock private lateinit var brightnessControllerFactory: BrightnessController.Factory
+ @Mock private lateinit var brightnessController: BrightnessController
+ @Mock private lateinit var brightnessSlider: BrightnessSliderController
+ @Mock private lateinit var brightnessSliderFactory: BrightnessSliderController.Factory
+ @Mock private lateinit var falsingManager: FalsingManager
+ @Mock private lateinit var featureFlags: FeatureFlags
+ @Mock private lateinit var mediaFlags: MediaFlags
+ @Mock private lateinit var mediaHost: MediaHost
+
+ private lateinit var controller: QSPanelController
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ whenever(brightnessSliderFactory.create(any(), any())).thenReturn(brightnessSlider)
+ whenever(brightnessControllerFactory.create(any())).thenReturn(brightnessController)
+ whenever(qsPanel.resources).thenReturn(mContext.orCreateTestableResources.resources)
+
+ controller = QSPanelController(
+ qsPanel,
+ qsFgsManagerFooter,
+ qsSecurityFooter,
+ tunerService,
+ qsTileHost,
+ qsCustomizerController,
+ /* usingMediaPlayer= */ true,
+ mediaHost,
+ qsTileRevealControllerFactory,
+ dumpManager,
+ metricsLogger,
+ uiEventLogger,
+ qsLogger,
+ brightnessControllerFactory,
+ brightnessSliderFactory,
+ falsingManager,
+ featureFlags,
+ mediaFlags
+ )
+ }
+
+ @After
+ fun tearDown() {
+ reset(mediaHost)
+ }
+
+ @Test
+ fun onInit_notSplitShade_newMediaLayoutAvailable_setsMediaAsExpanded() {
+ setSplitShadeEnabled(false)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(true)
+
+ controller.onInit()
+
+ verify(mediaHost).expansion = MediaHostState.EXPANDED
+ }
+
+ @Test
+ fun onInit_notSplitShade_newMediaLayoutNotAvailable_setsMediaAsExpanded() {
+ setSplitShadeEnabled(false)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)
+
+ controller.onInit()
+
+ verify(mediaHost).expansion = MediaHostState.EXPANDED
+ }
+
+ @Test
+ fun onInit_inSplitShade_newMediaLayoutAvailable_setsMediaAsExpanded() {
+ setSplitShadeEnabled(true)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(true)
+
+ controller.onInit()
+
+ verify(mediaHost).expansion = MediaHostState.EXPANDED
+ }
+
+ @Test
+ fun onInit_inSplitShade_newMediaLayoutNotAvailable_setsMediaAsCollapsed() {
+ setSplitShadeEnabled(true)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)
+
+ controller.onInit()
+
+ verify(mediaHost).expansion = MediaHostState.COLLAPSED
+ }
+
+ private fun setSplitShadeEnabled(enabled: Boolean) {
+ mContext.orCreateTestableResources
+ .addOverride(R.bool.config_use_split_notification_shade, enabled)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 8872e28..e67d37ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -65,7 +65,7 @@
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.phone.AutoTileManager;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.settings.FakeSettings;
@@ -112,7 +112,7 @@
@Mock
private QSTile.State mMockState;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private QSLogger mQSLogger;
@Mock
@@ -152,7 +152,7 @@
QSTileHost.TILES_SETTING, "", "", false, mUserTracker.getUserId(), false);
mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler,
mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager,
- mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker,
+ mBroadcastDispatcher, mCentralSurfaces, mQSLogger, mUiEventLogger, mUserTracker,
mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder,
mTileLifecycleManagerFactory);
setUpTileFactory();
@@ -437,15 +437,15 @@
QSFactory defaultFactory, Handler mainHandler, Looper bgLooper,
PluginManager pluginManager, TunerService tunerService,
Provider<AutoTileManager> autoTiles, DumpManager dumpManager,
- BroadcastDispatcher broadcastDispatcher, StatusBar statusBar, QSLogger qsLogger,
- UiEventLogger uiEventLogger, UserTracker userTracker,
+ BroadcastDispatcher broadcastDispatcher, CentralSurfaces centralSurfaces,
+ QSLogger qsLogger, UiEventLogger uiEventLogger, UserTracker userTracker,
SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister,
TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
TileLifecycleManager.Factory tileLifecycleManagerFactory) {
super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
tunerService, autoTiles, dumpManager, broadcastDispatcher,
- Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings,
- customTileStatePersister, tileServiceRequestControllerBuilder,
+ Optional.of(centralSurfaces), qsLogger, uiEventLogger, userTracker,
+ secureSettings, customTileStatePersister, tileServiceRequestControllerBuilder,
tileLifecycleManagerFactory);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index e39d6a1..19a9863 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -50,7 +50,7 @@
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.phone.AutoTileManager;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -91,7 +91,7 @@
@Mock
private DumpManager mDumpManager;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private QSLogger mQSLogger;
@Mock
@@ -132,7 +132,7 @@
() -> mAutoTileManager,
mDumpManager,
mock(BroadcastDispatcher.class),
- Optional.of(mStatusBar),
+ Optional.of(mCentralSurfaces),
mQSLogger,
mUiEventLogger,
mUserTracker,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java
index bfe875c..7ab49584f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java
@@ -19,7 +19,7 @@
import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_SHARE;
import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID;
import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED;
-import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT;
+import static com.android.systemui.statusbar.phone.CentralSurfaces.SYSTEM_DIALOG_REASON_SCREENSHOT;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -41,7 +41,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import org.junit.Before;
import org.junit.Test;
@@ -59,7 +59,7 @@
public class ActionProxyReceiverTest extends SysuiTestCase {
@Mock
- private StatusBar mMockStatusBar;
+ private CentralSurfaces mMockCentralSurfaces;
@Mock
private ActivityManagerWrapper mMockActivityManagerWrapper;
@Mock
@@ -83,7 +83,7 @@
actionProxyReceiver.onReceive(mContext, mIntent);
verify(mMockActivityManagerWrapper).closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT);
- verify(mMockStatusBar, never()).executeRunnableDismissingKeyguard(
+ verify(mMockCentralSurfaces, never()).executeRunnableDismissingKeyguard(
any(Runnable.class), any(Runnable.class), anyBoolean(), anyBoolean(), anyBoolean());
verify(mMockPendingIntent).send(
eq(mContext), anyInt(), isNull(), isNull(), isNull(), isNull(), any(Bundle.class));
@@ -96,13 +96,13 @@
doAnswer((Answer<Object>) invocation -> {
((Runnable) invocation.getArgument(0)).run();
return null;
- }).when(mMockStatusBar).executeRunnableDismissingKeyguard(
+ }).when(mMockCentralSurfaces).executeRunnableDismissingKeyguard(
any(Runnable.class), isNull(), anyBoolean(), anyBoolean(), anyBoolean());
actionProxyReceiver.onReceive(mContext, mIntent);
verify(mMockActivityManagerWrapper).closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT);
- verify(mMockStatusBar).executeRunnableDismissingKeyguard(
+ verify(mMockCentralSurfaces).executeRunnableDismissingKeyguard(
any(Runnable.class), isNull(), eq(true), eq(true), eq(true));
verify(mMockPendingIntent).send(
eq(mContext), anyInt(), isNull(), isNull(), isNull(), isNull(), any(Bundle.class));
@@ -135,7 +135,7 @@
private ActionProxyReceiver constructActionProxyReceiver(boolean withStatusBar) {
if (withStatusBar) {
return new ActionProxyReceiver(
- Optional.of(mMockStatusBar), mMockActivityManagerWrapper,
+ Optional.of(mMockCentralSurfaces), mMockActivityManagerWrapper,
mMockScreenshotSmartActions);
} else {
return new ActionProxyReceiver(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
index 75ccd8f..25a5b90 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
@@ -22,7 +22,7 @@
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController
-import com.android.systemui.statusbar.phone.StatusBar
+import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.FakeConfigurationController
import org.junit.After
import org.junit.Assert.assertFalse
@@ -72,7 +72,7 @@
@Mock lateinit var depthController: NotificationShadeDepthController
@Mock lateinit var stackscroller: NotificationStackScrollLayout
@Mock lateinit var expandHelperCallback: ExpandHelper.Callback
- @Mock lateinit var statusbar: StatusBar
+ @Mock lateinit var mCentralSurfaces: CentralSurfaces
@Mock lateinit var qS: QS
@JvmField @Rule val mockito = MockitoJUnit.rule()
@@ -106,7 +106,7 @@
whenever(nsslController.view).thenReturn(stackscroller)
whenever(nsslController.expandHelperCallback).thenReturn(expandHelperCallback)
transitionController.notificationPanelController = notificationPanelController
- transitionController.statusbar = statusbar
+ transitionController.centralSurfaces = mCentralSurfaces
transitionController.qS = qS
transitionController.setStackScroller(nsslController)
whenever(statusbarStateController.state).thenReturn(StatusBarState.KEYGUARD)
@@ -118,7 +118,7 @@
whenever(lockScreenUserManager.isLockscreenPublicMode(anyInt())).thenReturn(true)
whenever(falsingCollector.shouldEnforceBouncer()).thenReturn(false)
whenever(keyguardBypassController.bypassEnabled).thenReturn(false)
- clearInvocations(statusbar)
+ clearInvocations(mCentralSurfaces)
}
@After
@@ -175,7 +175,7 @@
@Test
fun testDontGoWhenShadeDisabled() {
- whenever(statusbar.isShadeDisabled).thenReturn(true)
+ whenever(mCentralSurfaces.isShadeDisabled).thenReturn(true)
transitionController.goToLockedShade(null)
verify(statusbarStateController, never()).setState(anyInt())
}
@@ -194,7 +194,7 @@
transitionController.goToLockedShade(null)
verify(statusbarStateController, never()).setState(anyInt())
verify(statusbarStateController).setLeaveOpenOnKeyguardHide(true)
- verify(statusbar).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject())
+ verify(mCentralSurfaces).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject())
}
@Test
@@ -203,7 +203,7 @@
transitionController.goToLockedShade(null)
verify(statusbarStateController, never()).setState(anyInt())
verify(statusbarStateController).setLeaveOpenOnKeyguardHide(true)
- verify(statusbar).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject())
+ verify(mCentralSurfaces).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject())
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
index 4213b07..a4ce9cd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
@@ -47,8 +47,8 @@
/**
* Verifies that particular sets of dependencies don't have dependencies on others. For example,
- * code managing notifications shouldn't directly depend on StatusBar, since there are platforms
- * which want to manage notifications, but don't use StatusBar.
+ * code managing notifications shouldn't directly depend on CentralSurfaces, since there are
+ * platforms which want to manage notifications, but don't use CentralSurfaces.
*/
@SmallTest
@RunWith(AndroidTestingRunner.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index bd9f91f..2691ff9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -49,7 +49,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.google.android.collect.Sets;
@@ -105,7 +105,7 @@
mVisibilityProvider,
mEntryManager,
mock(RemoteInputNotificationRebuilder.class),
- () -> Optional.of(mock(StatusBar.class)),
+ () -> Optional.of(mock(CentralSurfaces.class)),
mStateController,
Handler.createAsync(Looper.myLooper()),
mRemoteInputUriController,
@@ -196,7 +196,7 @@
NotificationVisibilityProvider visibilityProvider,
NotificationEntryManager notificationEntryManager,
RemoteInputNotificationRebuilder rebuilder,
- Lazy<Optional<StatusBar>> statusBarOptionalLazy,
+ Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
StatusBarStateController statusBarStateController,
Handler mainHandler,
RemoteInputUriController remoteInputUriController,
@@ -211,7 +211,7 @@
visibilityProvider,
notificationEntryManager,
rebuilder,
- statusBarOptionalLazy,
+ centralSurfacesOptionalLazy,
statusBarStateController,
mainHandler,
remoteInputUriController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
index 7fafb24..407044b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
@@ -54,7 +54,6 @@
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
-import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -121,7 +120,6 @@
mock(KeyguardBypassController.class),
Optional.of(mock(Bubbles.class)),
mock(DynamicPrivacyController.class),
- mock(ForegroundServiceSectionController.class),
mock(DynamicChildBindController.class),
mock(LowPriorityInflationHelper.class),
mock(AssistantFeedbackController.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
index e0689f3..3500e4d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
@@ -45,7 +45,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import org.junit.Before;
@@ -103,7 +103,7 @@
mVisibilityProvider,
mNotificationEntryManager,
new RemoteInputNotificationRebuilder(mContext),
- () -> Optional.of(mock(StatusBar.class)),
+ () -> Optional.of(mock(CentralSurfaces.class)),
mStatusBarStateController,
Handler.createAsync(Looper.myLooper()),
mRemoteInputUriController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt
index c038903..ea06647 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/gesture/GenericGestureDetectorTest.kt
@@ -111,7 +111,7 @@
override fun onInputEvent(ev: InputEvent) {
if (ev is MotionEvent && ev.x == CORRECT_X) {
- onGestureDetected()
+ onGestureDetected(ev)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index f2b7bf5..0fff5f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -201,7 +201,6 @@
() -> mNotificationRowBinder,
() -> mRemoteInputManager,
mLeakDetector,
- mock(ForegroundServiceDismissalFeatureController.class),
mock(IStatusBarService.class),
NotifLiveDataStoreMocksKt.createNotifLiveDataStoreImplMock(),
mock(DumpManager.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
index 52189e4..7fc5ece 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
@@ -61,7 +61,6 @@
import com.android.systemui.statusbar.SbnBuilder;
import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.notification.ConversationNotificationProcessor;
-import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationClicker;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
@@ -191,7 +190,6 @@
() -> mRowBinder,
() -> mRemoteInputManager,
mLeakDetector,
- mock(ForegroundServiceDismissalFeatureController.class),
mock(IStatusBarService.class),
NotifLiveDataStoreMocksKt.createNotifLiveDataStoreImplMock(),
mock(DumpManager.class)
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 7d8e0d2..e9d8f58 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
@@ -82,8 +82,8 @@
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.wmshell.BubblesManager;
@@ -124,7 +124,7 @@
@Mock private NotificationInfo.CheckSaveListener mCheckSaveListener;
@Mock private OnSettingsClickListener mOnSettingsClickListener;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
- @Mock private StatusBar mStatusBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private AccessibilityManager mAccessibilityManager;
@Mock private HighPriorityProvider mHighPriorityProvider;
@Mock private INotificationManager mINotificationManager;
@@ -155,7 +155,7 @@
when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false);
mGutsManager = new NotificationGutsManager(mContext,
- () -> Optional.of(mStatusBar), mHandler, mHandler, mAccessibilityManager,
+ () -> Optional.of(mCentralSurfaces), mHandler, mHandler, mAccessibilityManager,
mHighPriorityProvider, mINotificationManager, mNotificationEntryManager,
mPeopleSpaceWidgetManager, mLauncherApps, mShortcutManager,
mChannelEditorDialogController, mContextTracker, mAssistantFeedbackController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
index c4f954f..1561b5a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
@@ -58,7 +58,6 @@
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
-import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
@@ -68,14 +67,13 @@
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.notification.row.ForegroundServiceDungeonView;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController.NotificationPanelEvent;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -118,7 +116,7 @@
@Mock(answer = Answers.RETURNS_SELF)
private NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
@Mock private NotificationSwipeHelper mNotificationSwipeHelper;
- @Mock private StatusBar mStatusBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private ScrimController mScrimController;
@Mock private NotificationGroupManagerLegacy mLegacyGroupManager;
@Mock private SectionHeaderController mSilentHeaderController;
@@ -129,9 +127,6 @@
@Mock private IStatusBarService mIStatusBarService;
@Mock private UiEventLogger mUiEventLogger;
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
- @Mock private ForegroundServiceDismissalFeatureController mFgFeatureController;
- @Mock private ForegroundServiceSectionController mFgServicesSectionController;
- @Mock private ForegroundServiceDungeonView mForegroundServiceDungeonView;
@Mock private LayoutInflater mLayoutInflater;
@Mock private NotificationRemoteInputManager mRemoteInputManager;
@Mock private VisualStabilityManager mVisualStabilityManager;
@@ -151,8 +146,6 @@
when(mNotificationSwipeHelperBuilder.build()).thenReturn(mNotificationSwipeHelper);
when(mNotifPipelineFlags.isNewPipelineEnabled()).thenReturn(false);
- when(mFgServicesSectionController.createView(mLayoutInflater))
- .thenReturn(mForegroundServiceDungeonView);
mController = new NotificationStackScrollLayoutController(
true,
@@ -175,7 +168,7 @@
new FalsingManagerFake(),
mResources,
mNotificationSwipeHelperBuilder,
- mStatusBar,
+ mCentralSurfaces,
mScrimController,
mLegacyGroupManager,
mLegacyGroupManager,
@@ -187,8 +180,6 @@
mLockscreenShadeTransitionController,
mIStatusBarService,
mUiEventLogger,
- mFgFeatureController,
- mFgServicesSectionController,
mLayoutInflater,
mRemoteInputManager,
mVisualStabilityManager,
@@ -399,22 +390,6 @@
}
@Test
- public void testForegroundDismissEnabled() {
- when(mFgFeatureController.isForegroundServiceDismissalEnabled()).thenReturn(true);
- mController.attach(mNotificationStackScrollLayout);
- verify(mNotificationStackScrollLayout).initializeForegroundServiceSection(
- mForegroundServiceDungeonView);
- }
-
- @Test
- public void testForegroundDismissaDisabled() {
- when(mFgFeatureController.isForegroundServiceDismissalEnabled()).thenReturn(false);
- mController.attach(mNotificationStackScrollLayout);
- verify(mNotificationStackScrollLayout, never()).initializeForegroundServiceSection(
- any(ForegroundServiceDungeonView.class));
- }
-
- @Test
public void testUpdateFooter_remoteInput() {
ArgumentCaptor<RemoteInputController.Callback> callbackCaptor =
ArgumentCaptor.forClass(RemoteInputController.Callback.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index 4f731ed..eafcc35 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -61,9 +61,9 @@
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.FooterView;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import org.junit.Assert;
@@ -89,7 +89,7 @@
private AmbientState mAmbientState;
@Rule public MockitoRule mockito = MockitoJUnit.rule();
- @Mock private StatusBar mBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private SysuiStatusBarStateController mBarState;
@Mock private NotificationGroupManagerLegacy mGroupMembershipManger;
@Mock private NotificationGroupManagerLegacy mGroupExpansionManager;
@@ -141,7 +141,7 @@
mStackScrollerInternal.initView(getContext(), mNotificationSwipeHelper);
mStackScroller = spy(mStackScrollerInternal);
mStackScroller.setShelfController(notificationShelfController);
- mStackScroller.setStatusBar(mBar);
+ mStackScroller.setCentralSurfaces(mCentralSurfaces);
mStackScroller.setEmptyShadeView(mEmptyShadeView);
when(mStackScrollLayoutController.isHistoryEnabled()).thenReturn(true);
when(mStackScrollLayoutController.getNoticationRoundessManager())
@@ -149,7 +149,7 @@
mStackScroller.setController(mStackScrollLayoutController);
// Stub out functionality that isn't necessary to test.
- doNothing().when(mBar)
+ doNothing().when(mCentralSurfaces)
.executeRunnableDismissingKeyguard(any(Runnable.class),
any(Runnable.class),
anyBoolean(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index 2289936..0e12c2a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -52,6 +52,7 @@
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.ReduceBrightColorsController;
import com.android.systemui.qs.SettingObserver;
+import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.DataSaverController;
@@ -85,6 +86,7 @@
private static final String TEST_SETTING_COMPONENT = "setting_component";
private static final String TEST_COMPONENT = "test_pkg/test_cls";
private static final String TEST_CUSTOM_SPEC = "custom(" + TEST_COMPONENT + ")";
+ private static final String TEST_CUSTOM_SAFETY_SPEC = "custom(safety_pkg/safety_cls)";
private static final String SEPARATOR = AutoTileManager.SETTING_SEPARATOR;
private static final int USER = 0;
@@ -121,6 +123,8 @@
);
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.bool.config_nightDisplayAvailable, true);
+ mContext.getOrCreateTestableResources().addOverride(
+ R.string.safety_quick_settings_tile, TEST_CUSTOM_SAFETY_SPEC);
when(mAutoAddTrackerBuilder.build()).thenReturn(mAutoAddTracker);
when(mQsTileHost.getUserContext()).thenReturn(mUserContext);
@@ -435,6 +439,25 @@
}
@Test
+ public void testSafetyTileNotAdded_ifPreviouslyAdded() {
+ ComponentName safetyComponent = CustomTile.getComponentFromSpec(TEST_CUSTOM_SAFETY_SPEC);
+ mAutoTileManager.init();
+ verify(mQsTileHost, times(1)).addTile(safetyComponent, true);
+ when(mAutoAddTracker.isAdded(TEST_CUSTOM_SAFETY_SPEC)).thenReturn(true);
+ mAutoTileManager.init();
+ verify(mQsTileHost, times(1)).addTile(safetyComponent, true);
+ }
+
+ @Test
+ public void testSafetyTileAdded_onUserChange() {
+ ComponentName safetyComponent = CustomTile.getComponentFromSpec(TEST_CUSTOM_SAFETY_SPEC);
+ mAutoTileManager.init();
+ verify(mQsTileHost, times(1)).addTile(safetyComponent, true);
+ when(mAutoAddTracker.isAdded(TEST_CUSTOM_SAFETY_SPEC)).thenReturn(false);
+ mAutoTileManager.changeUser(UserHandle.of(USER + 1));
+ verify(mQsTileHost, times(2)).addTile(safetyComponent, true);
+ }
+ @Test
public void testEmptyArray_doesNotCrash() {
mContext.getOrCreateTestableResources().addOverride(
R.array.config_quickSettingsAutoAdd, new String[0]);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
similarity index 86%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacksTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
index aabf923..9bfb2c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacksTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
@@ -45,7 +45,6 @@
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import org.junit.Before;
import org.junit.Test;
@@ -58,12 +57,11 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
-public class StatusBarCommandQueueCallbacksTest extends SysuiTestCase {
- @Mock private StatusBar mStatusBar;
+public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase {
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private ShadeController mShadeController;
@Mock private CommandQueue mCommandQueue;
@Mock private NotificationPanelViewController mNotificationPanelViewController;
- @Mock private LegacySplitScreen mLegacySplitScreen;
@Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
private final MetricsLogger mMetricsLogger = new FakeMetricsLogger();
@Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -83,20 +81,19 @@
@Mock private LightBarController mLightBarController;
@Mock private StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;
- StatusBarCommandQueueCallbacks mSbcqCallbacks;
+ CentralSurfacesCommandQueueCallbacks mSbcqCallbacks;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mSbcqCallbacks = new StatusBarCommandQueueCallbacks(
- mStatusBar,
+ mSbcqCallbacks = new CentralSurfacesCommandQueueCallbacks(
+ mCentralSurfaces,
mContext,
mContext.getResources(),
mShadeController,
mCommandQueue,
mNotificationPanelViewController,
- Optional.of(mLegacySplitScreen),
mRemoteInputQuickSettingsDisabler,
mMetricsLogger,
mKeyguardUpdateMonitor,
@@ -125,13 +122,13 @@
@Test
public void testDisableNotificationShade() {
- when(mStatusBar.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE);
- when(mStatusBar.getDisabled2()).thenReturn(StatusBarManager.DISABLE_NONE);
+ when(mCentralSurfaces.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE);
+ when(mCentralSurfaces.getDisabled2()).thenReturn(StatusBarManager.DISABLE_NONE);
when(mCommandQueue.panelsEnabled()).thenReturn(false);
mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
StatusBarManager.DISABLE2_NOTIFICATION_SHADE, false);
- verify(mStatusBar).updateQsExpansionEnabled();
+ verify(mCentralSurfaces).updateQsExpansionEnabled();
verify(mShadeController).animateCollapsePanels();
// Trying to open it does nothing.
@@ -143,12 +140,13 @@
@Test
public void testEnableNotificationShade() {
- when(mStatusBar.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE);
- when(mStatusBar.getDisabled2()).thenReturn(StatusBarManager.DISABLE2_NOTIFICATION_SHADE);
+ when(mCentralSurfaces.getDisabled1()).thenReturn(StatusBarManager.DISABLE_NONE);
+ when(mCentralSurfaces.getDisabled2())
+ .thenReturn(StatusBarManager.DISABLE2_NOTIFICATION_SHADE);
when(mCommandQueue.panelsEnabled()).thenReturn(true);
mSbcqCallbacks.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_NONE,
StatusBarManager.DISABLE2_NONE, false);
- verify(mStatusBar).updateQsExpansionEnabled();
+ verify(mCentralSurfaces).updateQsExpansionEnabled();
verify(mShadeController, never()).animateCollapsePanels();
// Can now be opened.
@@ -161,13 +159,13 @@
@Test
public void testSuppressAmbientDisplay_suppress() {
mSbcqCallbacks.suppressAmbientDisplay(true);
- verify(mDozeServiceHost).setDozeSuppressed(true);
+ verify(mDozeServiceHost).setAlwaysOnSuppressed(true);
}
@Test
public void testSuppressAmbientDisplay_unsuppress() {
mSbcqCallbacks.suppressAmbientDisplay(false);
- verify(mDozeServiceHost).setDozeSuppressed(false);
+ verify(mDozeServiceHost).setAlwaysOnSuppressed(false);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesTest.java
similarity index 90%
rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesTest.java
index 8610936..953a330 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesTest.java
@@ -139,7 +139,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
+import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -159,7 +159,6 @@
import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.startingsurface.StartingSurface;
import org.junit.Before;
@@ -178,12 +177,12 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
-public class StatusBarTest extends SysuiTestCase {
+public class CentralSurfacesTest extends SysuiTestCase {
private static final int FOLD_STATE_FOLDED = 0;
private static final int FOLD_STATE_UNFOLDED = 1;
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
private FakeMetricsLogger mMetricsLogger;
private PowerManager mPowerManager;
private TestableNotificationInterruptStateProviderImpl mNotificationInterruptStateProvider;
@@ -253,15 +252,12 @@
@Mock private ViewMediatorCallback mKeyguardVieMediatorCallback;
@Mock private VolumeComponent mVolumeComponent;
@Mock private CommandQueue mCommandQueue;
- @Mock private StatusBarComponent.Factory mStatusBarComponentFactory;
- @Mock private StatusBarComponent mStatusBarComponent;
+ @Mock private CentralSurfacesComponent.Factory mStatusBarComponentFactory;
+ @Mock private CentralSurfacesComponent mCentralSurfacesComponent;
@Mock private PluginManager mPluginManager;
- @Mock private LegacySplitScreen mLegacySplitScreen;
@Mock private ViewMediatorCallback mViewMediatorCallback;
@Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager;
@Mock private ScreenPinningRequest mScreenPinningRequest;
- @Mock private StatusBarNotificationActivityStarter.Builder
- mStatusBarNotificationActivityStarterBuilder;
@Mock private PluginDependencyProvider mPluginDependencyProvider;
@Mock private KeyguardDismissUtil mKeyguardDismissUtil;
@Mock private ExtensionController mExtensionController;
@@ -338,8 +334,6 @@
mContext.setTheme(R.style.Theme_SystemUI_LightWallpaper);
when(mStackScrollerController.getView()).thenReturn(mStackScroller);
- when(mStackScrollerController.getNotificationListContainer()).thenReturn(
- mNotificationListContainer);
when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0));
when(mNotificationPanelViewController.getView()).thenReturn(mNotificationPanelView);
when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
@@ -370,8 +364,8 @@
when(mLockscreenWallpaperLazy.get()).thenReturn(mLockscreenWallpaper);
when(mBiometricUnlockControllerLazy.get()).thenReturn(mBiometricUnlockController);
- when(mStatusBarComponentFactory.create()).thenReturn(mStatusBarComponent);
- when(mStatusBarComponent.getNotificationShadeWindowViewController()).thenReturn(
+ when(mStatusBarComponentFactory.create()).thenReturn(mCentralSurfacesComponent);
+ when(mCentralSurfacesComponent.getNotificationShadeWindowViewController()).thenReturn(
mNotificationShadeWindowViewController);
doAnswer(invocation -> {
((Runnable) invocation.getArgument(0)).run();
@@ -381,12 +375,12 @@
mShadeController = new ShadeControllerImpl(mCommandQueue,
mStatusBarStateController, mNotificationShadeWindowController,
mStatusBarKeyguardViewManager, mContext.getSystemService(WindowManager.class),
- () -> Optional.of(mStatusBar), () -> mAssistManager);
+ () -> Optional.of(mCentralSurfaces), () -> mAssistManager);
when(mOperatorNameViewControllerFactory.create(any()))
.thenReturn(mOperatorNameViewController);
- mStatusBar = new StatusBar(
+ mCentralSurfaces = new CentralSurfaces(
mContext,
mNotificationsController,
mock(FragmentService.class),
@@ -447,8 +441,6 @@
mCommandQueue,
mStatusBarComponentFactory,
mPluginManager,
- Optional.of(mLegacySplitScreen),
- mStatusBarNotificationActivityStarterBuilder,
mShadeController,
mStatusBarKeyguardViewManager,
mViewMediatorCallback,
@@ -483,8 +475,8 @@
mDeviceStateManager,
mDreamOverlayStateController,
mWiredChargingRippleController);
- when(mKeyguardViewMediator.registerStatusBar(
- any(StatusBar.class),
+ when(mKeyguardViewMediator.registerCentralSurfaces(
+ any(CentralSurfaces.class),
any(NotificationPanelViewController.class),
any(PanelExpansionStateManager.class),
any(BiometricUnlockController.class),
@@ -495,23 +487,23 @@
when(mKeyguardViewMediator.getViewMediatorCallback()).thenReturn(
mKeyguardVieMediatorCallback);
- // TODO: we should be able to call mStatusBar.start() and have all the below values
+ // TODO: we should be able to call mCentralSurfaces.start() and have all the below values
// initialized automatically.
- mStatusBar.mNotificationShadeWindowView = mNotificationShadeWindowView;
- mStatusBar.mNotificationPanelViewController = mNotificationPanelViewController;
- mStatusBar.mDozeScrimController = mDozeScrimController;
- mStatusBar.mPresenter = mNotificationPresenter;
- mStatusBar.mKeyguardIndicationController = mKeyguardIndicationController;
- mStatusBar.mBarService = mBarService;
- mStatusBar.mStackScroller = mStackScroller;
- mStatusBar.startKeyguard();
+ mCentralSurfaces.mNotificationShadeWindowView = mNotificationShadeWindowView;
+ mCentralSurfaces.mNotificationPanelViewController = mNotificationPanelViewController;
+ mCentralSurfaces.mDozeScrimController = mDozeScrimController;
+ mCentralSurfaces.mPresenter = mNotificationPresenter;
+ mCentralSurfaces.mKeyguardIndicationController = mKeyguardIndicationController;
+ mCentralSurfaces.mBarService = mBarService;
+ mCentralSurfaces.mStackScroller = mStackScroller;
+ mCentralSurfaces.startKeyguard();
mInitController.executePostInitTasks();
notificationLogger.setUpWithContainer(mNotificationListContainer);
}
@Test
public void testSetBouncerShowing_noCrash() {
- mStatusBar.setBouncerShowing(true);
+ mCentralSurfaces.setBouncerShowing(true);
}
@Test
@@ -519,7 +511,7 @@
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true);
- mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
+ mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, false, false, false);
}
@Test
@@ -527,7 +519,7 @@
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true);
when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
- mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
+ mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, false, false, false);
}
@Test
@@ -535,7 +527,7 @@
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false);
- mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
+ mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, false, false, false);
}
@Test
@@ -547,7 +539,7 @@
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
when(mKeyguardStateController.isMethodSecure()).thenReturn(false);
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
mMetricsLogger.getLogs(),
@@ -566,7 +558,7 @@
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
mMetricsLogger.getLogs(),
@@ -585,7 +577,7 @@
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
when(mKeyguardStateController.isMethodSecure()).thenReturn(false);
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
mMetricsLogger.getLogs(),
@@ -604,7 +596,7 @@
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
mMetricsLogger.getLogs(),
@@ -623,7 +615,7 @@
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
when(mKeyguardStateController.isMethodSecure()).thenReturn(true);
- mStatusBar.onKeyguardViewManagerStatesUpdated();
+ mCentralSurfaces.onKeyguardViewManagerStatesUpdated();
MetricsAsserts.assertHasLog("missing bouncer log",
mMetricsLogger.getLogs(),
@@ -724,7 +716,7 @@
@Test
public void testLogHidden() {
try {
- mStatusBar.handleVisibleToUserChanged(false);
+ mCentralSurfaces.handleVisibleToUserChanged(false);
mUiBgExecutor.runAllReady();
verify(mBarService, times(1)).onPanelHidden();
verify(mBarService, never()).onPanelRevealed(anyBoolean(), anyInt());
@@ -739,10 +731,10 @@
when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
when(mNotificationsController.getActiveNotificationsCount()).thenReturn(5);
when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(true);
- mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.SHADE);
try {
- mStatusBar.handleVisibleToUserChanged(true);
+ mCentralSurfaces.handleVisibleToUserChanged(true);
mUiBgExecutor.runAllReady();
verify(mBarService, never()).onPanelHidden();
verify(mBarService, times(1)).onPanelRevealed(false, 1);
@@ -758,10 +750,10 @@
when(mNotificationsController.getActiveNotificationsCount()).thenReturn(5);
when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
- mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.SHADE);
try {
- mStatusBar.handleVisibleToUserChanged(true);
+ mCentralSurfaces.handleVisibleToUserChanged(true);
mUiBgExecutor.runAllReady();
verify(mBarService, never()).onPanelHidden();
verify(mBarService, times(1)).onPanelRevealed(true, 5);
@@ -776,10 +768,10 @@
when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(false);
when(mNotificationsController.getActiveNotificationsCount()).thenReturn(5);
when(mNotificationPresenter.isPresenterFullyCollapsed()).thenReturn(false);
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
try {
- mStatusBar.handleVisibleToUserChanged(true);
+ mCentralSurfaces.handleVisibleToUserChanged(true);
mUiBgExecutor.runAllReady();
verify(mBarService, never()).onPanelHidden();
verify(mBarService, times(1)).onPanelRevealed(false, 5);
@@ -791,18 +783,18 @@
@Test
public void testDump_DoesNotCrash() {
- mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
+ mCentralSurfaces.dump(null, new PrintWriter(new ByteArrayOutputStream()), null);
}
@Test
public void testDumpBarTransitions_DoesNotCrash() {
- StatusBar.dumpBarTransitions(
+ CentralSurfaces.dumpBarTransitions(
new PrintWriter(new ByteArrayOutputStream()), "var", /* transitions= */ null);
}
@Test
public void testFingerprintNotification_UpdatesScrims() {
- mStatusBar.notifyBiometricAuthModeChanged();
+ mCentralSurfaces.notifyBiometricAuthModeChanged();
verify(mScrimController).transitionTo(any(), any());
}
@@ -811,81 +803,81 @@
// Simulate unlocking from AoD with fingerprint.
when(mBiometricUnlockController.getMode())
.thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
}
@Test
public void testTransitionLaunch_goesToUnlocked() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
- mStatusBar.showKeyguardImpl();
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.showKeyguardImpl();
// Starting a pulse should change the scrim controller to the pulsing state
when(mNotificationPanelViewController.isLaunchTransitionRunning()).thenReturn(true);
when(mNotificationPanelViewController.isLaunchingAffordanceWithPreview()).thenReturn(true);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
}
@Test
public void testSetExpansionAffectsAlpha_whenKeyguardShowingButGoingAwayForAnyReason() {
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).setExpansionAffectsAlpha(eq(true));
clearInvocations(mScrimController);
when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).setExpansionAffectsAlpha(eq(true));
clearInvocations(mScrimController);
when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).setExpansionAffectsAlpha(eq(false));
clearInvocations(mScrimController);
when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(true);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).setExpansionAffectsAlpha(eq(false));
}
@Test
public void testTransitionLaunch_noPreview_doesntGoUnlocked() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
- mStatusBar.showKeyguardImpl();
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.showKeyguardImpl();
// Starting a pulse should change the scrim controller to the pulsing state
when(mNotificationPanelViewController.isLaunchTransitionRunning()).thenReturn(true);
when(mNotificationPanelViewController.isLaunchingAffordanceWithPreview()).thenReturn(false);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD));
}
@Test
public void testSetOccluded_propagatesToScrimController() {
- mStatusBar.setOccluded(true);
+ mCentralSurfaces.setOccluded(true);
verify(mScrimController).setKeyguardOccluded(eq(true));
reset(mScrimController);
- mStatusBar.setOccluded(false);
+ mCentralSurfaces.setOccluded(false);
verify(mScrimController).setKeyguardOccluded(eq(false));
}
@Test
public void testPulseWhileDozing_updatesScrimController() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
- mStatusBar.showKeyguardImpl();
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.showKeyguardImpl();
// Starting a pulse should change the scrim controller to the pulsing state
when(mDozeServiceHost.isPulsing()).thenReturn(true);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.PULSING), any());
// Ending a pulse should take it back to keyguard state
when(mDozeServiceHost.isPulsing()).thenReturn(false);
- mStatusBar.updateScrimController();
+ mCentralSurfaces.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD));
}
@@ -893,45 +885,45 @@
public void testShowKeyguardImplementation_setsState() {
when(mLockscreenUserManager.getCurrentProfiles()).thenReturn(new SparseArray<>());
- mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.SHADE);
// By default, showKeyguardImpl sets state to KEYGUARD.
- mStatusBar.showKeyguardImpl();
+ mCentralSurfaces.showKeyguardImpl();
verify(mStatusBarStateController).setState(
eq(StatusBarState.KEYGUARD), eq(false) /* force */);
}
@Test
public void testOnStartedWakingUp_isNotDozing() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
when(mDozeServiceHost.getDozingRequested()).thenReturn(true);
- mStatusBar.updateIsKeyguard();
+ mCentralSurfaces.updateIsKeyguard();
// TODO: mNotificationPanelView.expand(false) gets called twice. Should be once.
verify(mNotificationPanelViewController, times(2)).expand(eq(false));
clearInvocations(mNotificationPanelViewController);
- mStatusBar.mWakefulnessObserver.onStartedWakingUp();
+ mCentralSurfaces.mWakefulnessObserver.onStartedWakingUp();
verify(mDozeServiceHost).stopDozing();
verify(mNotificationPanelViewController).expand(eq(false));
}
@Test
public void testOnStartedWakingUp_doesNotDismissBouncer_whenPulsing() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
when(mStatusBarStateController.isKeyguardRequested()).thenReturn(true);
when(mDozeServiceHost.getDozingRequested()).thenReturn(true);
- mStatusBar.updateIsKeyguard();
+ mCentralSurfaces.updateIsKeyguard();
clearInvocations(mNotificationPanelViewController);
- mStatusBar.setBouncerShowing(true);
- mStatusBar.mWakefulnessObserver.onStartedWakingUp();
+ mCentralSurfaces.setBouncerShowing(true);
+ mCentralSurfaces.mWakefulnessObserver.onStartedWakingUp();
verify(mNotificationPanelViewController, never()).expand(anyBoolean());
}
@Test
public void testRegisterBroadcastsonDispatcher() {
- mStatusBar.registerBroadcastReceiver();
+ mCentralSurfaces.registerBroadcastReceiver();
verify(mBroadcastDispatcher).registerReceiver(
any(BroadcastReceiver.class),
any(IntentFilter.class),
@@ -941,7 +933,7 @@
@Test
public void testUpdateResources_updatesBouncer() {
- mStatusBar.updateResources();
+ mCentralSurfaces.updateResources();
verify(mStatusBarKeyguardViewManager).updateResources();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
index 6ce3b4b..26ac70c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
@@ -82,7 +82,7 @@
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock private PowerManager mPowerManager;
@Mock private WakefulnessLifecycle mWakefullnessLifecycle;
- @Mock private StatusBar mStatusBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private NotificationIconAreaController mNotificationIconAreaController;
@Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@@ -103,7 +103,7 @@
mAuthController, mNotificationIconAreaController);
mDozeServiceHost.initialize(
- mStatusBar,
+ mCentralSurfaces,
mStatusBarKeyguardViewManager,
mNotificationShadeWindowViewController,
mNotificationPanel,
@@ -119,7 +119,7 @@
mDozeServiceHost.startDozing();
verify(mStatusBarStateController).setIsDozing(eq(true));
- verify(mStatusBar).updateIsKeyguard();
+ verify(mCentralSurfaces).updateIsKeyguard();
mDozeServiceHost.stopDozing();
verify(mStatusBarStateController).setIsDozing(eq(false));
@@ -128,8 +128,8 @@
@Test
public void testPulseWhileDozing_updatesScrimController() {
- mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD);
- mStatusBar.showKeyguardImpl();
+ mCentralSurfaces.setBarStateForTest(StatusBarState.KEYGUARD);
+ mCentralSurfaces.showKeyguardImpl();
// Keep track of callback to be able to stop the pulse
// DozeHost.PulseCallback[] pulseCallback = new DozeHost.PulseCallback[1];
@@ -154,12 +154,12 @@
verify(mDozeScrimController).pulse(
pulseCallbackArgumentCaptor.capture(), eq(DozeLog.PULSE_REASON_NOTIFICATION));
- verify(mStatusBar).updateScrimController();
- reset(mStatusBar);
+ verify(mCentralSurfaces).updateScrimController();
+ reset(mCentralSurfaces);
pulseCallbackArgumentCaptor.getValue().onPulseFinished();
assertFalse(mDozeScrimController.isPulsing());
- verify(mStatusBar).updateScrimController();
+ verify(mCentralSurfaces).updateScrimController();
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index 421d8f6a..db5741c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -63,7 +63,6 @@
@Mock private NotificationGroupManagerLegacy mGroupManager;
@Mock private View mNotificationShadeWindowView;
@Mock private VisualStabilityProvider mVSProvider;
- @Mock private StatusBar mBar;
@Mock private StatusBarStateController mStatusBarStateController;
@Mock private KeyguardBypassController mBypassController;
@Mock private ConfigurationControllerImpl mConfigurationController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
index 3257a84..31465f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
@@ -25,7 +25,7 @@
class KeyguardBottomAreaTest : SysuiTestCase() {
@Mock
- private lateinit var mStatusBar: StatusBar
+ private lateinit var mCentralSurfaces: CentralSurfaces
private lateinit var mKeyguardBottomArea: KeyguardBottomAreaView
@Before
@@ -42,7 +42,7 @@
mKeyguardBottomArea = LayoutInflater.from(mContext).inflate(
R.layout.keyguard_bottom_area, null, false) as KeyguardBottomAreaView
- mKeyguardBottomArea.setStatusBar(mStatusBar)
+ mKeyguardBottomArea.setCentralSurfaces(mCentralSurfaces)
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
index 479c271..38412fd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
@@ -130,6 +130,7 @@
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.stack.AmbientState;
+import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
@@ -168,7 +169,7 @@
private static final int NOTIFICATION_SCRIM_TOP_PADDING_IN_SPLIT_SHADE = 50;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private NotificationStackScrollLayout mNotificationStackScrollLayout;
@Mock
@@ -358,6 +359,8 @@
private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock
private SysUiState mSysUiState;
+ @Mock
+ private NotificationListContainer mNotificationListContainer;
private Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
private SysuiStatusBarStateController mStatusBarStateController;
private NotificationPanelViewController mNotificationPanelViewController;
@@ -542,9 +545,10 @@
mInteractionJankMonitor,
mQsFrameTranslateController,
mSysUiState,
- mKeyguardUnlockAnimationController);
+ mKeyguardUnlockAnimationController,
+ mNotificationListContainer);
mNotificationPanelViewController.initDependencies(
- mStatusBar,
+ mCentralSurfaces,
() -> {},
mNotificationShelfController);
mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);
@@ -904,6 +908,7 @@
public void testSwitchesToCorrectClockInSplitShade() {
mStatusBarStateController.setState(KEYGUARD);
enableSplitShade(/* enabled= */ true);
+ clearInvocations(mKeyguardStatusViewController);
when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);
triggerPositionClockAndNotifications();
@@ -918,11 +923,56 @@
}
@Test
+ public void testHasNotifications_switchesToLargeClockWhenEnteringSplitShade() {
+ mStatusBarStateController.setState(KEYGUARD);
+ when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(1);
+
+ enableSplitShade(/* enabled= */ true);
+
+ verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true);
+ }
+
+ @Test
+ public void testNoNotifications_switchesToLargeClockWhenEnteringSplitShade() {
+ mStatusBarStateController.setState(KEYGUARD);
+ when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);
+
+ enableSplitShade(/* enabled= */ true);
+
+ verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true);
+ }
+
+ @Test
+ public void testHasNotifications_switchesToSmallClockWhenExitingSplitShade() {
+ mStatusBarStateController.setState(KEYGUARD);
+ enableSplitShade(/* enabled= */ true);
+ clearInvocations(mKeyguardStatusViewController);
+ when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(1);
+
+ enableSplitShade(/* enabled= */ false);
+
+ verify(mKeyguardStatusViewController).displayClock(SMALL, /* animate */ true);
+ }
+
+ @Test
+ public void testNoNotifications_switchesToLargeClockWhenExitingSplitShade() {
+ mStatusBarStateController.setState(KEYGUARD);
+ enableSplitShade(/* enabled= */ true);
+ clearInvocations(mKeyguardStatusViewController);
+ when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);
+
+ enableSplitShade(/* enabled= */ false);
+
+ verify(mKeyguardStatusViewController).displayClock(LARGE, /* animate */ true);
+ }
+
+ @Test
public void testSwitchesToBigClockInSplitShadeOnAod() {
mStatusBarStateController.setState(KEYGUARD);
enableSplitShade(/* enabled= */ true);
when(mMediaDataManager.hasActiveMedia()).thenReturn(true);
when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2);
+ clearInvocations(mKeyguardStatusViewController);
mNotificationPanelViewController.setDozing(true, false, null);
@@ -934,6 +984,7 @@
when(mScreenOffAnimationController.shouldAnimateClockChange()).thenReturn(false);
mStatusBarStateController.setState(KEYGUARD);
enableSplitShade(/* enabled= */ true);
+ clearInvocations(mKeyguardStatusViewController);
when(mMediaDataManager.hasActiveMedia()).thenReturn(true);
when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2);
@@ -946,6 +997,7 @@
public void testDisplaysSmallClockOnLockscreenInSplitShadeWhenMediaIsPlaying() {
mStatusBarStateController.setState(KEYGUARD);
enableSplitShade(/* enabled= */ true);
+ clearInvocations(mKeyguardStatusViewController);
when(mMediaDataManager.hasActiveMedia()).thenReturn(true);
// one notification + media player visible
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
index 34a5d4b..093f926 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewControllerTest.kt
@@ -61,7 +61,7 @@
@Mock
private lateinit var mStatusBarStateController: SysuiStatusBarStateController
@Mock
- private lateinit var mStatusBar: StatusBar
+ private lateinit var mCentralSurfaces: CentralSurfaces
@Mock
private lateinit var mDockManager: DockManager
@Mock
@@ -107,10 +107,11 @@
mStatusBarKeyguardViewManager,
mStatusBarWindowStateController,
mLockIconViewController,
- Optional.of(mLowLightClockController)
+ Optional.of(mLowLightClockController),
+ mCentralSurfaces,
+ mNotificationShadeWindowController
)
mController.setupExpandedStatusBar()
- mController.setService(mStatusBar, mNotificationShadeWindowController)
mInteractionEventHandlerCaptor =
ArgumentCaptor.forClass(InteractionEventHandler::class.java)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
index 6c33113..62a1bcd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java
@@ -71,7 +71,7 @@
@Mock private DragDownHelper mDragDownHelper;
@Mock private SysuiStatusBarStateController mStatusBarStateController;
@Mock private ShadeController mShadeController;
- @Mock private StatusBar mStatusBar;
+ @Mock private CentralSurfaces mCentralSurfaces;
@Mock private DockManager mDockManager;
@Mock private NotificationPanelViewController mNotificationPanelViewController;
@Mock private NotificationStackScrollLayout mNotificationStackScrollLayout;
@@ -115,9 +115,10 @@
mStatusBarKeyguardViewManager,
mStatusBarWindowStateController,
mLockIconViewController,
- Optional.of(mLowLightClockController));
+ Optional.of(mLowLightClockController),
+ mCentralSurfaces,
+ mNotificationShadeWindowController);
mController.setupExpandedStatusBar();
- mController.setService(mStatusBar, mNotificationShadeWindowController);
mController.setDragDownHelper(mDragDownHelper);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
index 5891161..9ab88dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
@@ -31,6 +31,7 @@
import com.android.systemui.unfold.SysUIUnfoldComponent
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
+import com.android.systemui.util.view.ViewUtil
import com.android.systemui.util.mockito.any
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -63,6 +64,8 @@
private lateinit var configurationController: ConfigurationController
@Mock
private lateinit var userSwitcherController: StatusBarUserSwitcherController
+ @Mock
+ private lateinit var viewUtil: ViewUtil
private lateinit var view: PhoneStatusBarView
private lateinit var controller: PhoneStatusBarViewController
@@ -80,7 +83,6 @@
val parent = FrameLayout(mContext) // add parent to keep layout params
view = LayoutInflater.from(mContext)
.inflate(R.layout.status_bar, parent, false) as PhoneStatusBarView
- view.setLeftTopRightBottom(VIEW_LEFT, VIEW_TOP, VIEW_RIGHT, VIEW_BOTTOM)
}
controller = createAndInitController(view)
@@ -111,64 +113,6 @@
verify(moveFromCenterAnimation).onViewsReady(any())
}
- @Test
- fun touchIsWithinView_inBounds_returnsTrue() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_LEFT + 1f, VIEW_TOP + 1f)).isTrue()
- }
-
- @Test
- fun touchIsWithinView_onTopLeftCorner_returnsTrue() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_LEFT.toFloat(), VIEW_TOP.toFloat())).isTrue()
- }
-
- @Test
- fun touchIsWithinView_onBottomRightCorner_returnsTrue() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(
- VIEW_RIGHT.toFloat(), VIEW_BOTTOM.toFloat())
- ).isTrue()
- }
-
- @Test
- fun touchIsWithinView_xTooSmall_returnsFalse() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_LEFT - 1f, VIEW_TOP + 1f)).isFalse()
- }
-
- @Test
- fun touchIsWithinView_xTooLarge_returnsFalse() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_RIGHT + 1f, VIEW_TOP + 1f)).isFalse()
- }
-
- @Test
- fun touchIsWithinView_yTooSmall_returnsFalse() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_LEFT + 1f, VIEW_TOP - 1f)).isFalse()
- }
-
- @Test
- fun touchIsWithinView_yTooLarge_returnsFalse() {
- val view = createViewMockWithScreenLocation()
- controller = createAndInitController(view)
-
- assertThat(controller.touchIsWithinView(VIEW_LEFT + 1f, VIEW_BOTTOM + 1f)).isFalse()
- }
-
private fun createViewMock(): PhoneStatusBarView {
val view = spy(view)
val viewTreeObserver = mock(ViewTreeObserver::class.java)
@@ -177,20 +121,12 @@
return view
}
- private fun createViewMockWithScreenLocation(): PhoneStatusBarView {
- val view = spy(view)
- val location = IntArray(2)
- location[0] = VIEW_LEFT
- location[1] = VIEW_TOP
- `when`(view.locationOnScreen).thenReturn(location)
- return view
- }
-
private fun createAndInitController(view: PhoneStatusBarView): PhoneStatusBarViewController {
return PhoneStatusBarViewController.Factory(
Optional.of(sysuiUnfoldComponent),
Optional.of(progressProvider),
userSwitcherController,
+ viewUtil,
configurationController
).create(view, touchEventHandler).also {
it.init()
@@ -215,8 +151,3 @@
}
}
}
-
-private const val VIEW_LEFT = 30
-private const val VIEW_RIGHT = 100
-private const val VIEW_TOP = 40
-private const val VIEW_BOTTOM = 100
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 8b93de5..f4f55cc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -75,7 +75,7 @@
@Mock
private KeyguardStateController mKeyguardStateController;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private ViewGroup mContainer;
@Mock
@@ -118,7 +118,7 @@
any(ViewGroup.class),
any(KeyguardBouncer.BouncerExpansionCallback.class)))
.thenReturn(mBouncer);
- when(mStatusBar.getBouncerContainer()).thenReturn(mContainer);
+ when(mCentralSurfaces.getBouncerContainer()).thenReturn(mContainer);
when(mContainer.findViewById(anyInt())).thenReturn(mKeyguardMessageArea);
mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(
getContext(),
@@ -138,8 +138,8 @@
Optional.of(mSysUiUnfoldComponent),
() -> mShadeController,
mLatencyTracker);
- mStatusBarKeyguardViewManager.registerStatusBar(
- mStatusBar,
+ mStatusBarKeyguardViewManager.registerCentralSurfaces(
+ mCentralSurfaces,
mNotificationPanelView,
new PanelExpansionStateManager(),
mBiometricUnlockController,
@@ -261,7 +261,7 @@
@Test
public void onPanelExpansionChanged_neverTranslatesBouncerWhenLaunchingApp() {
- when(mStatusBar.isInLaunchTransition()).thenReturn(true);
+ when(mCentralSurfaces.isInLaunchTransition()).thenReturn(true);
mStatusBarKeyguardViewManager.onPanelExpansionChanged(
/* fraction= */ KeyguardBouncer.EXPANSION_VISIBLE,
/* expanded= */ true,
@@ -272,12 +272,12 @@
@Test
public void setOccluded_animatesPanelExpansion_onlyIfBouncerHidden() {
mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
- verify(mStatusBar).animateKeyguardUnoccluding();
+ verify(mCentralSurfaces).animateKeyguardUnoccluding();
when(mBouncer.isShowing()).thenReturn(true);
- clearInvocations(mStatusBar);
+ clearInvocations(mCentralSurfaces);
mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
- verify(mStatusBar, never()).animateKeyguardUnoccluding();
+ verify(mCentralSurfaces, never()).animateKeyguardUnoccluding();
}
@Test
@@ -303,7 +303,7 @@
@Test
public void setOccluded_isInLaunchTransition_onKeyguardOccludedChangedCalled() {
- when(mStatusBar.isInLaunchTransition()).thenReturn(true);
+ when(mCentralSurfaces.isInLaunchTransition()).thenReturn(true);
mStatusBarKeyguardViewManager.show(null);
mStatusBarKeyguardViewManager.setOccluded(true /* occluded */, false /* animated */);
@@ -312,7 +312,7 @@
@Test
public void setOccluded_isLaunchingActivityOverLockscreen_onKeyguardOccludedChangedCalled() {
- when(mStatusBar.isLaunchingActivityOverLockscreen()).thenReturn(true);
+ when(mCentralSurfaces.isLaunchingActivityOverLockscreen()).thenReturn(true);
mStatusBarKeyguardViewManager.show(null);
mStatusBarKeyguardViewManager.setOccluded(true /* occluded */, false /* animated */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
index 743311f..ace7415 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
@@ -113,7 +113,7 @@
@Mock
private NotificationRemoteInputManager mRemoteInputManager;
@Mock
- private StatusBar mStatusBar;
+ private CentralSurfaces mCentralSurfaces;
@Mock
private KeyguardStateController mKeyguardStateController;
@Mock
@@ -203,7 +203,7 @@
mJankMonitor);
mNotificationActivityStarter =
- new StatusBarNotificationActivityStarter.Builder(
+ new StatusBarNotificationActivityStarter(
getContext(),
mock(CommandQueue.class),
mHandler,
@@ -229,18 +229,16 @@
mock(LockPatternUtils.class),
mock(StatusBarRemoteInputCallback.class),
mActivityIntentHelper,
-
mNotifPipelineFlags,
mock(MetricsLogger.class),
mock(StatusBarNotificationActivityStarterLogger.class),
- mOnUserInteractionCallback)
- .setStatusBar(mStatusBar)
- .setNotificationPresenter(mock(NotificationPresenter.class))
- .setNotificationPanelViewController(
- mock(NotificationPanelViewController.class))
- .setActivityLaunchAnimator(mActivityLaunchAnimator)
- .setNotificationAnimatorControllerProvider(notificationAnimationProvider)
- .build();
+ mOnUserInteractionCallback,
+ mCentralSurfaces,
+ mock(NotificationPresenter.class),
+ mock(NotificationPanelViewController.class),
+ mActivityLaunchAnimator,
+ notificationAnimationProvider
+ );
// set up dismissKeyguardThenExecute to synchronously invoke the OnDismissAction arg
doAnswer(mCallOnDismiss).when(mActivityStarter).dismissKeyguardThenExecute(
@@ -269,7 +267,7 @@
sbn.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
when(mKeyguardStateController.isShowing()).thenReturn(true);
- when(mStatusBar.isOccluded()).thenReturn(true);
+ when(mCentralSurfaces.isOccluded()).thenReturn(true);
// When
mNotificationActivityStarter.onNotificationClicked(sbn, mNotificationRow);
@@ -328,7 +326,7 @@
// Given
sbn.getNotification().contentIntent = null;
when(mKeyguardStateController.isShowing()).thenReturn(true);
- when(mStatusBar.isOccluded()).thenReturn(true);
+ when(mCentralSurfaces.isOccluded()).thenReturn(true);
// When
mNotificationActivityStarter.onNotificationClicked(sbn, mBubbleNotificationRow);
@@ -358,7 +356,7 @@
// Given
sbn.getNotification().contentIntent = mContentIntent;
when(mKeyguardStateController.isShowing()).thenReturn(true);
- when(mStatusBar.isOccluded()).thenReturn(true);
+ when(mCentralSurfaces.isOccluded()).thenReturn(true);
// When
mNotificationActivityStarter.onNotificationClicked(sbn, mBubbleNotificationRow);
@@ -402,6 +400,6 @@
mNotificationActivityStarter.handleFullScreenIntent(entry);
// THEN display should try wake up for the full screen intent
- verify(mStatusBar).wakeUpForFullScreenIntent();
+ verify(mCentralSurfaces).wakeUpForFullScreenIntent();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index 7d9e6b4..1a3dd3a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -37,6 +37,7 @@
import com.android.systemui.ForegroundServiceNotificationListener;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardIndicationController;
@@ -79,7 +80,7 @@
private CommandQueue mCommandQueue;
private FakeMetricsLogger mMetricsLogger;
private ShadeController mShadeController = mock(ShadeController.class);
- private StatusBar mStatusBar = mock(StatusBar.class);
+ private CentralSurfaces mCentralSurfaces = mock(CentralSurfaces.class);
private InitController mInitController = new InitController();
@Before
@@ -101,19 +102,24 @@
mock(NotificationStackScrollLayoutController.class);
when(stackScrollLayoutController.getView()).thenReturn(
mock(NotificationStackScrollLayout.class));
- when(stackScrollLayoutController.getNotificationListContainer()).thenReturn(
- mock(NotificationListContainer.class));
when(notificationShadeWindowView.getResources()).thenReturn(mContext.getResources());
- mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(mContext,
- mock(NotificationPanelViewController.class), mock(HeadsUpManagerPhone.class),
- notificationShadeWindowView, stackScrollLayoutController,
- mock(DozeScrimController.class), mock(ScrimController.class),
- mock(NotificationShadeWindowController.class), mock(DynamicPrivacyController.class),
+ mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(
+ mContext,
+ mock(NotificationPanelViewController.class),
+ mock(HeadsUpManagerPhone.class),
+ notificationShadeWindowView,
+ mock(ActivityStarter.class),
+ stackScrollLayoutController,
+ mock(DozeScrimController.class),
+ mock(ScrimController.class),
+ mock(NotificationShadeWindowController.class),
+ mock(DynamicPrivacyController.class),
mock(KeyguardStateController.class),
mock(KeyguardIndicationController.class),
- mStatusBar,
- mock(ShadeControllerImpl.class), mock(LockscreenShadeTransitionController.class),
+ mCentralSurfaces,
+ mock(ShadeControllerImpl.class),
+ mock(LockscreenShadeTransitionController.class),
mCommandQueue,
mock(NotificationViewHierarchyManager.class),
mock(NotificationLockscreenUserManager.class),
@@ -128,7 +134,9 @@
mNotificationInterruptStateProvider,
mock(NotificationRemoteInputManager.class),
mock(ConfigurationController.class),
- mock(NotifPipelineFlags.class));
+ mock(NotifPipelineFlags.class),
+ mock(NotificationRemoteInputManager.Callback.class),
+ mock(NotificationListContainer.class));
mInitController.executePostInitTasks();
ArgumentCaptor<NotificationInterruptSuppressor> suppressorCaptor =
ArgumentCaptor.forClass(NotificationInterruptSuppressor.class);
@@ -195,9 +203,9 @@
.setTag("a")
.setNotification(n)
.build();
- when(mStatusBar.areNotificationAlertsDisabled()).thenReturn(true);
+ when(mCentralSurfaces.areNotificationAlertsDisabled()).thenReturn(true);
- assertTrue("StatusBar alerts disabled shouldn't allow interruptions",
+ assertTrue("CentralSurfaces alerts disabled shouldn't allow interruptions",
mInterruptSuppressor.suppressInterruptions(entry));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt
index 71b32c0..050563a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt
@@ -61,7 +61,7 @@
@Mock
private lateinit var globalSettings: GlobalSettings
@Mock
- private lateinit var statusBar: StatusBar
+ private lateinit var mCentralSurfaces: CentralSurfaces
@Mock
private lateinit var notificationPanelViewController: NotificationPanelViewController
@Mock
@@ -93,8 +93,8 @@
powerManager,
handler = handler
)
- controller.initialize(statusBar, lightRevealScrim)
- `when`(statusBar.notificationPanelViewController).thenReturn(
+ controller.initialize(mCentralSurfaces, lightRevealScrim)
+ `when`(mCentralSurfaces.notificationPanelViewController).thenReturn(
notificationPanelViewController)
// Screen off does not run if the panel is expanded, so we should say it's collapsed to test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
index 5861617..5095094 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
@@ -17,6 +17,8 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeast;
@@ -27,6 +29,7 @@
import android.app.StatusBarManager;
import android.content.Context;
import android.os.Bundle;
+import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
@@ -56,6 +59,9 @@
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.settings.SecureSettings;
+import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
import org.junit.Test;
@@ -82,6 +88,8 @@
private final CommandQueue mCommandQueue = mock(CommandQueue.class);
private OperatorNameViewController.Factory mOperatorNameViewControllerFactory;
private OperatorNameViewController mOperatorNameViewController;
+ private SecureSettings mSecureSettings;
+ private FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
@Mock
private StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
@@ -298,6 +306,40 @@
assertEquals(mStatusBarFragmentComponent, fragment.getStatusBarFragmentComponent());
}
+ @Test
+ public void testBlockedIcons_obeysSettingForVibrateIcon_settingOff() {
+ CollapsedStatusBarFragment fragment = resumeAndGetFragment();
+ String str = mContext.getString(com.android.internal.R.string.status_bar_volume);
+
+ // GIVEN the setting is off
+ when(mSecureSettings.getInt(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0))
+ .thenReturn(0);
+
+ // WHEN CollapsedStatusBarFragment builds the blocklist
+ fragment.updateBlockedIcons();
+
+ // THEN status_bar_volume SHOULD be present in the list
+ boolean contains = fragment.getBlockedIcons().contains(str);
+ assertTrue(contains);
+ }
+
+ @Test
+ public void testBlockedIcons_obeysSettingForVibrateIcon_settingOn() {
+ CollapsedStatusBarFragment fragment = resumeAndGetFragment();
+ String str = mContext.getString(com.android.internal.R.string.status_bar_volume);
+
+ // GIVEN the setting is ON
+ when(mSecureSettings.getInt(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0))
+ .thenReturn(1);
+
+ // WHEN CollapsedStatusBarFragment builds the blocklist
+ fragment.updateBlockedIcons();
+
+ // THEN status_bar_volume SHOULD NOT be present in the list
+ boolean contains = fragment.getBlockedIcons().contains(str);
+ assertFalse(contains);
+ }
+
@Override
protected Fragment instantiate(Context context, String className, Bundle arguments) {
MockitoAnnotations.initMocks(this);
@@ -313,6 +355,7 @@
mOperatorNameViewControllerFactory = mock(OperatorNameViewController.Factory.class);
when(mOperatorNameViewControllerFactory.create(any()))
.thenReturn(mOperatorNameViewController);
+ mSecureSettings = mock(SecureSettings.class);
setUpNotificationIconAreaController();
return new CollapsedStatusBarFragment(
@@ -334,7 +377,9 @@
new LogBuffer("TEST", 1, 1, mock(LogcatEchoTracker.class)),
new DisableFlagsLogger()
),
- mOperatorNameViewControllerFactory);
+ mOperatorNameViewControllerFactory,
+ mSecureSettings,
+ mExecutor);
}
private void setUpDaggerComponent() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
index 807664d..ada0453 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt
@@ -105,6 +105,7 @@
val notificationCollection = mock(CommonNotifCollection::class.java)
controller = OngoingCallController(
+ context,
notificationCollection,
mockOngoingCallFlags,
clock,
@@ -238,6 +239,18 @@
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
}
+ /** Regression test for b/216248574. */
+ @Test
+ fun entryUpdated_packageNameProvidedToActivityManager() {
+ notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
+
+ val packageNameCaptor = ArgumentCaptor.forClass(String::class.java)
+ verify(mockIActivityManager).registerUidObserver(
+ any(), any(), any(), packageNameCaptor.capture()
+ )
+ assertThat(packageNameCaptor.value).isNotNull()
+ }
+
/**
* If a call notification is never added before #onEntryRemoved is called, then the listener
* should never be notified.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
index 07e0279..896dab6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt
@@ -48,7 +48,6 @@
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.NotificationShadeWindowView
-import com.android.systemui.statusbar.phone.ShadeController
import com.android.systemui.telephony.TelephonyListenerManager
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.settings.SecureSettings
@@ -95,7 +94,6 @@
@Mock private lateinit var notificationShadeWindowView: NotificationShadeWindowView
@Mock private lateinit var threadedRenderer: ThreadedRenderer
@Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
- @Mock private lateinit var shadeController: ShadeController
private lateinit var testableLooper: TestableLooper
private lateinit var bgExecutor: FakeExecutor
private lateinit var uiExecutor: FakeExecutor
@@ -171,7 +169,6 @@
interactionJankMonitor,
latencyTracker,
dumpManager,
- { shadeController },
dialogLaunchAnimator)
userSwitcherController.init(notificationShadeWindowView)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/view/ViewUtilTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/view/ViewUtilTest.kt
new file mode 100644
index 0000000..dead159
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/view/ViewUtilTest.kt
@@ -0,0 +1,72 @@
+package com.android.systemui.util.view
+
+import android.view.View
+import android.widget.TextView
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.`when`
+
+@SmallTest
+class ViewUtilTest : SysuiTestCase() {
+ private val viewUtil = ViewUtil()
+ private lateinit var view: View
+
+ @Before
+ fun setUp() {
+ view = TextView(context)
+ view.setLeftTopRightBottom(VIEW_LEFT, VIEW_TOP, VIEW_RIGHT, VIEW_BOTTOM)
+
+ view = spy(view)
+ val location = IntArray(2)
+ location[0] = VIEW_LEFT
+ location[1] = VIEW_TOP
+ `when`(view.locationOnScreen).thenReturn(location)
+ }
+
+ @Test
+ fun touchIsWithinView_inBounds_returnsTrue() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_LEFT + 1f, VIEW_TOP + 1f)).isTrue()
+ }
+
+ @Test
+ fun touchIsWithinView_onTopLeftCorner_returnsTrue() {
+ assertThat(viewUtil.touchIsWithinView(
+ view, VIEW_LEFT.toFloat(), VIEW_TOP.toFloat())
+ ).isTrue()
+ }
+
+ @Test
+ fun touchIsWithinView_onBottomRightCorner_returnsTrue() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_RIGHT.toFloat(), VIEW_BOTTOM.toFloat()))
+ .isTrue()
+ }
+
+ @Test
+ fun touchIsWithinView_xTooSmall_returnsFalse() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_LEFT - 1f, VIEW_TOP + 1f)).isFalse()
+ }
+
+ @Test
+ fun touchIsWithinView_xTooLarge_returnsFalse() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_RIGHT + 1f, VIEW_TOP + 1f)).isFalse()
+ }
+
+ @Test
+ fun touchIsWithinView_yTooSmall_returnsFalse() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_LEFT + 1f, VIEW_TOP - 1f)).isFalse()
+ }
+
+ @Test
+ fun touchIsWithinView_yTooLarge_returnsFalse() {
+ assertThat(viewUtil.touchIsWithinView(view, VIEW_LEFT + 1f, VIEW_BOTTOM + 1f)).isFalse()
+ }
+}
+
+private const val VIEW_LEFT = 30
+private const val VIEW_RIGHT = 100
+private const val VIEW_TOP = 40
+private const val VIEW_BOTTOM = 100
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
index 8ad6271..2be67ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
@@ -43,6 +43,10 @@
}
@Override
+ public void refreshIconGroup(IconManager iconManager) {
+ }
+
+ @Override
public void setExternalIcon(String slot) {
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 593b97e..82880fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -1221,7 +1221,7 @@
final Context userContext = setUpContextWithPackageManager(workPkg,
mock(ApplicationInfo.class));
- // If things are working correctly, StatusBar.getPackageManagerForUser will call this
+ // If things are working correctly, CentralSurfaces.getPackageManagerForUser will call this
when(context.createPackageContextAsUser(eq(workPkg), anyInt(), eq(workUser)))
.thenReturn(userContext);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
index 6593823..7726938 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java
@@ -39,7 +39,6 @@
import com.android.wm.shell.compatui.CompatUI;
import com.android.wm.shell.draganddrop.DragAndDrop;
import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.onehanded.OneHandedEventCallback;
import com.android.wm.shell.onehanded.OneHandedTransitionCallback;
@@ -72,7 +71,6 @@
@Mock ScreenLifecycle mScreenLifecycle;
@Mock SysUiState mSysUiState;
@Mock Pip mPip;
- @Mock LegacySplitScreen mLegacySplitScreen;
@Mock SplitScreen mSplitScreen;
@Mock OneHanded mOneHanded;
@Mock HideDisplayCutout mHideDisplayCutout;
@@ -88,7 +86,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mWMShell = new WMShell(mContext, Optional.of(mPip), Optional.of(mLegacySplitScreen),
+ mWMShell = new WMShell(mContext, Optional.of(mPip),
Optional.of(mSplitScreen), Optional.of(mOneHanded), Optional.of(mHideDisplayCutout),
Optional.of(mShellCommandHandler), Optional.of(mCompatUI),
Optional.of(mDragAndDrop),
@@ -105,13 +103,6 @@
}
@Test
- public void initLegacySplitScreen_registersCallbacks() {
- mWMShell.initLegacySplitScreen(mLegacySplitScreen);
-
- verify(mKeyguardUpdateMonitor).registerCallback(any(KeyguardUpdateMonitorCallback.class));
- }
-
- @Test
public void initSplitScreen_registersCallbacks() {
mWMShell.initSplitScreen(mSplitScreen);
diff --git a/services/Android.bp b/services/Android.bp
index 2e4405f..dfc88f1 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -88,7 +88,6 @@
":services.appwidget-sources",
":services.autofill-sources",
":services.backup-sources",
- ":services.bluetooth-sources", // TODO(b/214988855) : Remove once apex/service-bluetooth jar is ready
":backuplib-sources",
":services.cloudsearch-sources",
":services.companion-sources",
diff --git a/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java b/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java
index 2b7b977..bf8b18c 100644
--- a/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java
+++ b/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java
@@ -50,6 +50,7 @@
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ResultReceiver;
+import android.os.UserHandle;
import android.util.PackageUtils;
import android.util.Slog;
@@ -201,8 +202,10 @@
// requests at the same time.
// If the application already has a pending association request, that PendingIntent
// will be cancelled.
- pendingIntent = PendingIntent.getActivity(mContext, /*requestCode */ packageUid, intent,
- FLAG_ONE_SHOT | FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE);
+ pendingIntent = PendingIntent.getActivityAsUser(
+ mContext, /*requestCode */ packageUid, intent,
+ FLAG_ONE_SHOT | FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE,
+ /* options= */ null, UserHandle.CURRENT);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
index bc1f28d..b991ba8 100644
--- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
+++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
@@ -24,6 +24,8 @@
import android.annotation.Nullable;
import android.app.compat.CompatChanges;
import android.companion.virtual.VirtualDeviceManager.ActivityListener;
+import android.companion.virtual.VirtualDeviceParams;
+import android.companion.virtual.VirtualDeviceParams.ActivityPolicy;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.content.ComponentName;
@@ -77,7 +79,9 @@
@Nullable
private final ArraySet<ComponentName> mBlockedActivities;
private final Object mGenericWindowPolicyControllerLock = new Object();
- private Consumer<ActivityInfo> mActivityBlockedCallback;
+ @ActivityPolicy
+ private final int mDefaultActivityPolicy;
+ private final Consumer<ActivityInfo> mActivityBlockedCallback;
@NonNull
@GuardedBy("mGenericWindowPolicyControllerLock")
@@ -95,18 +99,30 @@
* @param windowFlags The window flags that this controller is interested in.
* @param systemWindowFlags The system window flags that this controller is interested in.
* @param allowedUsers The set of users that are allowed to stream in this display.
+ * @param allowedActivities The set of activities explicitly allowed to stream on this device.
+ * Used only if the {@code activityPolicy} is
+ * {@link VirtualDeviceParams#ACTIVITY_POLICY_DEFAULT_BLOCKED}.
+ * @param blockedActivities The set of activities explicitly blocked from streaming on this
+ * device. Used only if the {@code activityPolicy} is
+ * {@link VirtualDeviceParams#ACTIVITY_POLICY_DEFAULT_ALLOWED}
+ * @param defaultActivityPolicy Whether activities are default allowed to be displayed or
+ * blocked.
* @param activityListener Activity listener to listen for activity changes. The display ID
* is not populated in this callback and is always {@link Display#INVALID_DISPLAY}.
+ * @param activityBlockedCallback Callback that is called when an activity is blocked from
+ * launching.
*/
public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
@NonNull ArraySet<UserHandle> allowedUsers,
- @Nullable Set<ComponentName> allowedActivities,
- @Nullable Set<ComponentName> blockedActivities,
+ @NonNull Set<ComponentName> allowedActivities,
+ @NonNull Set<ComponentName> blockedActivities,
+ @ActivityPolicy int defaultActivityPolicy,
@NonNull ActivityListener activityListener,
@NonNull Consumer<ActivityInfo> activityBlockedCallback) {
mAllowedUsers = allowedUsers;
- mAllowedActivities = allowedActivities == null ? null : new ArraySet<>(allowedActivities);
- mBlockedActivities = blockedActivities == null ? null : new ArraySet<>(blockedActivities);
+ mAllowedActivities = new ArraySet<>(allowedActivities);
+ mBlockedActivities = new ArraySet<>(blockedActivities);
+ mDefaultActivityPolicy = defaultActivityPolicy;
mActivityBlockedCallback = activityBlockedCallback;
setInterestedWindowFlags(windowFlags, systemWindowFlags);
mActivityListener = activityListener;
@@ -191,11 +207,13 @@
Slog.d(TAG, "Virtual device activity not allowed from user " + activityUser);
return false;
}
- if (mBlockedActivities != null && mBlockedActivities.contains(activityComponent)) {
+ if (mDefaultActivityPolicy == VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED
+ && mBlockedActivities.contains(activityComponent)) {
Slog.d(TAG, "Virtual device blocking launch of " + activityComponent);
return false;
}
- if (mAllowedActivities != null && !mAllowedActivities.contains(activityComponent)) {
+ if (mDefaultActivityPolicy == VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_BLOCKED
+ && !mAllowedActivities.contains(activityComponent)) {
Slog.d(TAG, activityComponent + " is not in the allowed list.");
return false;
}
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index c0a904f..dbb48ae 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -505,6 +505,7 @@
getAllowedUserHandles(),
mParams.getAllowedActivities(),
mParams.getBlockedActivities(),
+ mParams.getDefaultActivityPolicy(),
createListenerAdapter(displayId),
activityInfo -> onActivityBlocked(displayId, activityInfo));
mWindowPolicyControllers.put(displayId, dwpc);
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 561009f..a2b289c 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -103,7 +103,6 @@
":android.hardware.biometrics.face-V2-java-source",
":statslog-art-java-gen",
":statslog-contexthub-java-gen",
- ":services.bluetooth-sources", // TODO(b/214988855) : Remove once apex is ready
":services.core-sources",
":services.core.protologsrc",
":dumpstate_aidl",
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 12e438d..78df983 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -21,6 +21,8 @@
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.UserInfo;
import android.os.Environment;
import android.os.SystemClock;
@@ -38,6 +40,7 @@
import com.android.server.SystemService.TargetUser;
import com.android.server.SystemService.UserCompletedEventType;
import com.android.server.am.EventLogTags;
+import com.android.server.pm.ApexManager;
import com.android.server.pm.UserManagerInternal;
import com.android.server.utils.TimingsTraceAndSlog;
@@ -47,6 +50,8 @@
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -147,12 +152,31 @@
* @return The service instance.
*/
public SystemService startServiceFromJar(String className, String path) {
- PathClassLoader pathClassLoader = SystemServerClassLoaderFactory.getOrCreateClassLoader(
- path, this.getClass().getClassLoader());
+ PathClassLoader pathClassLoader =
+ SystemServerClassLoaderFactory.getOrCreateClassLoader(
+ path, this.getClass().getClassLoader(), isJarInTestApex(path));
final Class<SystemService> serviceClass = loadClassFromLoader(className, pathClassLoader);
return startService(serviceClass);
}
+ /**
+ * Returns true if the jar is in a test APEX.
+ */
+ private static boolean isJarInTestApex(String pathStr) {
+ Path path = Paths.get(pathStr);
+ if (path.getNameCount() >= 2 && path.getName(0).toString().equals("apex")) {
+ String apexModuleName = path.getName(1).toString();
+ ApexManager apexManager = ApexManager.getInstance();
+ String packageName = apexManager.getActivePackageNameForApexModuleName(apexModuleName);
+ PackageInfo packageInfo = apexManager.getPackageInfo(
+ packageName, ApexManager.MATCH_ACTIVE_PACKAGE);
+ if (packageInfo != null) {
+ return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_TEST_ONLY) != 0;
+ }
+ }
+ return false;
+ }
+
/*
* Loads and initializes a class from the given classLoader. Returns the class.
*/
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index efbc4de..40ab0c0 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -651,100 +651,102 @@
}
private void onMultiSimConfigChanged() {
- int oldNumPhones = mNumPhones;
- mNumPhones = getTelephonyManager().getActiveModemCount();
- if (oldNumPhones == mNumPhones) return;
+ synchronized (mRecords) {
+ int oldNumPhones = mNumPhones;
+ mNumPhones = getTelephonyManager().getActiveModemCount();
+ if (oldNumPhones == mNumPhones) return;
- if (DBG) {
- log("TelephonyRegistry: activeModemCount changed from " + oldNumPhones
- + " to " + mNumPhones);
- }
- mCallState = copyOf(mCallState, mNumPhones);
- mDataActivity = copyOf(mCallState, mNumPhones);
- mDataConnectionState = copyOf(mCallState, mNumPhones);
- mDataConnectionNetworkType = copyOf(mCallState, mNumPhones);
- mCallIncomingNumber = copyOf(mCallIncomingNumber, mNumPhones);
- mServiceState = copyOf(mServiceState, mNumPhones);
- mVoiceActivationState = copyOf(mVoiceActivationState, mNumPhones);
- mDataActivationState = copyOf(mDataActivationState, mNumPhones);
- mUserMobileDataState = copyOf(mUserMobileDataState, mNumPhones);
- if (mSignalStrength != null) {
- mSignalStrength = copyOf(mSignalStrength, mNumPhones);
- } else {
- mSignalStrength = new SignalStrength[mNumPhones];
- }
- mMessageWaiting = copyOf(mMessageWaiting, mNumPhones);
- mCallForwarding = copyOf(mCallForwarding, mNumPhones);
- mCellIdentity = copyOf(mCellIdentity, mNumPhones);
- mSrvccState = copyOf(mSrvccState, mNumPhones);
- mPreciseCallState = copyOf(mPreciseCallState, mNumPhones);
- mForegroundCallState = copyOf(mForegroundCallState, mNumPhones);
- mBackgroundCallState = copyOf(mBackgroundCallState, mNumPhones);
- mRingingCallState = copyOf(mRingingCallState, mNumPhones);
- mCallDisconnectCause = copyOf(mCallDisconnectCause, mNumPhones);
- mCallPreciseDisconnectCause = copyOf(mCallPreciseDisconnectCause, mNumPhones);
- mCallQuality = copyOf(mCallQuality, mNumPhones);
- mCallNetworkType = copyOf(mCallNetworkType, mNumPhones);
- mCallAttributes = copyOf(mCallAttributes, mNumPhones);
- mOutgoingCallEmergencyNumber = copyOf(mOutgoingCallEmergencyNumber, mNumPhones);
- mOutgoingSmsEmergencyNumber = copyOf(mOutgoingSmsEmergencyNumber, mNumPhones);
- mTelephonyDisplayInfos = copyOf(mTelephonyDisplayInfos, mNumPhones);
- mCarrierNetworkChangeState = copyOf(mCarrierNetworkChangeState, mNumPhones);
- mIsDataEnabled= copyOf(mIsDataEnabled, mNumPhones);
- mDataEnabledReason = copyOf(mDataEnabledReason, mNumPhones);
- mAllowedNetworkTypeReason = copyOf(mAllowedNetworkTypeReason, mNumPhones);
- mAllowedNetworkTypeValue = copyOf(mAllowedNetworkTypeValue, mNumPhones);
+ if (DBG) {
+ log("TelephonyRegistry: activeModemCount changed from " + oldNumPhones
+ + " to " + mNumPhones);
+ }
+ mCallState = copyOf(mCallState, mNumPhones);
+ mDataActivity = copyOf(mCallState, mNumPhones);
+ mDataConnectionState = copyOf(mCallState, mNumPhones);
+ mDataConnectionNetworkType = copyOf(mCallState, mNumPhones);
+ mCallIncomingNumber = copyOf(mCallIncomingNumber, mNumPhones);
+ mServiceState = copyOf(mServiceState, mNumPhones);
+ mVoiceActivationState = copyOf(mVoiceActivationState, mNumPhones);
+ mDataActivationState = copyOf(mDataActivationState, mNumPhones);
+ mUserMobileDataState = copyOf(mUserMobileDataState, mNumPhones);
+ if (mSignalStrength != null) {
+ mSignalStrength = copyOf(mSignalStrength, mNumPhones);
+ } else {
+ mSignalStrength = new SignalStrength[mNumPhones];
+ }
+ mMessageWaiting = copyOf(mMessageWaiting, mNumPhones);
+ mCallForwarding = copyOf(mCallForwarding, mNumPhones);
+ mCellIdentity = copyOf(mCellIdentity, mNumPhones);
+ mSrvccState = copyOf(mSrvccState, mNumPhones);
+ mPreciseCallState = copyOf(mPreciseCallState, mNumPhones);
+ mForegroundCallState = copyOf(mForegroundCallState, mNumPhones);
+ mBackgroundCallState = copyOf(mBackgroundCallState, mNumPhones);
+ mRingingCallState = copyOf(mRingingCallState, mNumPhones);
+ mCallDisconnectCause = copyOf(mCallDisconnectCause, mNumPhones);
+ mCallPreciseDisconnectCause = copyOf(mCallPreciseDisconnectCause, mNumPhones);
+ mCallQuality = copyOf(mCallQuality, mNumPhones);
+ mCallNetworkType = copyOf(mCallNetworkType, mNumPhones);
+ mCallAttributes = copyOf(mCallAttributes, mNumPhones);
+ mOutgoingCallEmergencyNumber = copyOf(mOutgoingCallEmergencyNumber, mNumPhones);
+ mOutgoingSmsEmergencyNumber = copyOf(mOutgoingSmsEmergencyNumber, mNumPhones);
+ mTelephonyDisplayInfos = copyOf(mTelephonyDisplayInfos, mNumPhones);
+ mCarrierNetworkChangeState = copyOf(mCarrierNetworkChangeState, mNumPhones);
+ mIsDataEnabled = copyOf(mIsDataEnabled, mNumPhones);
+ mDataEnabledReason = copyOf(mDataEnabledReason, mNumPhones);
+ mAllowedNetworkTypeReason = copyOf(mAllowedNetworkTypeReason, mNumPhones);
+ mAllowedNetworkTypeValue = copyOf(mAllowedNetworkTypeValue, mNumPhones);
- // ds -> ss switch.
- if (mNumPhones < oldNumPhones) {
- cutListToSize(mCellInfo, mNumPhones);
- cutListToSize(mImsReasonInfo, mNumPhones);
- cutListToSize(mPreciseDataConnectionStates, mNumPhones);
- cutListToSize(mBarringInfo, mNumPhones);
- cutListToSize(mPhysicalChannelConfigs, mNumPhones);
- cutListToSize(mLinkCapacityEstimateLists, mNumPhones);
- cutListToSize(mCarrierPrivilegeStates, mNumPhones);
- return;
- }
+ // ds -> ss switch.
+ if (mNumPhones < oldNumPhones) {
+ cutListToSize(mCellInfo, mNumPhones);
+ cutListToSize(mImsReasonInfo, mNumPhones);
+ cutListToSize(mPreciseDataConnectionStates, mNumPhones);
+ cutListToSize(mBarringInfo, mNumPhones);
+ cutListToSize(mPhysicalChannelConfigs, mNumPhones);
+ cutListToSize(mLinkCapacityEstimateLists, mNumPhones);
+ cutListToSize(mCarrierPrivilegeStates, mNumPhones);
+ return;
+ }
- // mNumPhones > oldNumPhones: ss -> ds switch
- for (int i = oldNumPhones; i < mNumPhones; i++) {
- mCallState[i] = TelephonyManager.CALL_STATE_IDLE;
- mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE;
- mDataConnectionState[i] = TelephonyManager.DATA_UNKNOWN;
- mVoiceActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
- mDataActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
- mCallIncomingNumber[i] = "";
- mServiceState[i] = new ServiceState();
- mSignalStrength[i] = null;
- mUserMobileDataState[i] = false;
- mMessageWaiting[i] = false;
- mCallForwarding[i] = false;
- mCellIdentity[i] = null;
- mCellInfo.add(i, null);
- mImsReasonInfo.add(i, null);
- mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE;
- mCallDisconnectCause[i] = DisconnectCause.NOT_VALID;
- mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID;
- mCallQuality[i] = createCallQuality();
- mCallAttributes[i] = new CallAttributes(createPreciseCallState(),
- TelephonyManager.NETWORK_TYPE_UNKNOWN, createCallQuality());
- mCallNetworkType[i] = TelephonyManager.NETWORK_TYPE_UNKNOWN;
- mPreciseCallState[i] = createPreciseCallState();
- mRingingCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
- mForegroundCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
- mBackgroundCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
- mPreciseDataConnectionStates.add(new ArrayMap<>());
- mBarringInfo.add(i, new BarringInfo());
- mCarrierNetworkChangeState[i] = false;
- mTelephonyDisplayInfos[i] = null;
- mIsDataEnabled[i] = false;
- mDataEnabledReason[i] = TelephonyManager.DATA_ENABLED_REASON_USER;
- mPhysicalChannelConfigs.add(i, new ArrayList<>());
- mAllowedNetworkTypeReason[i] = -1;
- mAllowedNetworkTypeValue[i] = -1;
- mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST);
- mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0]));
+ // mNumPhones > oldNumPhones: ss -> ds switch
+ for (int i = oldNumPhones; i < mNumPhones; i++) {
+ mCallState[i] = TelephonyManager.CALL_STATE_IDLE;
+ mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE;
+ mDataConnectionState[i] = TelephonyManager.DATA_UNKNOWN;
+ mVoiceActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
+ mDataActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN;
+ mCallIncomingNumber[i] = "";
+ mServiceState[i] = new ServiceState();
+ mSignalStrength[i] = null;
+ mUserMobileDataState[i] = false;
+ mMessageWaiting[i] = false;
+ mCallForwarding[i] = false;
+ mCellIdentity[i] = null;
+ mCellInfo.add(i, null);
+ mImsReasonInfo.add(i, null);
+ mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE;
+ mCallDisconnectCause[i] = DisconnectCause.NOT_VALID;
+ mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID;
+ mCallQuality[i] = createCallQuality();
+ mCallAttributes[i] = new CallAttributes(createPreciseCallState(),
+ TelephonyManager.NETWORK_TYPE_UNKNOWN, createCallQuality());
+ mCallNetworkType[i] = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ mPreciseCallState[i] = createPreciseCallState();
+ mRingingCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
+ mForegroundCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
+ mBackgroundCallState[i] = PreciseCallState.PRECISE_CALL_STATE_IDLE;
+ mPreciseDataConnectionStates.add(new ArrayMap<>());
+ mBarringInfo.add(i, new BarringInfo());
+ mCarrierNetworkChangeState[i] = false;
+ mTelephonyDisplayInfos[i] = null;
+ mIsDataEnabled[i] = false;
+ mDataEnabledReason[i] = TelephonyManager.DATA_ENABLED_REASON_USER;
+ mPhysicalChannelConfigs.add(i, new ArrayList<>());
+ mAllowedNetworkTypeReason[i] = -1;
+ mAllowedNetworkTypeValue[i] = -1;
+ mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST);
+ mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0]));
+ }
}
}
@@ -2802,11 +2804,11 @@
+ " callback=" + callback
+ " callback.asBinder=" + callback.asBinder());
}
- if (!validatePhoneId(phoneId)) {
- throw new IllegalArgumentException("Invalid slot index: " + phoneId);
- }
synchronized (mRecords) {
+ if (!validatePhoneId(phoneId)) {
+ throw new IllegalArgumentException("Invalid slot index: " + phoneId);
+ }
Record r = add(
callback.asBinder(), Binder.getCallingUid(), Binder.getCallingPid(), false);
@@ -2851,7 +2853,6 @@
if (!checkNotifyPermission("notifyCarrierPrivilegesChanged")) {
return;
}
- if (!validatePhoneId(phoneId)) return;
if (VDBG) {
log(
"notifyCarrierPrivilegesChanged: phoneId=" + phoneId
@@ -2859,6 +2860,9 @@
+ ", uids=" + Arrays.toString(privilegedUids) + ">");
}
synchronized (mRecords) {
+ if (!validatePhoneId(phoneId)) {
+ throw new IllegalArgumentException("Invalid slot index: " + phoneId);
+ }
mCarrierPrivilegeStates.set(
phoneId, new Pair<>(privilegedPackageNames, privilegedUids));
for (Record r : mRecords) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 64bba79..20a8509 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -9155,10 +9155,14 @@
}
mComponentAliasResolver.dump(pw);
}
- if (dumpAll) {
- pw.println("-------------------------------------------------------------------------------");
- mAppRestrictionController.dump(pw, "");
- }
+ }
+
+ /**
+ * Dump the app restriction controller, it's required not to hold the global lock here.
+ */
+ private void dumpAppRestrictionController(PrintWriter pw) {
+ pw.println("-------------------------------------------------------------------------------");
+ mAppRestrictionController.dump(pw, "");
}
/**
@@ -9514,6 +9518,9 @@
dumpNormalPriority, dumpAppId, false /* dumpProxies */);
}
}
+ if (dumpAll) {
+ dumpAppRestrictionController(pw);
+ }
}
Binder.restoreCallingIdentity(origId);
}
@@ -14330,7 +14337,8 @@
int match = mContext.getPackageManager().checkSignatures(
ii.targetPackage, ii.packageName);
if (match < 0 && match != PackageManager.SIGNATURE_FIRST_NOT_SIGNED) {
- if (Build.IS_DEBUGGABLE && (flags & INSTR_FLAG_ALWAYS_CHECK_SIGNATURE) == 0) {
+ if (Build.IS_DEBUGGABLE && (callingUid == Process.ROOT_UID)
+ && (flags & INSTR_FLAG_ALWAYS_CHECK_SIGNATURE) == 0) {
Slog.w(TAG, "Instrumentation test " + ii.packageName
+ " doesn't have a signature matching the target " + ii.targetPackage
+ ", which would not be allowed on the production Android builds");
diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java
index 655e309..7579d2b 100644
--- a/services/core/java/com/android/server/am/AppBatteryTracker.java
+++ b/services/core/java/com/android/server/am/AppBatteryTracker.java
@@ -1531,7 +1531,7 @@
if (excessive) {
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
- Slog.i(TAG, "Excessive background current drain " + uid
+ Slog.i(TAG, "Excessive background current drain " + uid + " "
+ usage + " (" + usage.percentageToString() + " ) over "
+ TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
}
@@ -1542,7 +1542,7 @@
}
} else {
if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
- Slog.i(TAG, "Background current drain backs to normal " + uid
+ Slog.i(TAG, "Background current drain backs to normal " + uid + " "
+ usage + " (" + usage.percentageToString() + " ) over "
+ TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
}
diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java
index 2ffd487..561c10b9 100644
--- a/services/core/java/com/android/server/am/AppRestrictionController.java
+++ b/services/core/java/com/android/server/am/AppRestrictionController.java
@@ -87,7 +87,6 @@
import android.app.ActivityManager.RestrictionLevel;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.AppBackgroundRestrictionListener;
-import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.IUidObserver;
@@ -192,7 +191,7 @@
// No lock is needed, as it's immutable after initialization in constructor.
private final ArrayList<BaseAppStateTracker> mAppStateTrackers = new ArrayList<>();
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
private final RestrictionSettings mRestrictionSettings = new RestrictionSettings();
private final CopyOnWriteArraySet<AppBackgroundRestrictionListener> mRestrictionListeners =
@@ -202,7 +201,7 @@
* A mapping between the UID/Pkg and its pending work which should be triggered on inactive;
* an active UID/pkg pair should have an entry here, although its pending work could be null.
*/
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
private final SparseArrayMap<String, Runnable> mActiveUids = new SparseArrayMap<>();
// No lock is needed as it's accessed in bg handler thread only.
@@ -219,6 +218,7 @@
private int[] mDeviceIdleExceptIdleAllowlist = new int[0]; // No lock is needed.
private final Object mLock = new Object();
+ private final Object mSettingsLock = new Object();
private final Injector mInjector;
private final NotificationHelper mNotificationHelper;
@@ -257,12 +257,95 @@
final ActivityManagerService mActivityManagerService;
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ switch (intent.getAction()) {
+ case Intent.ACTION_PACKAGE_ADDED: {
+ if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ if (uid >= 0) {
+ onUidAdded(uid);
+ }
+ }
+ }
+ // fall through.
+ case Intent.ACTION_PACKAGE_CHANGED: {
+ final String pkgName = intent.getData().getSchemeSpecificPart();
+ final String[] cmpList = intent.getStringArrayExtra(
+ Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
+ // If this is PACKAGE_ADDED (cmpList == null), or if it's a whole-package
+ // enable/disable event (cmpList is just the package name itself), drop
+ // our carrier privileged app & system-app caches and let them refresh
+ if (cmpList == null
+ || (cmpList.length == 1 && pkgName.equals(cmpList[0]))) {
+ clearCarrierPrivilegedApps();
+ }
+ } break;
+ case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ final Uri data = intent.getData();
+ String ssp;
+ if (uid >= 0 && data != null
+ && (ssp = data.getSchemeSpecificPart()) != null) {
+ onPackageRemoved(ssp, uid);
+ }
+ } break;
+ case Intent.ACTION_UID_REMOVED: {
+ if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ if (uid >= 0) {
+ onUidRemoved(uid);
+ }
+ }
+ } break;
+ case Intent.ACTION_USER_ADDED: {
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ if (userId >= 0) {
+ onUserAdded(userId);
+ }
+ } break;
+ case Intent.ACTION_USER_STARTED: {
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ if (userId >= 0) {
+ onUserStarted(userId);
+ }
+ } break;
+ case Intent.ACTION_USER_STOPPED: {
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ if (userId >= 0) {
+ onUserStopped(userId);
+ }
+ } break;
+ case Intent.ACTION_USER_REMOVED: {
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ if (userId >= 0) {
+ onUserRemoved(userId);
+ }
+ } break;
+ }
+ }
+ };
+
+ private final BroadcastReceiver mBootReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ switch (intent.getAction()) {
+ case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
+ onLockedBootCompleted();
+ } break;
+ }
+ }
+ };
+
/**
* The restriction levels that each package is on, the levels here are defined in
* {@link android.app.ActivityManager.RESTRICTION_LEVEL_*}.
*/
final class RestrictionSettings {
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
final SparseArrayMap<String, PkgSettings> mRestrictionLevels = new SparseArrayMap();
final class PkgSettings {
@@ -283,6 +366,7 @@
mCurrentRestrictionLevel = mLastRestrictionLevel = RESTRICTION_LEVEL_UNKNOWN;
}
+ @GuardedBy("mSettingsLock")
@RestrictionLevel int update(@RestrictionLevel int level, int reason, int subReason) {
if (level != mCurrentRestrictionLevel) {
mLastRestrictionLevel = mCurrentRestrictionLevel;
@@ -296,6 +380,7 @@
}
@Override
+ @GuardedBy("mSettingsLock")
public String toString() {
final StringBuilder sb = new StringBuilder(128);
sb.append("RestrictionLevel{");
@@ -313,6 +398,7 @@
return sb.toString();
}
+ @GuardedBy("mSettingsLock")
void dump(PrintWriter pw, @ElapsedRealtimeLong long nowElapsed) {
pw.print(toString());
if (mLastRestrictionLevel != RESTRICTION_LEVEL_UNKNOWN) {
@@ -344,18 +430,22 @@
return mUid;
}
+ @GuardedBy("mSettingsLock")
@RestrictionLevel int getCurrentRestrictionLevel() {
return mCurrentRestrictionLevel;
}
+ @GuardedBy("mSettingsLock")
@RestrictionLevel int getLastRestrictionLevel() {
return mLastRestrictionLevel;
}
+ @GuardedBy("mSettingsLock")
int getReason() {
return mReason;
}
+ @GuardedBy("mSettingsLock")
@ElapsedRealtimeLong long getLastNotificationTime(
@NotificationHelper.NotificationType int notificationType) {
if (mLastNotificationShownTimeElapsed == null) {
@@ -364,6 +454,7 @@
return mLastNotificationShownTimeElapsed[notificationType];
}
+ @GuardedBy("mSettingsLock")
void setLastNotificationTime(@NotificationHelper.NotificationType int notificationType,
@ElapsedRealtimeLong long timestamp) {
if (mLastNotificationShownTimeElapsed == null) {
@@ -373,6 +464,7 @@
mLastNotificationShownTimeElapsed[notificationType] = timestamp;
}
+ @GuardedBy("mSettingsLock")
int getNotificationId(@NotificationHelper.NotificationType int notificationType) {
if (mNotificationId == null) {
return 0;
@@ -380,6 +472,7 @@
return mNotificationId[notificationType];
}
+ @GuardedBy("mSettingsLock")
void setNotificationId(@NotificationHelper.NotificationType int notificationType,
int notificationId) {
if (mNotificationId == null) {
@@ -396,7 +489,7 @@
*/
@RestrictionLevel int update(String packageName, int uid, @RestrictionLevel int level,
int reason, int subReason) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
PkgSettings settings = getRestrictionSettingsLocked(uid, packageName);
if (settings == null) {
settings = new PkgSettings(packageName, uid);
@@ -410,7 +503,7 @@
* @return The reason of why it's in this level.
*/
int getReason(String packageName, int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final PkgSettings settings = mRestrictionLevels.get(uid, packageName);
return settings != null ? settings.getReason()
: (REASON_MAIN_DEFAULT | REASON_SUB_DEFAULT_UNDEFINED);
@@ -418,7 +511,7 @@
}
@RestrictionLevel int getRestrictionLevel(int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final int uidKeyIndex = mRestrictionLevels.indexOfKey(uid);
if (uidKeyIndex < 0) {
return RESTRICTION_LEVEL_UNKNOWN;
@@ -440,7 +533,7 @@
}
@RestrictionLevel int getRestrictionLevel(int uid, String packageName) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final PkgSettings settings = getRestrictionSettingsLocked(uid, packageName);
return settings == null
? getRestrictionLevel(uid) : settings.getCurrentRestrictionLevel();
@@ -454,14 +547,14 @@
}
private @RestrictionLevel int getLastRestrictionLevel(int uid, String packageName) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final PkgSettings settings = mRestrictionLevels.get(uid, packageName);
return settings == null
- ? RESTRICTION_LEVEL_UNKNOWN : settings.mLastRestrictionLevel;
+ ? RESTRICTION_LEVEL_UNKNOWN : settings.getLastRestrictionLevel();
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
void forEachPackageInUidLocked(int uid,
@NonNull TriConsumer<String, Integer, Integer> consumer) {
final int uidKeyIndex = mRestrictionLevels.indexOfKey(uid);
@@ -476,20 +569,20 @@
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
void forEachUidLocked(@NonNull Consumer<Integer> consumer) {
for (int i = mRestrictionLevels.numMaps() - 1; i >= 0; i--) {
consumer.accept(mRestrictionLevels.keyAt(i));
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
PkgSettings getRestrictionSettingsLocked(int uid, String packageName) {
return mRestrictionLevels.get(uid, packageName);
}
void removeUser(@UserIdInt int userId) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
for (int i = mRestrictionLevels.numMaps() - 1; i >= 0; i--) {
final int uid = mRestrictionLevels.keyAt(i);
if (UserHandle.getUserId(uid) != userId) {
@@ -501,25 +594,25 @@
}
void removePackage(String pkgName, int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
mRestrictionLevels.delete(uid, pkgName);
}
}
void removeUid(int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
mRestrictionLevels.delete(uid);
}
}
@VisibleForTesting
void reset() {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
mRestrictionLevels.clear();
}
}
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
void dumpLocked(PrintWriter pw, String prefix) {
final ArrayList<PkgSettings> settings = new ArrayList<>();
mRestrictionLevels.forEach(setting -> settings.add(setting));
@@ -804,7 +897,7 @@
void onSystemReady() {
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
- ActivityThread.currentApplication().getMainExecutor(), mConstantsObserver);
+ mBgExecutor, mConstantsObserver);
mConstantsObserver.start();
initBgRestrictionExemptioFromSysConfig();
initRestrictionStates();
@@ -826,10 +919,19 @@
@VisibleForTesting
void resetRestrictionSettings() {
- mRestrictionSettings.reset();
+ synchronized (mSettingsLock) {
+ mRestrictionSettings.reset();
+ }
initRestrictionStates();
}
+ @VisibleForTesting
+ void tearDown() {
+ DeviceConfig.removeOnPropertiesChangedListener(mConstantsObserver);
+ unregisterForUidObservers();
+ unregisterForSystemBroadcasts();
+ }
+
private void initBgRestrictionExemptioFromSysConfig() {
mBgRestrictionExemptioFromSysConfig =
SystemConfig.getInstance().getBgRestrictionExemption();
@@ -912,6 +1014,14 @@
}
}
+ private void unregisterForUidObservers() {
+ try {
+ mInjector.getIActivityManager().unregisterUidObserver(mUidObserver);
+ } catch (RemoteException e) {
+ // Intra-process call, it won't happen.
+ }
+ }
+
/**
* Called when initializing a user.
*/
@@ -1212,9 +1322,11 @@
prefix = " " + prefix;
pw.print(prefix);
pw.println("BACKGROUND RESTRICTION LEVEL SETTINGS");
- synchronized (mLock) {
+ /*
+ synchronized (mSettingsLock) {
mRestrictionSettings.dumpLocked(pw, " " + prefix);
}
+ */
mConstantsObserver.dump(pw, " " + prefix);
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
pw.println();
@@ -1226,7 +1338,7 @@
int curBucket, boolean allowUpdateBucket, int reason, int subReason) {
int curLevel;
int prevReason;
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
curLevel = getRestrictionLevel(uid, pkgName);
if (curLevel == level) {
// Nothing to do.
@@ -1264,7 +1376,7 @@
|| level == RESTRICTION_LEVEL_RESTRICTED_BUCKET)) {
// restrict the app if it hasn't done so.
boolean doIt = true;
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final int index = mActiveUids.indexOfKey(uid, pkgName);
if (index >= 0) {
// It's currently active, enqueue it.
@@ -1282,7 +1394,7 @@
&& level < RESTRICTION_LEVEL_RESTRICTED_BUCKET) {
// Moved out of the background-restricted state.
if (curBucket != STANDBY_BUCKET_RARE) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final int index = mActiveUids.indexOfKey(uid, pkgName);
if (index >= 0) {
mActiveUids.add(uid, pkgName, null);
@@ -1340,7 +1452,7 @@
private void dispatchAutoRestrictedBucketFeatureFlagChanged(boolean newValue) {
final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal();
final ArrayList<Runnable> pendingTasks = new ArrayList<>();
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
mRestrictionSettings.forEachUidLocked(uid -> {
mRestrictionSettings.forEachPackageInUidLocked(uid, (pkgName, level, reason) -> {
if (level == RESTRICTION_LEVEL_BACKGROUND_RESTRICTED) {
@@ -1434,6 +1546,7 @@
private final NotificationManager mNotificationManager;
private final Injector mInjector;
private final Object mLock;
+ private final Object mSettingsLock;
private final Context mContext;
private final BroadcastReceiver mActionButtonReceiver = new BroadcastReceiver() {
@@ -1454,7 +1567,7 @@
}
};
- @GuardedBy("mLock")
+ @GuardedBy("mSettingsLock")
private int mNotificationIDStepper = SUMMARY_NOTIFICATION_ID + 1;
NotificationHelper(AppRestrictionController controller) {
@@ -1462,6 +1575,7 @@
mInjector = controller.mInjector;
mNotificationManager = mInjector.getNotificationManager();
mLock = controller.mLock;
+ mSettingsLock = controller.mSettingsLock;
mContext = mInjector.getContext();
}
@@ -1540,7 +1654,7 @@
int getNotificationIdIfNecessary(@NotificationType int notificationType,
String packageName, int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final RestrictionSettings.PkgSettings settings = mBgController.mRestrictionSettings
.getRestrictionSettingsLocked(uid, packageName);
if (settings == null) {
@@ -1644,7 +1758,7 @@
}
void cancelRequestBgRestrictedIfNecessary(String packageName, int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final RestrictionSettings.PkgSettings settings = mBgController.mRestrictionSettings
.getRestrictionSettingsLocked(uid, packageName);
if (settings != null) {
@@ -1658,7 +1772,7 @@
}
void cancelLongRunningFGSNotificationIfNecessary(String packageName, int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final RestrictionSettings.PkgSettings settings = mBgController.mRestrictionSettings
.getRestrictionSettingsLocked(uid, packageName);
if (settings != null) {
@@ -1674,7 +1788,7 @@
void handleUidInactive(int uid, boolean disabled) {
final ArrayList<Runnable> pendingTasks = mTmpRunnables;
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final int index = mActiveUids.indexOfKey(uid);
if (index < 0) {
return;
@@ -1695,7 +1809,7 @@
}
void handleUidActive(int uid) {
- synchronized (mLock) {
+ synchronized (mSettingsLock) {
final AppStandbyInternal appStandbyInternal = mInjector.getAppStandbyInternal();
final int userId = UserHandle.getUserId(uid);
mRestrictionSettings.forEachPackageInUidLocked(uid, (pkgName, level, reason) -> {
@@ -2147,104 +2261,28 @@
}
private void registerForSystemBroadcasts() {
- final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- switch (intent.getAction()) {
- case Intent.ACTION_PACKAGE_ADDED: {
- if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
- final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- if (uid >= 0) {
- onUidAdded(uid);
- }
- }
- }
- // fall through.
- case Intent.ACTION_PACKAGE_CHANGED: {
- final String pkgName = intent.getData().getSchemeSpecificPart();
- final String[] cmpList = intent.getStringArrayExtra(
- Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
- // If this is PACKAGE_ADDED (cmpList == null), or if it's a whole-package
- // enable/disable event (cmpList is just the package name itself), drop
- // our carrier privileged app & system-app caches and let them refresh
- if (cmpList == null
- || (cmpList.length == 1 && pkgName.equals(cmpList[0]))) {
- clearCarrierPrivilegedApps();
- }
- } break;
- case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
- final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- final Uri data = intent.getData();
- String ssp;
- if (uid >= 0 && data != null
- && (ssp = data.getSchemeSpecificPart()) != null) {
- onPackageRemoved(ssp, uid);
- }
- } break;
- case Intent.ACTION_UID_REMOVED: {
- if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
- final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- if (uid >= 0) {
- onUidRemoved(uid);
- }
- }
- } break;
- case Intent.ACTION_USER_ADDED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (userId >= 0) {
- onUserAdded(userId);
- }
- } break;
- case Intent.ACTION_USER_STARTED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (userId >= 0) {
- onUserStarted(userId);
- }
- } break;
- case Intent.ACTION_USER_STOPPED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (userId >= 0) {
- onUserStopped(userId);
- }
- } break;
- case Intent.ACTION_USER_REMOVED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- if (userId >= 0) {
- onUserRemoved(userId);
- }
- } break;
- }
- }
- };
final IntentFilter packageFilter = new IntentFilter();
packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
packageFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
packageFilter.addDataScheme("package");
- mContext.registerReceiverForAllUsers(broadcastReceiver, packageFilter, null, mBgHandler);
+ mContext.registerReceiverForAllUsers(mBroadcastReceiver, packageFilter, null, mBgHandler);
final IntentFilter userFilter = new IntentFilter();
userFilter.addAction(Intent.ACTION_USER_ADDED);
userFilter.addAction(Intent.ACTION_USER_REMOVED);
userFilter.addAction(Intent.ACTION_UID_REMOVED);
- mContext.registerReceiverForAllUsers(broadcastReceiver, userFilter, null, mBgHandler);
- final BroadcastReceiver bootReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- switch (intent.getAction()) {
- case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
- onLockedBootCompleted();
- } break;
- }
- }
- };
+ mContext.registerReceiverForAllUsers(mBroadcastReceiver, userFilter, null, mBgHandler);
final IntentFilter bootFilter = new IntentFilter();
bootFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
- mContext.registerReceiverAsUser(bootReceiver, UserHandle.SYSTEM,
+ mContext.registerReceiverAsUser(mBootReceiver, UserHandle.SYSTEM,
bootFilter, null, mBgHandler);
}
+ private void unregisterForSystemBroadcasts() {
+ mContext.unregisterReceiver(mBroadcastReceiver);
+ mContext.unregisterReceiver(mBootReceiver);
+ }
+
void forEachTracker(Consumer<BaseAppStateTracker> sink) {
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
sink.accept(mAppStateTrackers.get(i));
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 8d77eda..6a211d3 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1499,7 +1499,6 @@
int adj;
int schedGroup;
int procState;
- int cachedAdjSeq;
int capability = cycleReEval ? app.mState.getCurCapability() : 0;
boolean foregroundActivities = false;
diff --git a/services/core/java/com/android/server/audio/TEST_MAPPING b/services/core/java/com/android/server/audio/TEST_MAPPING
index 5a6c6a5..f3a73f0 100644
--- a/services/core/java/com/android/server/audio/TEST_MAPPING
+++ b/services/core/java/com/android/server/audio/TEST_MAPPING
@@ -8,6 +8,9 @@
},
{
"include-filter": "android.media.audio.cts.AudioFocusTest"
+ },
+ {
+ "include-filter": "android.media.audio.cts.SpatializerTest"
}
]
}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index f5001102..9bfdd68 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -204,8 +204,8 @@
private static final String PROP_DEFAULT_DISPLAY_TOP_INSET = "persist.sys.displayinset.top";
private static final long WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT = 10000;
// This value needs to be in sync with the threshold
- // in RefreshRateConfigs::getFrameRateDivider.
- private static final float THRESHOLD_FOR_REFRESH_RATES_DIVIDERS = 0.0009f;
+ // in RefreshRateConfigs::getFrameRateDivisor.
+ private static final float THRESHOLD_FOR_REFRESH_RATES_DIVISORS = 0.0009f;
private static final int MSG_REGISTER_DEFAULT_DISPLAY_ADAPTERS = 1;
private static final int MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS = 2;
@@ -895,13 +895,13 @@
return info;
}
- // Override the refresh rate only if it is a divider of the current
+ // Override the refresh rate only if it is a divisor of the current
// refresh rate. This calculation needs to be in sync with the native code
- // in RefreshRateConfigs::getFrameRateDivider
+ // in RefreshRateConfigs::getFrameRateDivisor
Display.Mode currentMode = info.getMode();
float numPeriods = currentMode.getRefreshRate() / frameRateHz;
float numPeriodsRound = Math.round(numPeriods);
- if (Math.abs(numPeriods - numPeriodsRound) > THRESHOLD_FOR_REFRESH_RATES_DIVIDERS) {
+ if (Math.abs(numPeriods - numPeriodsRound) > THRESHOLD_FOR_REFRESH_RATES_DIVISORS) {
return info;
}
frameRateHz = currentMode.getRefreshRate() / numPeriodsRound;
@@ -913,9 +913,9 @@
continue;
}
- if (mode.getRefreshRate() >= frameRateHz - THRESHOLD_FOR_REFRESH_RATES_DIVIDERS
+ if (mode.getRefreshRate() >= frameRateHz - THRESHOLD_FOR_REFRESH_RATES_DIVISORS
&& mode.getRefreshRate()
- <= frameRateHz + THRESHOLD_FOR_REFRESH_RATES_DIVIDERS) {
+ <= frameRateHz + THRESHOLD_FOR_REFRESH_RATES_DIVISORS) {
if (DEBUG) {
Slog.d(TAG, "found matching modeId " + mode.getModeId());
}
@@ -2463,7 +2463,7 @@
pw.println(" mMinimumBrightnessCurve=" + mMinimumBrightnessCurve);
if (mUserPreferredMode != null) {
- pw.println(mUserPreferredMode);
+ pw.println(" mUserPreferredMode=" + mUserPreferredMode);
}
pw.println();
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 2e80efb..7a0cf4b 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -884,20 +884,26 @@
public void setUserPreferredDisplayModeLocked(Display.Mode mode) {
final int oldModeId = getPreferredModeId();
mUserPreferredMode = mode;
- if (mode != null && (mode.isRefreshRateSet() ^ mode.isResolutionSet())) {
- mUserPreferredMode = findMode(mode.getPhysicalWidth(),
+ if (mode != null && (mode.isRefreshRateSet() || mode.isResolutionSet())) {
+ Display.Mode matchingSupportedMode;
+ matchingSupportedMode = findMode(mode.getPhysicalWidth(),
mode.getPhysicalHeight(), mode.getRefreshRate());
+ if (matchingSupportedMode != null) {
+ mUserPreferredMode = matchingSupportedMode;
+ }
}
- mUserPreferredModeId = findUserPreferredModeIdLocked(mode);
- if (oldModeId != getPreferredModeId()) {
- updateDeviceInfoLocked();
+ mUserPreferredModeId = findUserPreferredModeIdLocked(mUserPreferredMode);
+
+ if (oldModeId == getPreferredModeId()) {
+ return;
}
+ updateDeviceInfoLocked();
if (!mSurfaceControlProxy.getBootDisplayModeSupport()) {
return;
}
- if (mUserPreferredMode == null) {
+ if (mUserPreferredModeId == INVALID_MODE_ID) {
mSurfaceControlProxy.clearBootDisplayMode(getDisplayTokenLocked());
} else {
int preferredSfDisplayModeId = findSfDisplayModeIdLocked(
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
index fb36dc7..d04b5a2 100644
--- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
@@ -346,6 +346,7 @@
writer.println("DisplayWhiteBalanceController");
writer.println(" mLoggingEnabled=" + mLoggingEnabled);
writer.println(" mEnabled=" + mEnabled);
+ writer.println(" mStrongModeEnabled=" + mStrongModeEnabled);
writer.println(" mDisplayPowerControllerCallbacks=" + mDisplayPowerControllerCallbacks);
mBrightnessSensor.dump(writer);
mBrightnessFilter.dump(writer);
diff --git a/services/core/java/com/android/server/locales/LocaleManagerService.java b/services/core/java/com/android/server/locales/LocaleManagerService.java
index c427705..176c08c 100644
--- a/services/core/java/com/android/server/locales/LocaleManagerService.java
+++ b/services/core/java/com/android/server/locales/LocaleManagerService.java
@@ -78,10 +78,20 @@
Process.THREAD_PRIORITY_BACKGROUND);
broadcastHandlerThread.start();
+ SystemAppUpdateTracker systemAppUpdateTracker =
+ new SystemAppUpdateTracker(this);
+ broadcastHandlerThread.getThreadHandler().postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ systemAppUpdateTracker.init();
+ }
+ });
+
mBackupHelper = new LocaleManagerBackupHelper(this,
mPackageManagerInternal, broadcastHandlerThread);
- mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper);
+ mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper,
+ systemAppUpdateTracker);
mPackageMonitor.register(context, broadcastHandlerThread.getLooper(),
UserHandle.ALL,
true);
@@ -246,7 +256,7 @@
* <p><b>Note:</b> This is can be used by installers to deal with cases such as
* language-based APK Splits.
*/
- private void notifyInstallerOfAppWhoseLocaleChanged(String appPackageName, int userId,
+ void notifyInstallerOfAppWhoseLocaleChanged(String appPackageName, int userId,
LocaleList locales) {
String installingPackageName = getInstallingPackageName(appPackageName);
if (installingPackageName != null) {
@@ -271,7 +281,7 @@
mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
}
- private static Intent createBaseIntent(String intentAction, String appPackageName,
+ static Intent createBaseIntent(String intentAction, String appPackageName,
LocaleList locales) {
return new Intent(intentAction)
.putExtra(Intent.EXTRA_PACKAGE_NAME, appPackageName)
@@ -406,7 +416,7 @@
}
@Nullable
- private String getInstallingPackageName(String packageName) {
+ String getInstallingPackageName(String packageName) {
try {
return mContext.getPackageManager()
.getInstallSourceInfo(packageName).getInstallingPackageName();
diff --git a/services/core/java/com/android/server/locales/LocaleManagerServicePackageMonitor.java b/services/core/java/com/android/server/locales/LocaleManagerServicePackageMonitor.java
index b459be7..32080ef 100644
--- a/services/core/java/com/android/server/locales/LocaleManagerServicePackageMonitor.java
+++ b/services/core/java/com/android/server/locales/LocaleManagerServicePackageMonitor.java
@@ -23,13 +23,22 @@
*
* <p> These listeners forward the call to different aspects of locale service that
* handle the business logic.
- * <p> We're interested in package added, package data cleared and package removed events.
+ * <p> We're interested in the following events:
+ * <ul>
+ * <li> Package added
+ * <li> Package data cleared
+ * <li> Package removed
+ * <li> Package Updated
+ * </ul>
*/
final class LocaleManagerServicePackageMonitor extends PackageMonitor {
private LocaleManagerBackupHelper mBackupHelper;
+ private SystemAppUpdateTracker mSystemAppUpdateTracker;
- LocaleManagerServicePackageMonitor(LocaleManagerBackupHelper localeManagerBackupHelper) {
+ LocaleManagerServicePackageMonitor(LocaleManagerBackupHelper localeManagerBackupHelper,
+ SystemAppUpdateTracker systemAppUpdateTracker) {
mBackupHelper = localeManagerBackupHelper;
+ mSystemAppUpdateTracker = systemAppUpdateTracker;
}
@Override
@@ -46,4 +55,9 @@
public void onPackageRemoved(String packageName, int uid) {
mBackupHelper.onPackageRemoved();
}
+
+ @Override
+ public void onPackageUpdateFinished(String packageName, int uid) {
+ mSystemAppUpdateTracker.onPackageUpdateFinished(packageName, uid);
+ }
}
diff --git a/services/core/java/com/android/server/locales/SystemAppUpdateTracker.java b/services/core/java/com/android/server/locales/SystemAppUpdateTracker.java
new file mode 100644
index 0000000..d13b1f4
--- /dev/null
+++ b/services/core/java/com/android/server/locales/SystemAppUpdateTracker.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locales;
+
+import static com.android.server.locales.LocaleManagerService.DEBUG;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.os.LocaleList;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.AtomicFile;
+import android.util.Slog;
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
+import android.util.Xml;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.XmlUtils;
+
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Track if a system app is being updated for the first time after the user completed device setup.
+ *
+ * <p> The entire operation is being done on a background thread from {@link LocaleManagerService}.
+ * If it is the first time that a system app is being updated, then it fetches the app-specific
+ * locales and sends a broadcast to the newly set installer of the app. It maintains a file to store
+ * the name of the apps that have been updated.
+ */
+public class SystemAppUpdateTracker {
+ private static final String TAG = "SystemAppUpdateTracker";
+ private static final String PACKAGE_XML_TAG = "package";
+ private static final String ATTR_NAME = "name";
+ private static final String SYSTEM_APPS_XML_TAG = "system_apps";
+
+ private final Context mContext;
+ private final LocaleManagerService mLocaleManagerService;
+ private final AtomicFile mUpdatedAppsFile;
+
+ // Lock used while writing to the file.
+ private final Object mFileLock = new Object();
+
+ // In-memory list of all the system apps that have been updated once after device setup.
+ // We do not need to store the userid->packages mapping because when updating a system app on
+ // one user updates for all users.
+ private final Set<String> mUpdatedApps = new HashSet<>();
+
+ SystemAppUpdateTracker(LocaleManagerService localeManagerService) {
+ this(localeManagerService.mContext, localeManagerService, new AtomicFile(
+ new File(Environment.getDataSystemDirectory(),
+ /* child = */ "locale_manager_service_updated_system_apps.xml")));
+ }
+
+ @VisibleForTesting
+ SystemAppUpdateTracker(Context context, LocaleManagerService localeManagerService,
+ AtomicFile file) {
+ mContext = context;
+ mLocaleManagerService = localeManagerService;
+ mUpdatedAppsFile = file;
+ }
+
+ /**
+ * Loads the info of updated system apps from the file.
+ *
+ * <p> Invoked once during device boot from {@link LocaleManagerService} by a background thread.
+ */
+ void init() {
+ if (DEBUG) {
+ Slog.d(TAG, "Loading the app info from storage. ");
+ }
+ loadUpdatedSystemApps();
+ }
+
+ /**
+ * Reads the XML stored in the {@link #mUpdatedAppsFile} and populates it in the in-memory list
+ * {@link #mUpdatedApps}.
+ */
+ private void loadUpdatedSystemApps() {
+ if (!mUpdatedAppsFile.getBaseFile().exists()) {
+ if (DEBUG) {
+ Slog.d(TAG, "loadUpdatedSystemApps: File does not exist.");
+ }
+ return;
+ }
+ InputStream updatedAppNamesInputStream = null;
+ try {
+ updatedAppNamesInputStream = mUpdatedAppsFile.openRead();
+ readFromXml(updatedAppNamesInputStream);
+ } catch (IOException | XmlPullParserException e) {
+ Slog.e(TAG, "loadUpdatedSystemApps: Could not parse storage file ", e);
+ } finally {
+ IoUtils.closeQuietly(updatedAppNamesInputStream);
+ }
+ }
+
+ /**
+ * Parses the update data from the serialized XML input stream.
+ */
+ private void readFromXml(InputStream updateInfoInputStream)
+ throws XmlPullParserException, IOException {
+ final TypedXmlPullParser parser = Xml.newFastPullParser();
+ parser.setInput(updateInfoInputStream, StandardCharsets.UTF_8.name());
+ XmlUtils.beginDocument(parser, SYSTEM_APPS_XML_TAG);
+ int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (parser.getName().equals(PACKAGE_XML_TAG)) {
+ String packageName = parser.getAttributeValue(/* namespace= */ null,
+ ATTR_NAME);
+ if (!TextUtils.isEmpty(packageName)) {
+ mUpdatedApps.add(packageName);
+ }
+ }
+ }
+ }
+
+ /**
+ * Sends a broadcast to the newly set installer with app-locales if it is a system app being
+ * updated for the first time.
+ *
+ * <p><b>Note:</b> Invoked by service's common monitor
+ * {@link LocaleManagerServicePackageMonitor#onPackageUpdateFinished} when a package updated.
+ */
+ void onPackageUpdateFinished(String packageName, int uid) {
+ try {
+ if ((!mUpdatedApps.contains(packageName)) && isUpdatedSystemApp(packageName)) {
+ // If a system app is updated, verify that it has an installer-on-record.
+ String installingPackageName = mLocaleManagerService.getInstallingPackageName(
+ packageName);
+ if (installingPackageName == null) {
+ // We want to broadcast the locales info to the installer.
+ // If this app does not have an installer then do nothing.
+ return;
+ }
+
+ try {
+ int userId = UserHandle.getUserId(uid);
+ // Fetch the app-specific locales.
+ // If non-empty then send the info to the installer.
+ LocaleList appLocales = mLocaleManagerService.getApplicationLocales(
+ packageName, userId);
+ if (!appLocales.isEmpty()) {
+ // The broadcast would be sent to the newly set installer of the
+ // updated system app.
+ mLocaleManagerService.notifyInstallerOfAppWhoseLocaleChanged(packageName,
+ userId, appLocales);
+ }
+ } catch (RemoteException e) {
+ if (DEBUG) {
+ Slog.d(TAG, "onPackageUpdateFinished: Error in fetching app locales");
+ }
+ }
+ updateBroadcastedAppsList(packageName);
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Exception in onPackageUpdateFinished.", e);
+ }
+ }
+
+ /**
+ * Writes in-memory data {@link #mUpdatedApps} to the storage file in a synchronized manner.
+ */
+ private void updateBroadcastedAppsList(String packageName) {
+ synchronized (mFileLock) {
+ mUpdatedApps.add(packageName);
+ writeUpdatedAppsFileLocked();
+ }
+ }
+
+ private void writeUpdatedAppsFileLocked() {
+ FileOutputStream stream = null;
+ try {
+ stream = mUpdatedAppsFile.startWrite();
+ writeToXmlLocked(stream);
+ mUpdatedAppsFile.finishWrite(stream);
+ } catch (IOException e) {
+ mUpdatedAppsFile.failWrite(stream);
+ Slog.e(TAG, "Failed to persist the updated apps list", e);
+ }
+ }
+
+ /**
+ * Converts the list of updated app data into a serialized xml stream.
+ */
+ private void writeToXmlLocked(OutputStream stream) throws IOException {
+ final TypedXmlSerializer xml = Xml.newFastSerializer();
+ xml.setOutput(stream, StandardCharsets.UTF_8.name());
+ xml.startDocument(/* encoding= */ null, /* standalone= */ true);
+ xml.startTag(/* namespace= */ null, SYSTEM_APPS_XML_TAG);
+
+ for (String packageName : mUpdatedApps) {
+ xml.startTag(/* namespace= */ null, PACKAGE_XML_TAG);
+ xml.attribute(/* namespace= */ null, ATTR_NAME, packageName);
+ xml.endTag(/* namespace= */ null, PACKAGE_XML_TAG);
+ }
+
+ xml.endTag(null, SYSTEM_APPS_XML_TAG);
+ xml.endDocument();
+ }
+
+ private boolean isUpdatedSystemApp(String packageName) {
+ ApplicationInfo appInfo = null;
+ try {
+ appInfo = mContext.getPackageManager().getApplicationInfo(packageName,
+ PackageManager.ApplicationInfoFlags.of(PackageManager.MATCH_SYSTEM_ONLY));
+ } catch (PackageManager.NameNotFoundException e) {
+ if (DEBUG) {
+ Slog.d(TAG, "isUpdatedSystemApp: Package not found " + packageName);
+ }
+ }
+ if (appInfo == null) {
+ return false;
+ }
+ return (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
+ }
+
+ @VisibleForTesting
+ Set<String> getUpdatedApps() {
+ return mUpdatedApps;
+ }
+}
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 45d9822..fac5106 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -1127,7 +1127,7 @@
if (provider != null && !provider.equals(manager.getName())) {
continue;
}
- CallerIdentity identity = manager.getIdentity();
+ CallerIdentity identity = manager.getProviderIdentity();
if (identity == null) {
continue;
}
@@ -1149,7 +1149,7 @@
return Collections.emptyList();
}
- CallerIdentity identity = manager.getIdentity();
+ CallerIdentity identity = manager.getProviderIdentity();
if (identity == null) {
return Collections.emptyList();
}
@@ -1536,7 +1536,7 @@
if (!enabled) {
PackageTagsList.Builder builder = new PackageTagsList.Builder();
for (LocationProviderManager manager : mProviderManagers) {
- CallerIdentity identity = manager.getIdentity();
+ CallerIdentity identity = manager.getProviderIdentity();
if (identity != null) {
builder.add(identity.getPackageName(), identity.getAttributionTag());
}
@@ -1624,7 +1624,7 @@
if (provider != null && !provider.equals(manager.getName())) {
continue;
}
- if (identity.equals(manager.getIdentity())) {
+ if (identity.equals(manager.getProviderIdentity())) {
return true;
}
}
@@ -1665,7 +1665,7 @@
if (listener != null) {
ArraySet<Integer> uids = new ArraySet<>(mProviderManagers.size());
for (LocationProviderManager manager : mProviderManagers) {
- CallerIdentity identity = manager.getIdentity();
+ CallerIdentity identity = manager.getProviderIdentity();
if (identity != null) {
uids.add(identity.getUid());
}
diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
index 0b8f94c..acbee11 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -1468,7 +1468,7 @@
return mProvider.getState();
}
- public @Nullable CallerIdentity getIdentity() {
+ public @Nullable CallerIdentity getProviderIdentity() {
return mProvider.getState().identity;
}
@@ -1607,7 +1607,7 @@
public @Nullable Location getLastLocation(LastLocationRequest request,
CallerIdentity identity, @PermissionLevel int permissionLevel) {
- request = calculateLastLocationRequest(request);
+ request = calculateLastLocationRequest(request, identity);
if (!isActive(request.isBypass(), identity)) {
return null;
@@ -1636,15 +1636,16 @@
return location;
}
- private LastLocationRequest calculateLastLocationRequest(LastLocationRequest baseRequest) {
+ private LastLocationRequest calculateLastLocationRequest(LastLocationRequest baseRequest,
+ CallerIdentity identity) {
LastLocationRequest.Builder builder = new LastLocationRequest.Builder(baseRequest);
boolean locationSettingsIgnored = baseRequest.isLocationSettingsIgnored();
if (locationSettingsIgnored) {
// if we are not currently allowed use location settings ignored, disable it
if (!mSettingsHelper.getIgnoreSettingsAllowlist().contains(
- getIdentity().getPackageName(), getIdentity().getAttributionTag())
- && !mLocationManagerInternal.isProvider(null, getIdentity())) {
+ identity.getPackageName(), identity.getAttributionTag())
+ && !mLocationManagerInternal.isProvider(null, identity)) {
locationSettingsIgnored = false;
}
@@ -1658,7 +1659,7 @@
Log.e(TAG, "adas gnss bypass request received in non-gps provider");
adasGnssBypass = false;
} else if (!mLocationSettings.getUserSettings(
- getIdentity().getUserId()).isAdasGnssLocationEnabled()) {
+ identity.getUserId()).isAdasGnssLocationEnabled()) {
adasGnssBypass = false;
}
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 9b10058..6a2b2d5 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -348,6 +348,13 @@
public abstract String getApexModuleNameForPackageName(String apexPackageName);
/**
+ * Returns the package name of the active APEX whose name is {@code apexModuleName}. If not
+ * found, returns {@code null}.
+ */
+ @Nullable
+ public abstract String getActivePackageNameForApexModuleName(String apexModuleName);
+
+ /**
* Copies the CE apex data directory for the given {@code userId} to a backup location, for use
* in case of rollback.
*
@@ -485,6 +492,12 @@
private ArrayMap<String, String> mPackageNameToApexModuleName;
/**
+ * Reverse mapping of {@link #mPackageNameToApexModuleName}, for active packages only.
+ */
+ @GuardedBy("mLock")
+ private ArrayMap<String, String> mApexModuleNameToActivePackageName;
+
+ /**
* Whether an APEX package is active or not.
*
* @param packageInfo the package to check
@@ -552,6 +565,7 @@
try {
mAllPackagesCache = new ArrayList<>();
mPackageNameToApexModuleName = new ArrayMap<>();
+ mApexModuleNameToActivePackageName = new ArrayMap<>();
allPkgs = waitForApexService().getAllPackages();
} catch (RemoteException re) {
Slog.e(TAG, "Unable to retrieve packages from apexservice: " + re.toString());
@@ -634,6 +648,13 @@
+ packageInfo.packageName);
}
activePackagesSet.add(packageInfo.packageName);
+ if (mApexModuleNameToActivePackageName.containsKey(ai.moduleName)) {
+ throw new IllegalStateException(
+ "Two active packages have the same APEX module name: "
+ + ai.moduleName);
+ }
+ mApexModuleNameToActivePackageName.put(
+ ai.moduleName, packageInfo.packageName);
}
if (ai.isFactory) {
// Don't throw when the duplicating APEX is VNDK APEX
@@ -967,6 +988,16 @@
}
@Override
+ @Nullable
+ public String getActivePackageNameForApexModuleName(String apexModuleName) {
+ synchronized (mLock) {
+ Preconditions.checkState(mApexModuleNameToActivePackageName != null,
+ "APEX packages have not been scanned");
+ return mApexModuleNameToActivePackageName.get(apexModuleName);
+ }
+ }
+
+ @Override
public boolean snapshotCeData(int userId, int rollbackId, String apexPackageName) {
String apexModuleName;
synchronized (mLock) {
@@ -1391,6 +1422,12 @@
}
@Override
+ @Nullable
+ public String getActivePackageNameForApexModuleName(String apexModuleName) {
+ return null;
+ }
+
+ @Override
public boolean snapshotCeData(int userId, int rollbackId, String apexPackageName) {
throw new UnsupportedOperationException();
}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index db0b0c58..54c2019 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1607,6 +1607,13 @@
+ oldSharedUid + " to " + newSharedUid);
}
+ // APK should not re-join shared UID
+ if (oldPackage.isLeavingSharedUid() && !parsedPackage.isLeavingSharedUid()) {
+ throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
+ "Package " + parsedPackage.getPackageName()
+ + " attempting to rejoin " + newSharedUid);
+ }
+
// In case of rollback, remember per-user/profile install state
allUsers = mPm.mUserManager.getUserIds();
installedUsers = ps.queryInstalledUsers(allUsers, true);
diff --git a/services/core/java/com/android/server/security/AndroidKeystoreAttestationVerificationAttributes.java b/services/core/java/com/android/server/security/AndroidKeystoreAttestationVerificationAttributes.java
new file mode 100644
index 0000000..3543e93
--- /dev/null
+++ b/services/core/java/com/android/server/security/AndroidKeystoreAttestationVerificationAttributes.java
@@ -0,0 +1,468 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.security;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
+import com.android.framework.protobuf.ByteString;
+import com.android.internal.org.bouncycastle.asn1.ASN1Boolean;
+import com.android.internal.org.bouncycastle.asn1.ASN1Encodable;
+import com.android.internal.org.bouncycastle.asn1.ASN1Enumerated;
+import com.android.internal.org.bouncycastle.asn1.ASN1InputStream;
+import com.android.internal.org.bouncycastle.asn1.ASN1Integer;
+import com.android.internal.org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import com.android.internal.org.bouncycastle.asn1.ASN1OctetString;
+import com.android.internal.org.bouncycastle.asn1.ASN1Sequence;
+import com.android.internal.org.bouncycastle.asn1.ASN1Set;
+import com.android.internal.org.bouncycastle.asn1.ASN1TaggedObject;
+import com.android.internal.org.bouncycastle.asn1.x509.Certificate;
+
+import java.nio.charset.StandardCharsets;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Parsed {@link X509Certificate} attestation extension values for Android Keystore attestations.
+ *
+ * Pull fields out of the top-level sequence. A full description of this structure is at
+ * https://source.android.com/security/keystore/attestation.
+ *
+ * If a value is null or empty, then it was not set/found in the extension values.
+ *
+ */
+class AndroidKeystoreAttestationVerificationAttributes {
+ // The OID for the extension Android Keymaster puts into device-generated certificates.
+ private static final String ANDROID_KEYMASTER_KEY_DESCRIPTION_EXTENSION_OID =
+ "1.3.6.1.4.1.11129.2.1.17";
+
+ // ASN.1 sequence index values for the Android Keymaster extension.
+ private static final int ATTESTATION_VERSION_INDEX = 0;
+ private static final int ATTESTATION_SECURITY_LEVEL_INDEX = 1;
+ private static final int KEYMASTER_VERSION_INDEX = 2;
+ private static final int KEYMASTER_SECURITY_LEVEL_INDEX = 3;
+ private static final int ATTESTATION_CHALLENGE_INDEX = 4;
+ private static final int KEYMASTER_UNIQUE_ID_INDEX = 5;
+ private static final int SW_ENFORCED_INDEX = 6;
+ private static final int HW_ENFORCED_INDEX = 7;
+ private static final int VERIFIED_BOOT_KEY_INDEX = 0;
+ private static final int VERIFIED_BOOT_LOCKED_INDEX = 1;
+ private static final int VERIFIED_BOOT_STATE_INDEX = 2;
+ private static final int VERIFIED_BOOT_HASH_INDEX = 3;
+
+ // ASN.1 sequence index values for the Android Keystore application id.
+ private static final int PACKAGE_INFO_SET_INDEX = 0;
+ private static final int PACKAGE_SIGNATURE_SET_INDEX = 1;
+ private static final int PACKAGE_INFO_NAME_INDEX = 0;
+ private static final int PACKAGE_INFO_VERSION_INDEX = 1;
+
+ // See these AOSP files: hardware/libhardware/include/hardware/hw_auth_token.h
+ private static final int HW_AUTH_NONE = 0;
+
+ // Some keymaster constants. See this AOSP file:
+ // hardware/libhardware/include/hardware/keymaster_defs.h
+ private static final int KM_TAG_NO_AUTH_REQUIRED = 503;
+ private static final int KM_TAG_UNLOCKED_DEVICE_REQUIRED = 509;
+ private static final int KM_TAG_ALL_APPLICATIONS = 600;
+ private static final int KM_TAG_ROOT_OF_TRUST = 704;
+ private static final int KM_TAG_OS_VERSION = 705;
+ private static final int KM_TAG_OS_PATCHLEVEL = 706;
+ private static final int KM_TAG_ATTESTATION_APPLICATION_ID = 709;
+ private static final int KM_TAG_ATTESTATION_ID_BRAND = 710;
+ private static final int KM_TAG_ATTESTATION_ID_DEVICE = 711;
+ private static final int KM_TAG_ATTESTATION_ID_PRODUCT = 712;
+ private static final int KM_TAG_VENDOR_PATCHLEVEL = 718;
+ private static final int KM_TAG_BOOT_PATCHLEVEL = 719;
+
+ private static final int KM_SECURITY_LEVEL_SOFTWARE = 0;
+ private static final int KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT = 1;
+ private static final int KM_SECURITY_LEVEL_STRONG_BOX = 2;
+ private static final int KM_VERIFIED_BOOT_STATE_VERIFIED = 0;
+ private static final int KM_VERIFIED_BOOT_STATE_SELF_SIGNED = 1;
+ private static final int KM_VERIFIED_BOOT_STATE_UNVERIFIED = 2;
+ private static final int KM_VERIFIED_BOOT_STATE_FAILED = 3;
+
+ private Integer mAttestationVersion = null;
+ private SecurityLevel mAttestationSecurityLevel = null;
+ private boolean mAttestationHardwareBacked = false;
+ private Integer mKeymasterVersion = null;
+ private SecurityLevel mKeymasterSecurityLevel = null;
+ private boolean mKeymasterHardwareBacked = false;
+ private ByteString mAttestationChallenge = null;
+ private ByteString mKeymasterUniqueId = null;
+ private String mDeviceBrand = null;
+ private String mDeviceName = null;
+ private String mDeviceProductName = null;
+ private boolean mKeyAllowedForAllApplications = false;
+ private Integer mKeyAuthenticatorType = null;
+ private Integer mKeyBootPatchLevel = null;
+ private Integer mKeyOsPatchLevel = null;
+ private Integer mKeyOsVersion = null;
+ private Integer mKeyVendorPatchLevel = null;
+ private Boolean mKeyRequiresUnlockedDevice = null;
+ private ByteString mVerifiedBootHash = null;
+ private ByteString mVerifiedBootKey = null;
+ private Boolean mVerifiedBootLocked = null;
+ private VerifiedBootState mVerifiedBootState = null;
+ private Map<String, Long> mApplicationPackageNameVersion = null;
+ private List<ByteString> mApplicationCertificateDigests = null;
+
+ enum VerifiedBootState {
+ VERIFIED,
+ SELF_SIGNED,
+ UNVERIFIED,
+ FAILED
+ }
+
+ enum SecurityLevel {
+ SOFTWARE,
+ TRUSTED_ENVIRONMENT,
+ STRONG_BOX
+ }
+
+ /**
+ * Extracts attestation extension properties from {@link X509Certificate}
+ * and returns a {@link AndroidKeystoreAttestationVerificationAttributes} that encapsulates the
+ * properties.
+ */
+ @NonNull
+ static AndroidKeystoreAttestationVerificationAttributes fromCertificate(
+ @NonNull X509Certificate x509Certificate)
+ throws Exception {
+ return new AndroidKeystoreAttestationVerificationAttributes(x509Certificate);
+ }
+
+ int getAttestationVersion() {
+ return mAttestationVersion;
+ }
+
+ @Nullable
+ SecurityLevel getAttestationSecurityLevel() {
+ return mAttestationSecurityLevel;
+ }
+
+ boolean isAttestationHardwareBacked() {
+ return mAttestationHardwareBacked;
+ }
+
+ int getKeymasterVersion() {
+ return mKeymasterVersion;
+ }
+
+ @Nullable
+ SecurityLevel getKeymasterSecurityLevel() {
+ return mKeymasterSecurityLevel;
+ }
+
+ boolean isKeymasterHardwareBacked() {
+ return mKeymasterHardwareBacked;
+ }
+
+ @Nullable
+ ByteString getAttestationChallenge() {
+ return mAttestationChallenge;
+ }
+
+ @Nullable
+ ByteString getKeymasterUniqueId() {
+ return mKeymasterUniqueId;
+ }
+
+ @Nullable
+ String getDeviceBrand() {
+ return mDeviceBrand;
+ }
+
+ @Nullable
+ String getDeviceName() {
+ return mDeviceName;
+ }
+
+ @Nullable
+ String getDeviceProductName() {
+ return mDeviceProductName;
+ }
+
+ boolean isKeyAllowedForAllApplications() {
+ return mKeyAllowedForAllApplications;
+ }
+
+ int getKeyAuthenticatorType() {
+ if (mKeyAuthenticatorType == null) {
+ throw new IllegalStateException("KeyAuthenticatorType is not set.");
+ }
+ return mKeyAuthenticatorType;
+ }
+
+ int getKeyBootPatchLevel() {
+ if (mKeyBootPatchLevel == null) {
+ throw new IllegalStateException("KeyBootPatchLevel is not set.");
+ }
+ return mKeyBootPatchLevel;
+ }
+
+ int getKeyOsPatchLevel() {
+ if (mKeyOsPatchLevel == null) {
+ throw new IllegalStateException("KeyOsPatchLevel is not set.");
+ }
+ return mKeyOsPatchLevel;
+ }
+
+ int getKeyVendorPatchLevel() {
+ if (mKeyVendorPatchLevel == null) {
+ throw new IllegalStateException("KeyVendorPatchLevel is not set.");
+ }
+ return mKeyVendorPatchLevel;
+ }
+
+ int getKeyOsVersion() {
+ if (mKeyOsVersion == null) {
+ throw new IllegalStateException("KeyOsVersion is not set.");
+ }
+ return mKeyOsVersion;
+ }
+
+ boolean isKeyRequiresUnlockedDevice() {
+ if (mKeyRequiresUnlockedDevice == null) {
+ throw new IllegalStateException("KeyRequiresUnlockedDevice is not set.");
+ }
+ return mKeyRequiresUnlockedDevice;
+ }
+
+ @Nullable
+ ByteString getVerifiedBootHash() {
+ return mVerifiedBootHash;
+ }
+
+ @Nullable
+ ByteString getVerifiedBootKey() {
+ return mVerifiedBootKey;
+ }
+
+ boolean isVerifiedBootLocked() {
+ if (mVerifiedBootLocked == null) {
+ throw new IllegalStateException("VerifiedBootLocked is not set.");
+ }
+ return mVerifiedBootLocked;
+ }
+
+ @Nullable
+ VerifiedBootState getVerifiedBootState() {
+ return mVerifiedBootState;
+ }
+
+ @Nullable
+ Map<String, Long> getApplicationPackageNameVersion() {
+ return Collections.unmodifiableMap(mApplicationPackageNameVersion);
+ }
+
+ @Nullable
+ List<ByteString> getApplicationCertificateDigests() {
+ return Collections.unmodifiableList(mApplicationCertificateDigests);
+ }
+
+ private AndroidKeystoreAttestationVerificationAttributes(X509Certificate x509Certificate)
+ throws Exception {
+ Certificate certificate = Certificate.getInstance(
+ new ASN1InputStream(x509Certificate.getEncoded()).readObject());
+ ASN1Sequence keyAttributes = (ASN1Sequence) certificate.getTBSCertificate().getExtensions()
+ .getExtensionParsedValue(
+ new ASN1ObjectIdentifier(ANDROID_KEYMASTER_KEY_DESCRIPTION_EXTENSION_OID));
+ if (keyAttributes == null) {
+ throw new CertificateEncodingException(
+ "No attestation extension found in certificate.");
+ }
+ this.mAttestationVersion = getIntegerFromAsn1(
+ keyAttributes.getObjectAt(ATTESTATION_VERSION_INDEX));
+ this.mAttestationSecurityLevel = getSecurityLevelEnum(
+ keyAttributes.getObjectAt(ATTESTATION_SECURITY_LEVEL_INDEX));
+ this.mAttestationHardwareBacked =
+ this.mAttestationSecurityLevel == SecurityLevel.TRUSTED_ENVIRONMENT;
+ this.mAttestationChallenge = getOctetsFromAsn1(
+ keyAttributes.getObjectAt(ATTESTATION_CHALLENGE_INDEX));
+ this.mKeymasterVersion = getIntegerFromAsn1(
+ keyAttributes.getObjectAt(KEYMASTER_VERSION_INDEX));
+ this.mKeymasterUniqueId = getOctetsFromAsn1(
+ keyAttributes.getObjectAt(KEYMASTER_UNIQUE_ID_INDEX));
+ this.mKeymasterSecurityLevel = getSecurityLevelEnum(
+ keyAttributes.getObjectAt(KEYMASTER_SECURITY_LEVEL_INDEX));
+ this.mKeymasterHardwareBacked =
+ this.mKeymasterSecurityLevel == SecurityLevel.TRUSTED_ENVIRONMENT;
+
+ ASN1Encodable[] softwareEnforced = ((ASN1Sequence)
+ keyAttributes.getObjectAt(SW_ENFORCED_INDEX)).toArray();
+ for (ASN1Encodable entry : softwareEnforced) {
+ ASN1TaggedObject taggedEntry = (ASN1TaggedObject) entry;
+ switch (taggedEntry.getTagNo()) {
+ case KM_TAG_ATTESTATION_APPLICATION_ID:
+ parseAttestationApplicationId(
+ getOctetsFromAsn1(taggedEntry.getObject()).toByteArray());
+ break;
+ case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
+ this.mKeyRequiresUnlockedDevice = getBoolFromAsn1(taggedEntry.getObject());
+ break;
+ default:
+ break;
+ }
+ }
+
+ ASN1Encodable[] hardwareEnforced = ((ASN1Sequence)
+ keyAttributes.getObjectAt(HW_ENFORCED_INDEX)).toArray();
+ for (ASN1Encodable entry : hardwareEnforced) {
+ ASN1TaggedObject taggedEntry = (ASN1TaggedObject) entry;
+ switch (taggedEntry.getTagNo()) {
+ case KM_TAG_NO_AUTH_REQUIRED:
+ this.mKeyAuthenticatorType = HW_AUTH_NONE;
+ break;
+ case KM_TAG_ALL_APPLICATIONS:
+ this.mKeyAllowedForAllApplications = true;
+ break;
+ case KM_TAG_ROOT_OF_TRUST:
+ ASN1Sequence rootOfTrust = (ASN1Sequence) taggedEntry.getObject();
+ this.mVerifiedBootKey =
+ getOctetsFromAsn1(rootOfTrust.getObjectAt(VERIFIED_BOOT_KEY_INDEX));
+ this.mVerifiedBootLocked =
+ getBoolFromAsn1(rootOfTrust.getObjectAt(VERIFIED_BOOT_LOCKED_INDEX));
+ this.mVerifiedBootState =
+ getVerifiedBootStateEnum(
+ rootOfTrust.getObjectAt(VERIFIED_BOOT_STATE_INDEX));
+ // The verified boot hash was added in structure version 3 (Keymaster 4.0).
+ if (mAttestationVersion >= 3) {
+ this.mVerifiedBootHash =
+ getOctetsFromAsn1(
+ rootOfTrust.getObjectAt(VERIFIED_BOOT_HASH_INDEX));
+ }
+ break;
+ case KM_TAG_OS_VERSION:
+ this.mKeyOsVersion = getIntegerFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_OS_PATCHLEVEL:
+ this.mKeyOsPatchLevel = getIntegerFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_ATTESTATION_ID_BRAND:
+ this.mDeviceBrand = getUtf8FromOctetsFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_ATTESTATION_ID_DEVICE:
+ this.mDeviceName = getUtf8FromOctetsFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_ATTESTATION_ID_PRODUCT:
+ this.mDeviceProductName = getUtf8FromOctetsFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_VENDOR_PATCHLEVEL:
+ this.mKeyVendorPatchLevel = getIntegerFromAsn1(taggedEntry.getObject());
+ break;
+ case KM_TAG_BOOT_PATCHLEVEL:
+ this.mKeyBootPatchLevel = getIntegerFromAsn1(taggedEntry.getObject());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private void parseAttestationApplicationId(byte [] attestationApplicationId)
+ throws Exception {
+ ASN1Sequence outerSequence = ASN1Sequence.getInstance(
+ new ASN1InputStream(attestationApplicationId).readObject());
+ Map<String, Long> packageNameVersion = new HashMap<>();
+ ASN1Set packageInfoSet = (ASN1Set) outerSequence.getObjectAt(PACKAGE_INFO_SET_INDEX);
+ for (ASN1Encodable packageInfoEntry : packageInfoSet.toArray()) {
+ ASN1Sequence packageInfoSequence = (ASN1Sequence) packageInfoEntry;
+ packageNameVersion.put(
+ getUtf8FromOctetsFromAsn1(
+ packageInfoSequence.getObjectAt(PACKAGE_INFO_NAME_INDEX)),
+ getLongFromAsn1(packageInfoSequence.getObjectAt(PACKAGE_INFO_VERSION_INDEX)));
+ }
+ List<ByteString> certificateDigests = new ArrayList<>();
+ ASN1Set certificateDigestSet =
+ (ASN1Set) outerSequence.getObjectAt(PACKAGE_SIGNATURE_SET_INDEX);
+ for (ASN1Encodable certificateDigestEntry : certificateDigestSet.toArray()) {
+ certificateDigests.add(getOctetsFromAsn1(certificateDigestEntry));
+ }
+ this.mApplicationPackageNameVersion = Collections.unmodifiableMap(packageNameVersion);
+ this.mApplicationCertificateDigests = Collections.unmodifiableList(certificateDigests);
+
+ }
+
+ private VerifiedBootState getVerifiedBootStateEnum(ASN1Encodable asn1) {
+ int verifiedBoot = getEnumFromAsn1(asn1);
+ switch (verifiedBoot) {
+ case KM_VERIFIED_BOOT_STATE_VERIFIED:
+ return VerifiedBootState.VERIFIED;
+ case KM_VERIFIED_BOOT_STATE_SELF_SIGNED:
+ return VerifiedBootState.SELF_SIGNED;
+ case KM_VERIFIED_BOOT_STATE_UNVERIFIED:
+ return VerifiedBootState.UNVERIFIED;
+ case KM_VERIFIED_BOOT_STATE_FAILED:
+ return VerifiedBootState.FAILED;
+ default:
+ throw new IllegalArgumentException("Invalid verified boot state.");
+ }
+ }
+
+ private SecurityLevel getSecurityLevelEnum(ASN1Encodable asn1) {
+ int securityLevel = getEnumFromAsn1(asn1);
+ switch (securityLevel) {
+ case KM_SECURITY_LEVEL_SOFTWARE:
+ return SecurityLevel.SOFTWARE;
+ case KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT:
+ return SecurityLevel.TRUSTED_ENVIRONMENT;
+ case KM_SECURITY_LEVEL_STRONG_BOX:
+ return SecurityLevel.STRONG_BOX;
+ default:
+ throw new IllegalArgumentException("Invalid security level.");
+ }
+ }
+
+ @NonNull
+ private ByteString getOctetsFromAsn1(ASN1Encodable asn1) {
+ return ByteString.copyFrom(((ASN1OctetString) asn1).getOctets());
+ }
+
+ @NonNull
+ private String getUtf8FromOctetsFromAsn1(ASN1Encodable asn1) {
+ return new String(((ASN1OctetString) asn1).getOctets(), StandardCharsets.UTF_8);
+ }
+
+ @NonNull
+ private int getIntegerFromAsn1(ASN1Encodable asn1) {
+ return ((ASN1Integer) asn1).getValue().intValueExact();
+ }
+
+ @NonNull
+ private long getLongFromAsn1(ASN1Encodable asn1) {
+ return ((ASN1Integer) asn1).getValue().longValueExact();
+ }
+
+ @NonNull
+ private int getEnumFromAsn1(ASN1Encodable asn1) {
+ return ((ASN1Enumerated) asn1).getValue().intValueExact();
+ }
+
+ @Nullable
+ private Boolean getBoolFromAsn1(ASN1Encodable asn1) {
+ if (asn1 instanceof ASN1Boolean) {
+ return ((ASN1Boolean) asn1).isTrue();
+ }
+ return null;
+ }
+}
diff --git a/services/core/java/com/android/server/security/AttestationVerificationManagerService.java b/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
index 243efb5..863f2d1 100644
--- a/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
+++ b/services/core/java/com/android/server/security/AttestationVerificationManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.security;
+import static android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE;
import static android.security.attestationverification.AttestationVerificationManager.PROFILE_SELF_TRUSTED;
import static android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE;
import static android.security.attestationverification.AttestationVerificationManager.RESULT_UNKNOWN;
@@ -44,9 +45,11 @@
public class AttestationVerificationManagerService extends SystemService {
private static final String TAG = "AVF";
+ private final AttestationVerificationPeerDeviceVerifier mPeerDeviceVerifier;
- public AttestationVerificationManagerService(final Context context) {
+ public AttestationVerificationManagerService(final Context context) throws Exception {
super(context);
+ mPeerDeviceVerifier = new AttestationVerificationPeerDeviceVerifier(context);
}
private final IBinder mService = new IAttestationVerificationManagerService.Stub() {
@@ -83,7 +86,7 @@
result.token = null;
switch (profile.getAttestationProfileId()) {
case PROFILE_SELF_TRUSTED:
- Slog.d(TAG, "Verifying Self trusted profile.");
+ Slog.d(TAG, "Verifying Self Trusted profile.");
try {
result.resultCode =
AttestationVerificationSelfTrustedVerifierForTesting.getInstance()
@@ -92,6 +95,11 @@
result.resultCode = RESULT_FAILURE;
}
break;
+ case PROFILE_PEER_DEVICE:
+ Slog.d(TAG, "Verifying Peer Device profile.");
+ result.resultCode = mPeerDeviceVerifier.verifyAttestation(
+ localBindingType, requirements, attestation);
+ break;
default:
Slog.d(TAG, "No profile found, defaulting.");
result.resultCode = RESULT_UNKNOWN;
diff --git a/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
new file mode 100644
index 0000000..0f8be5a
--- /dev/null
+++ b/services/core/java/com/android/server/security/AttestationVerificationPeerDeviceVerifier.java
@@ -0,0 +1,510 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.security;
+
+import static android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE;
+import static android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY;
+import static android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE;
+import static android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS;
+import static android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE;
+import static android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY;
+
+import static com.android.server.security.AndroidKeystoreAttestationVerificationAttributes.VerifiedBootState.VERIFIED;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.Slog;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+
+import org.json.JSONObject;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.cert.CertPath;
+import java.security.cert.CertPathValidator;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.PKIXCertPathChecker;
+import java.security.cert.PKIXParameters;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Verifies Android key attestation according to the {@code PROFILE_PEER_DEVICE} profile.
+ *
+ * Trust anchors are vendor-defined via the vendor_required_attestation_certificates.xml resource.
+ * The profile is satisfied by checking all the following:
+ * * TrustAnchor match
+ * * Certificate validity
+ * * Android OS 10 or higher
+ * * Hardware backed key store
+ * * Verified boot locked
+ * * Remote Patch level must be within 1 year of local patch if local patch is less than 1 year old.
+ *
+ */
+class AttestationVerificationPeerDeviceVerifier {
+ private static final String TAG = "AVF";
+ private static final boolean DEBUG = Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.VERBOSE);
+ private static final int MAX_PATCH_AGE_MONTHS = 12;
+
+ private final Context mContext;
+ private final Set<TrustAnchor> mTrustAnchors;
+ private final boolean mRevocationEnabled;
+ private final LocalDate mTestSystemDate;
+ private final LocalDate mTestLocalPatchDate;
+ private CertificateFactory mCertificateFactory;
+ private CertPathValidator mCertPathValidator;
+
+ private static void debugVerboseLog(String str, Throwable t) {
+ if (DEBUG) {
+ Slog.v(TAG, str, t);
+ }
+ }
+
+ private static void debugVerboseLog(String str) {
+ if (DEBUG) {
+ Slog.v(TAG, str);
+ }
+ }
+
+ AttestationVerificationPeerDeviceVerifier(@NonNull Context context) throws Exception {
+ mContext = Objects.requireNonNull(context);
+ mCertificateFactory = CertificateFactory.getInstance("X.509");
+ mCertPathValidator = CertPathValidator.getInstance("PKIX");
+ mTrustAnchors = getTrustAnchors();
+ mRevocationEnabled = true;
+ mTestSystemDate = null;
+ mTestLocalPatchDate = null;
+ }
+
+ // Use ONLY for hermetic unit testing.
+ @VisibleForTesting
+ AttestationVerificationPeerDeviceVerifier(@NonNull Context context,
+ Set<TrustAnchor> trustAnchors, boolean revocationEnabled,
+ LocalDate systemDate, LocalDate localPatchDate) throws Exception {
+ mContext = Objects.requireNonNull(context);
+ mCertificateFactory = CertificateFactory.getInstance("X.509");
+ mCertPathValidator = CertPathValidator.getInstance("PKIX");
+ mTrustAnchors = trustAnchors;
+ mRevocationEnabled = revocationEnabled;
+ mTestSystemDate = systemDate;
+ mTestLocalPatchDate = localPatchDate;
+ }
+
+ /**
+ * Verifies attestation for public key or challenge local binding.
+ *
+ * The attestations must be suitable for {@link java.security.cert.CertificateFactory}
+ * The certificates in the attestation provided must be DER-encoded and may be supplied in
+ * binary or printable (Base64) encoding. If the certificate is provided in Base64 encoding,
+ * it must be bounded at the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at
+ * the end by -----END CERTIFICATE-----.
+ *
+ * @param localBindingType Only {@code TYPE_PUBLIC_KEY} and {@code TYPE_CHALLENGE} supported.
+ * @param requirements Only {@code PARAM_PUBLIC_KEY} and {@code PARAM_CHALLENGE} supported.
+ * @param attestation Certificates should be DER encoded with leaf certificate appended first.
+ */
+ int verifyAttestation(
+ int localBindingType, @NonNull Bundle requirements, @NonNull byte[] attestation) {
+ int status = RESULT_FAILURE;
+
+ if (mCertificateFactory == null) {
+ debugVerboseLog("Was unable to initialize CertificateFactory onCreate.");
+ return status;
+ }
+
+ if (mCertPathValidator == null) {
+ debugVerboseLog("Was unable to initialize CertPathValidator onCreate.");
+ return status;
+ }
+
+ List<X509Certificate> certificates;
+ try {
+ certificates = getCertificates(attestation);
+ } catch (CertificateException e) {
+ debugVerboseLog("Unable to parse attestation certificates.", e);
+ return status;
+ }
+
+ if (certificates.isEmpty()) {
+ debugVerboseLog("Attestation contains no certificates.");
+ return status;
+ }
+
+ X509Certificate leafNode = certificates.get(0);
+ if (validateRequirements(localBindingType, requirements)
+ && validateCertificateChain(certificates)
+ && checkCertificateAttributes(leafNode, localBindingType, requirements)) {
+ status = RESULT_SUCCESS;
+ } else {
+ status = RESULT_FAILURE;
+ }
+ return status;
+ }
+
+ @NonNull
+ private List<X509Certificate> getCertificates(byte[] attestation)
+ throws CertificateException {
+ List<X509Certificate> certificates = new ArrayList<>();
+ ByteArrayInputStream bis = new ByteArrayInputStream(attestation);
+ while (bis.available() > 0) {
+ certificates.add((X509Certificate) mCertificateFactory.generateCertificate(bis));
+ }
+
+ return certificates;
+ }
+
+ private boolean validateRequirements(int localBindingType, Bundle requirements) {
+ if (requirements.size() != 1) {
+ debugVerboseLog("Requirements does not contain exactly 1 key.");
+ return false;
+ }
+
+ if (localBindingType != TYPE_PUBLIC_KEY && localBindingType != TYPE_CHALLENGE) {
+ debugVerboseLog("Binding type is not supported: " + localBindingType);
+ return false;
+ }
+
+ if (localBindingType == TYPE_PUBLIC_KEY && !requirements.containsKey(PARAM_PUBLIC_KEY)) {
+ debugVerboseLog("Requirements does not contain key: " + PARAM_PUBLIC_KEY);
+ return false;
+ }
+
+ if (localBindingType == TYPE_CHALLENGE && !requirements.containsKey(PARAM_CHALLENGE)) {
+ debugVerboseLog("Requirements does not contain key: " + PARAM_CHALLENGE);
+ return false;
+ }
+
+ return true;
+ }
+
+ private boolean validateCertificateChain(List<X509Certificate> certificates) {
+ if (certificates.size() < 2) {
+ debugVerboseLog("Certificate chain less than 2 in size.");
+ return false;
+ }
+
+ try {
+ CertPath certificatePath = mCertificateFactory.generateCertPath(certificates);
+ PKIXParameters validationParams = new PKIXParameters(mTrustAnchors);
+ if (mRevocationEnabled) {
+ // Checks Revocation Status List based on
+ // https://developer.android.com/training/articles/security-key-attestation#certificate_status
+ PKIXCertPathChecker checker = new AndroidRevocationStatusListChecker();
+ validationParams.addCertPathChecker(checker);
+ }
+ // Do not use built-in revocation status checker.
+ validationParams.setRevocationEnabled(false);
+ mCertPathValidator.validate(certificatePath, validationParams);
+ } catch (Throwable t) {
+ debugVerboseLog("Invalid certificate chain.", t);
+ return false;
+ }
+ return true;
+ }
+
+ private Set<TrustAnchor> getTrustAnchors() throws CertPathValidatorException {
+ Set<TrustAnchor> modifiableSet = new HashSet<>();
+ try {
+ for (String certString: getTrustAnchorResources()) {
+ modifiableSet.add(
+ new TrustAnchor((X509Certificate) mCertificateFactory.generateCertificate(
+ new ByteArrayInputStream(getCertificateBytes(certString))), null));
+ }
+ } catch (CertificateException e) {
+ e.printStackTrace();
+ throw new CertPathValidatorException("Invalid trust anchor certificate.", e);
+ }
+ return Collections.unmodifiableSet(modifiableSet);
+ }
+
+ private byte[] getCertificateBytes(String certString) {
+ String formattedCertString = certString.replaceAll("\\s+", "\n");
+ formattedCertString = formattedCertString.replaceAll(
+ "-BEGIN\\nCERTIFICATE-", "-BEGIN CERTIFICATE-");
+ formattedCertString = formattedCertString.replaceAll(
+ "-END\\nCERTIFICATE-", "-END CERTIFICATE-");
+ return formattedCertString.getBytes(UTF_8);
+ }
+
+ private String[] getTrustAnchorResources() {
+ return mContext.getResources().getStringArray(
+ R.array.vendor_required_attestation_certificates);
+ }
+
+ private boolean checkCertificateAttributes(
+ X509Certificate leafCertificate, int localBindingType, Bundle requirements) {
+ AndroidKeystoreAttestationVerificationAttributes attestationAttributes;
+ try {
+ attestationAttributes =
+ AndroidKeystoreAttestationVerificationAttributes.fromCertificate(
+ leafCertificate);
+ } catch (Throwable t) {
+ debugVerboseLog("Could not get ParsedAttestationAttributes from Certificate.", t);
+ return false;
+ }
+
+ // Checks for support of Keymaster 4.
+ if (attestationAttributes.getAttestationVersion() < 3) {
+ debugVerboseLog("Attestation version is not at least 3 (Keymaster 4).");
+ return false;
+ }
+
+ // Checks for support of Keymaster 4.
+ if (attestationAttributes.getKeymasterVersion() < 4) {
+ debugVerboseLog("Keymaster version is not at least 4.");
+ return false;
+ }
+
+ // First two characters are Android OS version.
+ if (attestationAttributes.getKeyOsVersion() < 100000) {
+ debugVerboseLog("Android OS version is not 10+.");
+ return false;
+ }
+
+ if (!attestationAttributes.isAttestationHardwareBacked()) {
+ debugVerboseLog("Key is not HW backed.");
+ return false;
+ }
+
+ if (!attestationAttributes.isKeymasterHardwareBacked()) {
+ debugVerboseLog("Keymaster is not HW backed.");
+ return false;
+ }
+
+ if (attestationAttributes.getVerifiedBootState() != VERIFIED) {
+ debugVerboseLog("Boot state not Verified.");
+ return false;
+ }
+
+ try {
+ if (!attestationAttributes.isVerifiedBootLocked()) {
+ debugVerboseLog("Verified boot state is not locked.");
+ return false;
+ }
+ } catch (IllegalStateException e) {
+ debugVerboseLog("VerifiedBootLocked is not set.", e);
+ return false;
+ }
+
+ // Patch level integer YYYYMM is expected to be within 1 year of today.
+ if (!isValidPatchLevel(attestationAttributes.getKeyOsPatchLevel())) {
+ debugVerboseLog("OS patch level is not within valid range.");
+ return false;
+ }
+
+ // Patch level integer YYYYMMDD is expected to be within 1 year of today.
+ if (!isValidPatchLevel(attestationAttributes.getKeyBootPatchLevel())) {
+ debugVerboseLog("Boot patch level is not within valid range.");
+ return false;
+ }
+
+ if (!isValidPatchLevel(attestationAttributes.getKeyVendorPatchLevel())) {
+ debugVerboseLog("Vendor patch level is not within valid range.");
+ return false;
+ }
+
+ if (!isValidPatchLevel(attestationAttributes.getKeyBootPatchLevel())) {
+ debugVerboseLog("Boot patch level is not within valid range.");
+ return false;
+ }
+
+ // Verify leaf public key matches provided public key.
+ if (localBindingType == TYPE_PUBLIC_KEY
+ && !Arrays.equals(requirements.getByteArray(PARAM_PUBLIC_KEY),
+ leafCertificate.getPublicKey().getEncoded())) {
+ debugVerboseLog("Provided public key does not match leaf certificate public key.");
+ return false;
+ }
+
+ // Verify challenge matches provided challenge.
+ if (localBindingType == TYPE_CHALLENGE
+ && !Arrays.equals(requirements.getByteArray(PARAM_CHALLENGE),
+ attestationAttributes.getAttestationChallenge().toByteArray())) {
+ debugVerboseLog("Provided challenge does not match leaf certificate challenge.");
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Validates patchLevel passed is within range of the local device patch date if local patch is
+ * not over one year old. Since the time can be changed on device, just checking the patch date
+ * is not enough. Therefore, we also confirm the patch level for the remote and local device are
+ * similar.
+ */
+ private boolean isValidPatchLevel(int patchLevel) {
+ LocalDate currentDate = mTestSystemDate != null
+ ? mTestSystemDate : LocalDate.now(ZoneId.systemDefault());
+
+ // Convert local patch date to LocalDate.
+ LocalDate localPatchDate;
+ try {
+ if (mTestLocalPatchDate != null) {
+ localPatchDate = mTestLocalPatchDate;
+ } else {
+ localPatchDate = LocalDate.parse(Build.VERSION.SECURITY_PATCH);
+ }
+ } catch (Throwable t) {
+ debugVerboseLog("Build.VERSION.SECURITY_PATCH: "
+ + Build.VERSION.SECURITY_PATCH + " is not in format YYYY-MM-DD");
+ return false;
+ }
+
+ // Check local patch date is not in last year of system clock.
+ if (ChronoUnit.MONTHS.between(localPatchDate, currentDate) > MAX_PATCH_AGE_MONTHS) {
+ return true;
+ }
+
+ // Convert remote patch dates to LocalDate.
+ String remoteDeviceDateStr = String.valueOf(patchLevel);
+ if (remoteDeviceDateStr.length() != 6 && remoteDeviceDateStr.length() != 8) {
+ debugVerboseLog("Patch level is not in format YYYYMM or YYYYMMDD");
+ return false;
+ }
+
+ int patchYear = Integer.parseInt(remoteDeviceDateStr.substring(0, 4));
+ int patchMonth = Integer.parseInt(remoteDeviceDateStr.substring(4, 6));
+ LocalDate remotePatchDate = LocalDate.of(patchYear, patchMonth, 1);
+
+ // Check patch dates are within 1 year of each other
+ boolean IsRemotePatchWithinOneYearOfLocalPatch;
+ if (remotePatchDate.compareTo(localPatchDate) > 0) {
+ IsRemotePatchWithinOneYearOfLocalPatch = ChronoUnit.MONTHS.between(
+ localPatchDate, remotePatchDate) <= MAX_PATCH_AGE_MONTHS;
+ } else if (remotePatchDate.compareTo(localPatchDate) < 0) {
+ IsRemotePatchWithinOneYearOfLocalPatch = ChronoUnit.MONTHS.between(
+ remotePatchDate, localPatchDate) <= MAX_PATCH_AGE_MONTHS;
+ } else {
+ IsRemotePatchWithinOneYearOfLocalPatch = true;
+ }
+
+ return IsRemotePatchWithinOneYearOfLocalPatch;
+ }
+
+ /**
+ * Checks certificate revocation status.
+ *
+ * Queries status list from android.googleapis.com/attestation/status and checks for
+ * the existence of certificate's serial number. If serial number exists in map, then fail.
+ */
+ private final class AndroidRevocationStatusListChecker extends PKIXCertPathChecker {
+ private static final String TOP_LEVEL_JSON_PROPERTY_KEY = "entries";
+ private static final String STATUS_PROPERTY_KEY = "status";
+ private static final String REASON_PROPERTY_KEY = "reason";
+ private String mStatusUrl;
+ private JSONObject mJsonStatusMap;
+
+ @Override
+ public void init(boolean forward) throws CertPathValidatorException {
+ mStatusUrl = getRevocationListUrl();
+ if (mStatusUrl == null || mStatusUrl.isEmpty()) {
+ throw new CertPathValidatorException(
+ "R.string.vendor_required_attestation_revocation_list_url is empty.");
+ }
+ // TODO(b/221067843): Update to only pull status map on non critical path and if
+ // out of date (24hrs).
+ mJsonStatusMap = getStatusMap(mStatusUrl);
+ }
+
+ @Override
+ public boolean isForwardCheckingSupported() {
+ return false;
+ }
+
+ @Override
+ public Set<String> getSupportedExtensions() {
+ return null;
+ }
+
+ @Override
+ public void check(Certificate cert, Collection<String> unresolvedCritExts)
+ throws CertPathValidatorException {
+ X509Certificate x509Certificate = (X509Certificate) cert;
+ // The json key is the certificate's serial number converted to lowercase hex.
+ String serialNumber = x509Certificate.getSerialNumber().toString(16);
+
+ if (serialNumber == null) {
+ throw new CertPathValidatorException("Certificate serial number can not be null.");
+ }
+
+ if (mJsonStatusMap.has(serialNumber)) {
+ JSONObject revocationStatus;
+ String status;
+ String reason;
+ try {
+ revocationStatus = mJsonStatusMap.getJSONObject(serialNumber);
+ status = revocationStatus.getString(STATUS_PROPERTY_KEY);
+ reason = revocationStatus.getString(REASON_PROPERTY_KEY);
+ } catch (Throwable t) {
+ throw new CertPathValidatorException("Unable get properties for certificate "
+ + "with serial number " + serialNumber);
+ }
+ throw new CertPathValidatorException(
+ "Invalid certificate with serial number " + serialNumber
+ + " has status " + status
+ + " because reason " + reason);
+ }
+ }
+
+ private JSONObject getStatusMap(String stringUrl) throws CertPathValidatorException {
+ URL url;
+ try {
+ url = new URL(stringUrl);
+ } catch (Throwable t) {
+ throw new CertPathValidatorException(
+ "Unable to get revocation status from " + mStatusUrl, t);
+ }
+
+ try (InputStream inputStream = url.openStream()) {
+ JSONObject statusListJson = new JSONObject(
+ new String(inputStream.readAllBytes(), UTF_8));
+ return statusListJson.getJSONObject(TOP_LEVEL_JSON_PROPERTY_KEY);
+ } catch (Throwable t) {
+ throw new CertPathValidatorException(
+ "Unable to parse revocation status from " + mStatusUrl, t);
+ }
+ }
+
+ private String getRevocationListUrl() {
+ return mContext.getResources().getString(
+ R.string.vendor_required_attestation_revocation_list_url);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
index a8e2d43..2f68f56 100644
--- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
@@ -918,7 +918,6 @@
*/
@Override
public void addToggleSensorPrivacyListener(ISensorPrivacyListener listener) {
- Log.d("evan", "trying to add from " + Binder.getCallingUid());
enforceObserveSensorPrivacyPermission();
if (listener == null) {
throw new IllegalArgumentException("listener cannot be null");
diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
index 1dea3d7..fa243c0 100644
--- a/services/core/java/com/android/server/trust/TrustAgentWrapper.java
+++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
@@ -17,6 +17,7 @@
package com.android.server.trust;
import static android.service.trust.TrustAgentService.FLAG_GRANT_TRUST_DISPLAY_MESSAGE;
+import static android.service.trust.TrustAgentService.FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE;
import android.annotation.TargetApi;
import android.app.AlarmManager;
@@ -158,7 +159,7 @@
mMessage = (CharSequence) msg.obj;
int flags = msg.arg1;
mDisplayTrustGrantedMessage = (flags & FLAG_GRANT_TRUST_DISPLAY_MESSAGE) != 0;
- if ((flags & TrustAgentService.FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE) != 0) {
+ if ((flags & FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE) != 0) {
mWaitingForTrustableDowngrade = true;
} else {
mWaitingForTrustableDowngrade = false;
@@ -638,6 +639,11 @@
return mTrustable && mManagingTrust && !mTrustDisabledByDpm;
}
+ /** Set the trustagent as not trustable */
+ public void setUntrustable() {
+ mTrustable = false;
+ }
+
public boolean isManagingTrust() {
return mManagingTrust && !mTrustDisabledByDpm;
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index b4c54f9..bd4b8d1 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -16,6 +16,8 @@
package com.android.server.trust;
+import static android.service.trust.TrustAgentService.FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE;
+
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -127,13 +129,16 @@
private static final int MSG_DISPATCH_UNLOCK_LOCKOUT = 13;
private static final int MSG_REFRESH_DEVICE_LOCKED_FOR_USER = 14;
private static final int MSG_SCHEDULE_TRUST_TIMEOUT = 15;
- public static final int MSG_USER_REQUESTED_UNLOCK = 16;
+ private static final int MSG_USER_REQUESTED_UNLOCK = 16;
+ private static final int MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH = 17;
private static final String REFRESH_DEVICE_LOCKED_EXCEPT_USER = "except";
private static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000;
private static final String TRUST_TIMEOUT_ALARM_TAG = "TrustManagerService.trustTimeoutForUser";
private static final long TRUST_TIMEOUT_IN_MILLIS = 4 * 60 * 60 * 1000;
+ private static final long TRUSTABLE_IDLE_TIMEOUT_IN_MILLIS = 8 * 60 * 60 * 1000;
+ private static final long TRUSTABLE_TIMEOUT_IN_MILLIS = 24 * 60 * 60 * 1000;
private static final String PRIV_NAMESPACE = "http://schemas.android.com/apk/prv/res/android";
@@ -203,9 +208,18 @@
@GuardedBy("mUsersUnlockedByBiometric")
private final SparseBooleanArray mUsersUnlockedByBiometric = new SparseBooleanArray();
- private final ArrayMap<Integer, TrustTimeoutAlarmListener> mTrustTimeoutAlarmListenerForUser =
+ private enum TimeoutType {
+ TRUSTED,
+ TRUSTABLE
+ }
+ private final ArrayMap<Integer, TrustedTimeoutAlarmListener> mTrustTimeoutAlarmListenerForUser =
new ArrayMap<>();
+ private final SparseArray<TrustableTimeoutAlarmListener> mTrustableTimeoutAlarmListenerForUser =
+ new SparseArray<>();
+ private final SparseArray<TrustableTimeoutAlarmListener>
+ mIdleTrustableTimeoutAlarmListenerForUser = new SparseArray<>();
private AlarmManager mAlarmManager;
+ private final Object mAlarmLock = new Object();
private final SettingsObserver mSettingsObserver;
private final StrongAuthTracker mStrongAuthTracker;
@@ -258,7 +272,7 @@
private final boolean mIsAutomotive;
private final ContentResolver mContentResolver;
- private boolean mTrustAgentsExtendUnlock;
+ private boolean mTrustAgentsNonrenewableTrust;
private boolean mLockWhenTrustLost;
/**
@@ -295,11 +309,11 @@
@Override
public void onChange(boolean selfChange, Uri uri) {
if (TRUST_AGENTS_EXTEND_UNLOCK.equals(uri)) {
- // Smart lock should only extend unlock. The only exception is for automotive,
- // where it can actively unlock the head unit.
+ // Smart lock should only grant non-renewable trust. The only exception is for
+ // automotive, where it can actively unlock the head unit.
int defaultValue = mIsAutomotive ? 0 : 1;
- mTrustAgentsExtendUnlock =
+ mTrustAgentsNonrenewableTrust =
Settings.Secure.getIntForUser(
mContentResolver,
Settings.Secure.TRUST_AGENTS_EXTEND_UNLOCK,
@@ -315,8 +329,8 @@
}
}
- boolean getTrustAgentsExtendUnlock() {
- return mTrustAgentsExtendUnlock;
+ boolean getTrustAgentsNonrenewableTrust() {
+ return mTrustAgentsNonrenewableTrust;
}
boolean getLockWhenTrustLost() {
@@ -339,36 +353,53 @@
// If active unlocking is not allowed, cancel any pending trust timeouts because the
// screen is already locked.
- TrustTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
- if (alarm != null && mSettingsObserver.getTrustAgentsExtendUnlock()) {
+ TrustedTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
+ if (alarm != null && mSettingsObserver.getTrustAgentsNonrenewableTrust()) {
mAlarmManager.cancel(alarm);
alarm.setQueued(false /* isQueued */);
}
}
}
- private void scheduleTrustTimeout(int userId, boolean override) {
+ private void scheduleTrustTimeout(boolean override, boolean isTrustableTimeout) {
int shouldOverride = override ? 1 : 0;
- if (override) {
- shouldOverride = 1;
- }
- mHandler.obtainMessage(MSG_SCHEDULE_TRUST_TIMEOUT, userId, shouldOverride).sendToTarget();
+ int trustableTimeout = isTrustableTimeout ? 1 : 0;
+ mHandler.obtainMessage(MSG_SCHEDULE_TRUST_TIMEOUT, shouldOverride,
+ trustableTimeout).sendToTarget();
}
- private void handleScheduleTrustTimeout(int userId, int shouldOverride) {
+ private void handleScheduleTrustTimeout(boolean shouldOverride, TimeoutType timeoutType) {
+ int userId = mCurrentUser;
+ if (timeoutType == TimeoutType.TRUSTABLE) {
+ // don't override the hard timeout unless biometric or knowledge factor authentication
+ // occurs which isn't where this is called from. Override the idle timeout what the
+ // calling function has determined.
+ handleScheduleTrustableTimeouts(userId, shouldOverride,
+ false /* overrideHardTimeout */);
+ } else {
+ handleScheduleTrustedTimeout(userId, shouldOverride);
+ }
+ }
+
+ /* Override both the idle and hard trustable timeouts */
+ private void refreshTrustableTimers(int userId) {
+ handleScheduleTrustableTimeouts(userId, true /* overrideIdleTimeout */,
+ true /* overrideHardTimeout */);
+ }
+
+ private void handleScheduleTrustedTimeout(int userId, boolean shouldOverride) {
long when = SystemClock.elapsedRealtime() + TRUST_TIMEOUT_IN_MILLIS;
- userId = mCurrentUser;
- TrustTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
+ TrustedTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
// Cancel existing trust timeouts for this user if needed.
if (alarm != null) {
- if (shouldOverride == 0 && alarm.isQueued()) {
+ if (!shouldOverride && alarm.isQueued()) {
if (DEBUG) Slog.d(TAG, "Found existing trust timeout alarm. Skipping.");
return;
}
mAlarmManager.cancel(alarm);
} else {
- alarm = new TrustTimeoutAlarmListener(userId);
+ alarm = new TrustedTimeoutAlarmListener(userId);
mTrustTimeoutAlarmListenerForUser.put(userId, alarm);
}
@@ -379,6 +410,59 @@
mHandler);
}
+ private void handleScheduleTrustableTimeouts(int userId, boolean overrideIdleTimeout,
+ boolean overrideHardTimeout) {
+ setUpIdleTimeout(userId, overrideIdleTimeout);
+ setUpHardTimeout(userId, overrideHardTimeout);
+ }
+
+ private void setUpIdleTimeout(int userId, boolean overrideIdleTimeout) {
+ long when = SystemClock.elapsedRealtime() + TRUSTABLE_IDLE_TIMEOUT_IN_MILLIS;
+ TrustableTimeoutAlarmListener alarm = mIdleTrustableTimeoutAlarmListenerForUser.get(userId);
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SCHEDULE_EXACT_ALARM, null);
+
+ // Cancel existing trustable timeouts for this user if needed.
+ if (alarm != null) {
+ if (!overrideIdleTimeout && alarm.isQueued()) {
+ if (DEBUG) Slog.d(TAG, "Found existing trustable timeout alarm. Skipping.");
+ return;
+ }
+ mAlarmManager.cancel(alarm);
+ } else {
+ alarm = new TrustableTimeoutAlarmListener(userId);
+ mIdleTrustableTimeoutAlarmListenerForUser.put(userId, alarm);
+ }
+
+ if (DEBUG) Slog.d(TAG, "\tSetting up trustable idle timeout alarm");
+ alarm.setQueued(true /* isQueued */);
+ mAlarmManager.setExact(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP, when, TRUST_TIMEOUT_ALARM_TAG, alarm,
+ mHandler);
+ }
+
+ private void setUpHardTimeout(int userId, boolean overrideHardTimeout) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SCHEDULE_EXACT_ALARM, null);
+ TrustableTimeoutAlarmListener alarm = mTrustableTimeoutAlarmListenerForUser.get(userId);
+
+ // if the alarm doesn't exist, or hasn't been queued, or needs to be overridden we need to
+ // set it
+ if (alarm == null || !alarm.isQueued() || overrideHardTimeout) {
+ // schedule hard limit on renewable trust use
+ long when = SystemClock.elapsedRealtime() + TRUSTABLE_TIMEOUT_IN_MILLIS;
+ if (alarm == null) {
+ alarm = new TrustableTimeoutAlarmListener(userId);
+ mTrustableTimeoutAlarmListenerForUser.put(userId, alarm);
+ } else if (overrideHardTimeout) {
+ mAlarmManager.cancel(alarm);
+ }
+ if (DEBUG) Slog.d(TAG, "\tSetting up trustable hard timeout alarm");
+ alarm.setQueued(true /* isQueued */);
+ mAlarmManager.setExact(
+ AlarmManager.ELAPSED_REALTIME_WAKEUP, when, TRUST_TIMEOUT_ALARM_TAG, alarm,
+ mHandler);
+ }
+ }
+
// Agent management
private static final class AgentInfo {
@@ -419,11 +503,11 @@
if (ENABLE_ACTIVE_UNLOCK_FLAG) {
updateTrustWithRenewableUnlock(userId, flags, isFromUnlock);
} else {
- updateTrustWithExtendUnlock(userId, flags, isFromUnlock);
+ updateTrustWithNonrenewableTrust(userId, flags, isFromUnlock);
}
}
- private void updateTrustWithExtendUnlock(int userId, int flags, boolean isFromUnlock) {
+ private void updateTrustWithNonrenewableTrust(int userId, int flags, boolean isFromUnlock) {
boolean managed = aggregateIsTrustManaged(userId);
dispatchOnTrustManagedChanged(managed, userId);
if (mStrongAuthTracker.isTrustAllowedForUser(userId)
@@ -441,8 +525,8 @@
boolean changed;
synchronized (mUserIsTrusted) {
- if (mSettingsObserver.getTrustAgentsExtendUnlock()) {
- // In extend unlock trust agents can only set the device to trusted if it already
+ if (mSettingsObserver.getTrustAgentsNonrenewableTrust()) {
+ // For non-renewable trust agents can only set the device to trusted if it already
// trusted or the device is unlocked. Attempting to set the device as trusted
// when the device is locked will be ignored.
changed = mUserIsTrusted.get(userId) != trusted;
@@ -464,7 +548,7 @@
if (!trusted) {
maybeLockScreen(userId);
} else {
- scheduleTrustTimeout(userId, false /* override */);
+ scheduleTrustTimeout(false /* override */, false /* isTrustableTimeout*/);
}
}
}
@@ -522,7 +606,12 @@
if (!isNowTrusted) {
maybeLockScreen(userId);
} else {
- scheduleTrustTimeout(userId, false /* override */);
+ boolean isTrustableTimeout =
+ (flags & FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE) != 0;
+ // Every time we grant renewable trust we should override the idle trustable
+ // timeout. If this is for non-renewable trust, then we shouldn't override.
+ scheduleTrustTimeout(isTrustableTimeout /* override */,
+ isTrustableTimeout /* isTrustableTimeout */);
}
}
}
@@ -1102,8 +1191,9 @@
private void dispatchUnlockAttempt(boolean successful, int userId) {
if (successful) {
mStrongAuthTracker.allowTrustFromUnlock(userId);
- // Allow the presence of trust on a successful unlock attempt to extend unlock.
+ // Allow the presence of trust on a successful unlock attempt to extend unlock
updateTrust(userId, 0 /* flags */, true);
+ mHandler.obtainMessage(MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH, userId).sendToTarget();
}
for (int i = 0; i < mActiveAgents.size(); i++) {
@@ -1520,11 +1610,12 @@
synchronized(mUsersUnlockedByBiometric) {
mUsersUnlockedByBiometric.put(userId, true);
}
- // In extend unlock mode we need to refresh trust state here, which will call
+ // In non-renewable trust mode we need to refresh trust state here, which will call
// refreshDeviceLockedForUser()
- int updateTrustOnUnlock = mSettingsObserver.getTrustAgentsExtendUnlock() ? 1 : 0;
+ int updateTrustOnUnlock = mSettingsObserver.getTrustAgentsNonrenewableTrust() ? 1 : 0;
mHandler.obtainMessage(MSG_REFRESH_DEVICE_LOCKED_FOR_USER, userId,
updateTrustOnUnlock).sendToTarget();
+ mHandler.obtainMessage(MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH, userId).sendToTarget();
}
@Override
@@ -1643,7 +1734,13 @@
refreshDeviceLockedForUser(msg.arg1, unlockedUser);
break;
case MSG_SCHEDULE_TRUST_TIMEOUT:
- handleScheduleTrustTimeout(msg.arg1, msg.arg2);
+ boolean shouldOverride = msg.arg1 == 1 ? true : false;
+ TimeoutType timeoutType =
+ msg.arg2 == 1 ? TimeoutType.TRUSTABLE : TimeoutType.TRUSTED;
+ handleScheduleTrustTimeout(shouldOverride, timeoutType);
+ break;
+ case MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH:
+ refreshTrustableTimers(msg.arg1);
break;
}
}
@@ -1759,10 +1856,11 @@
// Cancel pending alarms if we require some auth anyway.
if (!isTrustAllowedForUser(userId)) {
TrustTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
- if (alarm != null && alarm.isQueued()) {
- alarm.setQueued(false /* isQueued */);
- mAlarmManager.cancel(alarm);
- }
+ cancelPendingAlarm(alarm);
+ alarm = mTrustableTimeoutAlarmListenerForUser.get(userId);
+ cancelPendingAlarm(alarm);
+ alarm = mIdleTrustableTimeoutAlarmListenerForUser.get(userId);
+ cancelPendingAlarm(alarm);
}
refreshAgentList(userId);
@@ -1772,6 +1870,13 @@
updateTrust(userId, 0 /* flags */);
}
+ private void cancelPendingAlarm(@Nullable TrustTimeoutAlarmListener alarm) {
+ if (alarm != null && alarm.isQueued()) {
+ alarm.setQueued(false /* isQueued */);
+ mAlarmManager.cancel(alarm);
+ }
+ }
+
boolean canAgentsRunForUser(int userId) {
return mStartFromSuccessfulUnlock.get(userId)
|| super.isTrustAllowedForUser(userId);
@@ -1804,9 +1909,9 @@
}
}
- private class TrustTimeoutAlarmListener implements OnAlarmListener {
- private final int mUserId;
- private boolean mIsQueued = false;
+ private abstract class TrustTimeoutAlarmListener implements OnAlarmListener {
+ protected final int mUserId;
+ protected boolean mIsQueued = false;
TrustTimeoutAlarmListener(int userId) {
mUserId = userId;
@@ -1815,8 +1920,7 @@
@Override
public void onAlarm() {
mIsQueued = false;
- int strongAuthState = mStrongAuthTracker.getStrongAuthForUser(mUserId);
-
+ handleAlarm();
// Only fire if trust can unlock.
if (mStrongAuthTracker.isTrustAllowedForUser(mUserId)) {
if (DEBUG) Slog.d(TAG, "Revoking all trust because of trust timeout");
@@ -1826,12 +1930,98 @@
maybeLockScreen(mUserId);
}
- public void setQueued(boolean isQueued) {
- mIsQueued = isQueued;
- }
+ protected abstract void handleAlarm();
public boolean isQueued() {
return mIsQueued;
}
+
+ public void setQueued(boolean isQueued) {
+ mIsQueued = isQueued;
+ }
+ }
+
+ private class TrustedTimeoutAlarmListener extends TrustTimeoutAlarmListener {
+
+ TrustedTimeoutAlarmListener(int userId) {
+ super(userId);
+ }
+
+ @Override
+ public void handleAlarm() {
+ TrustableTimeoutAlarmListener otherAlarm;
+ boolean otherAlarmPresent;
+ if (ENABLE_ACTIVE_UNLOCK_FLAG) {
+ otherAlarm = mTrustableTimeoutAlarmListenerForUser.get(mUserId);
+ otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued();
+ if (otherAlarmPresent) {
+ synchronized (mAlarmLock) {
+ disableNonrenewableTrustWhileRenewableTrustIsPresent();
+ }
+ return;
+ }
+ }
+ }
+
+ private void disableNonrenewableTrustWhileRenewableTrustIsPresent() {
+ synchronized (mUserTrustState) {
+ if (mUserTrustState.get(mUserId) == TrustState.TRUSTED) {
+ // if we're trusted and we have a trustable alarm, we need to
+ // downgrade to trustable
+ mUserTrustState.put(mUserId, TrustState.TRUSTABLE);
+ updateTrust(mUserId, 0 /* flags */);
+ }
+ }
+ }
+ }
+
+ private class TrustableTimeoutAlarmListener extends TrustTimeoutAlarmListener {
+
+ TrustableTimeoutAlarmListener(int userId) {
+ super(userId);
+ }
+
+ @Override
+ public void handleAlarm() {
+ TrustedTimeoutAlarmListener otherAlarm;
+ boolean otherAlarmPresent;
+ if (ENABLE_ACTIVE_UNLOCK_FLAG) {
+ cancelBothTrustableAlarms();
+ otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId);
+ otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued();
+ if (otherAlarmPresent) {
+ synchronized (mAlarmLock) {
+ disableRenewableTrustWhileNonrenewableTrustIsPresent();
+ }
+ return;
+ }
+ }
+ }
+
+ private void cancelBothTrustableAlarms() {
+ TrustableTimeoutAlarmListener idleTimeout =
+ mIdleTrustableTimeoutAlarmListenerForUser.get(
+ mUserId);
+ TrustableTimeoutAlarmListener trustableTimeout =
+ mTrustableTimeoutAlarmListenerForUser.get(
+ mUserId);
+ if (idleTimeout != null && idleTimeout.isQueued()) {
+ idleTimeout.setQueued(false);
+ mAlarmManager.cancel(idleTimeout);
+ }
+ if (trustableTimeout != null && trustableTimeout.isQueued()) {
+ trustableTimeout.setQueued(false);
+ mAlarmManager.cancel(trustableTimeout);
+ }
+ }
+
+ private void disableRenewableTrustWhileNonrenewableTrustIsPresent() {
+ // if non-renewable trust is running, we need to temporarily prevent
+ // renewable trust from being used
+ for (AgentInfo agentInfo : mActiveAgents) {
+ agentInfo.agent.setUntrustable();
+ }
+ updateTrust(mUserId, 0 /* flags */);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 8f703c5..57f77d5 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -263,6 +263,8 @@
FLAGS_MAGNIFICATION_CALLBACK | FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK,
"displayId=" + displayId + "; spec={" + spec + "}");
}
+ mAccessibilityWindowsPopulator.setMagnificationSpec(displayId, spec);
+
final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
if (displayMagnifier != null) {
displayMagnifier.setMagnificationSpec(spec);
@@ -454,19 +456,6 @@
return null;
}
- boolean getMagnificationSpecForDisplay(int displayId, MagnificationSpec outSpec) {
- if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
- mAccessibilityTracing.logTrace(TAG + ".getMagnificationSpecForDisplay",
- FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId);
- }
- final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
- if (displayMagnifier == null) {
- return false;
- }
-
- return displayMagnifier.getMagnificationSpec(outSpec);
- }
-
boolean hasCallbacks() {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK
| FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) {
@@ -768,25 +757,6 @@
return spec;
}
- boolean getMagnificationSpec(MagnificationSpec outSpec) {
- if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
- mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
- FLAGS_MAGNIFICATION_CALLBACK);
- }
- MagnificationSpec spec = mMagnifedViewport.getMagnificationSpec();
- if (spec == null) {
- return false;
- }
-
- outSpec.setTo(spec);
- if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
- mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
- FLAGS_MAGNIFICATION_CALLBACK, "outSpec={" + outSpec + "}");
- }
-
- return true;
- }
-
void getMagnificationRegion(Region outMagnificationRegion) {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationRegion",
diff --git a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
index c0fb83b..43317ad 100644
--- a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
+++ b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
@@ -41,7 +41,9 @@
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* This class is the accessibility windows population adapter.
@@ -68,13 +70,24 @@
private final SparseArray<Matrix> mMagnificationSpecInverseMatrix = new SparseArray<>();
@GuardedBy("mLock")
private final SparseArray<DisplayInfo> mDisplayInfos = new SparseArray<>();
+ private final SparseArray<MagnificationSpec> mCurrentMagnificationSpec = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final SparseArray<MagnificationSpec> mPreviousMagnificationSpec = new SparseArray<>();
@GuardedBy("mLock")
private final List<InputWindowHandle> mVisibleWindows = new ArrayList<>();
@GuardedBy("mLock")
private boolean mWindowsNotificationEnabled = false;
+ @GuardedBy("mLock")
+ private final Map<IBinder, Matrix> mWindowsTransformMatrixMap = new HashMap<>();
private final Object mLock = new Object();
private final Handler mHandler;
+ private final Matrix mTempMatrix1 = new Matrix();
+ private final Matrix mTempMatrix2 = new Matrix();
+ private final float[] mTempFloat1 = new float[9];
+ private final float[] mTempFloat2 = new float[9];
+ private final float[] mTempFloat3 = new float[9];
+
AccessibilityWindowsPopulator(WindowManagerService service,
AccessibilityController accessibilityController) {
mService = service;
@@ -132,28 +145,55 @@
@Override
public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
DisplayInfo[] displayInfos) {
- synchronized (mLock) {
- mVisibleWindows.clear();
- for (InputWindowHandle window : windowHandles) {
- if (window.visible && window.getWindow() != null) {
- mVisibleWindows.add(window);
- }
+ final List<InputWindowHandle> tempVisibleWindows = new ArrayList<>();
+
+ for (InputWindowHandle window : windowHandles) {
+ if (window.visible && window.getWindow() != null) {
+ tempVisibleWindows.add(window);
}
+ }
+ final HashMap<IBinder, Matrix> windowsTransformMatrixMap =
+ getWindowsTransformMatrix(tempVisibleWindows);
+
+ synchronized (mLock) {
+ mWindowsTransformMatrixMap.clear();
+ mWindowsTransformMatrixMap.putAll(windowsTransformMatrixMap);
+
+ mVisibleWindows.clear();
+ mVisibleWindows.addAll(tempVisibleWindows);
mDisplayInfos.clear();
for (final DisplayInfo displayInfo : displayInfos) {
mDisplayInfos.put(displayInfo.mDisplayId, displayInfo);
}
- if (mWindowsNotificationEnabled) {
- if (!mHandler.hasMessages(
- MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT)) {
- mHandler.sendEmptyMessageDelayed(
- MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT,
- WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS);
- }
- populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ if (!mHandler.hasMessages(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT)) {
+ mHandler.sendEmptyMessageDelayed(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT,
+ WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS);
}
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeeded();
+ }
+ }
+
+ private HashMap<IBinder, Matrix> getWindowsTransformMatrix(List<InputWindowHandle> windows) {
+ synchronized (mService.mGlobalLock) {
+ final HashMap<IBinder, Matrix> windowsTransformMatrixMap = new HashMap<>();
+
+ for (InputWindowHandle inputWindowHandle : windows) {
+ final IWindow iWindow = inputWindowHandle.getWindow();
+ final WindowState windowState = iWindow != null ? mService.mWindowMap.get(
+ iWindow.asBinder()) : null;
+
+ if (windowState != null && windowState.shouldMagnify()) {
+ final Matrix transformMatrix = new Matrix();
+ windowState.getTransformationMatrix(sTempFloats, transformMatrix);
+ windowsTransformMatrixMap.put(iWindow.asBinder(), transformMatrix);
+ }
+ }
+
+ return windowsTransformMatrixMap;
}
}
@@ -171,14 +211,43 @@
}
mWindowsNotificationEnabled = register;
if (mWindowsNotificationEnabled) {
- populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeeded();
} else {
releaseResources();
}
}
}
- private void populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked() {
+ /**
+ * Sets the magnification spec for calculating the window bounds of all windows
+ * reported from the surface flinger in the magnifying.
+ *
+ * @param displayId The display Id.
+ * @param spec THe magnification spec.
+ */
+ public void setMagnificationSpec(int displayId, MagnificationSpec spec) {
+ synchronized (mLock) {
+ MagnificationSpec currentMagnificationSpec = mCurrentMagnificationSpec.get(displayId);
+ if (currentMagnificationSpec == null) {
+ currentMagnificationSpec = new MagnificationSpec();
+ currentMagnificationSpec.setTo(spec);
+ mCurrentMagnificationSpec.put(displayId, currentMagnificationSpec);
+
+ return;
+ }
+
+ MagnificationSpec previousMagnificationSpec = mPreviousMagnificationSpec.get(displayId);
+ if (previousMagnificationSpec == null) {
+ previousMagnificationSpec = new MagnificationSpec();
+ mPreviousMagnificationSpec.put(displayId, previousMagnificationSpec);
+ }
+ previousMagnificationSpec.setTo(currentMagnificationSpec);
+ currentMagnificationSpec.setTo(spec);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeeded() {
final SparseArray<List<InputWindowHandle>> tempWindowHandleList = new SparseArray<>();
for (final InputWindowHandle windowHandle : mVisibleWindows) {
@@ -188,15 +257,15 @@
if (inputWindowHandles == null) {
inputWindowHandles = new ArrayList<>();
tempWindowHandleList.put(windowHandle.displayId, inputWindowHandles);
- generateMagnificationSpecInverseMatrixLocked(windowHandle.displayId);
}
inputWindowHandles.add(windowHandle);
}
+ findMagnificationSpecInverseMatrixIfNeeded(tempWindowHandleList);
final List<Integer> displayIdsForWindowsChanged = new ArrayList<>();
-
- getDisplaysForWindowsChangedLocked(displayIdsForWindowsChanged, tempWindowHandleList,
+ getDisplaysForWindowsChanged(displayIdsForWindowsChanged, tempWindowHandleList,
mInputWindowHandlesOnDisplays);
+
// Clones all windows from the callback of the surface flinger.
mInputWindowHandlesOnDisplays.clear();
for (int i = 0; i < tempWindowHandleList.size(); i++) {
@@ -204,7 +273,7 @@
mInputWindowHandlesOnDisplays.put(displayId, tempWindowHandleList.get(displayId));
}
- if (displayIdsForWindowsChanged.size() > 0) {
+ if (!displayIdsForWindowsChanged.isEmpty()) {
if (!mHandler.hasMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED)) {
mHandler.obtainMessage(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED,
displayIdsForWindowsChanged).sendToTarget();
@@ -217,7 +286,8 @@
SURFACE_FLINGER_CALLBACK_WINDOWS_STABLE_TIMES_MS);
}
- private void getDisplaysForWindowsChangedLocked(List<Integer> outDisplayIdsForWindowsChanged,
+ @GuardedBy("mLock")
+ private static void getDisplaysForWindowsChanged(List<Integer> outDisplayIdsForWindowsChanged,
SparseArray<List<InputWindowHandle>> newWindowsList,
SparseArray<List<InputWindowHandle>> oldWindowsList) {
for (int i = 0; i < newWindowsList.size(); i++) {
@@ -225,13 +295,14 @@
final List<InputWindowHandle> newWindows = newWindowsList.get(displayId);
final List<InputWindowHandle> oldWindows = oldWindowsList.get(displayId);
- if (hasWindowsChangedLocked(newWindows, oldWindows)) {
+ if (hasWindowsChanged(newWindows, oldWindows)) {
outDisplayIdsForWindowsChanged.add(displayId);
}
}
}
- private boolean hasWindowsChangedLocked(List<InputWindowHandle> newWindows,
+ @GuardedBy("mLock")
+ private static boolean hasWindowsChanged(List<InputWindowHandle> newWindows,
List<InputWindowHandle> oldWindows) {
if (oldWindows == null || oldWindows.size() != newWindows.size()) {
return true;
@@ -253,34 +324,195 @@
return false;
}
- private void generateMagnificationSpecInverseMatrixLocked(int displayId) {
- MagnificationSpec spec = new MagnificationSpec();
- if (!mAccessibilityController.getMagnificationSpecForDisplay(displayId, spec)) {
- mMagnificationSpecInverseMatrix.remove(displayId);
- return;
+ @GuardedBy("mLock")
+ private void findMagnificationSpecInverseMatrixIfNeeded(SparseArray<List<InputWindowHandle>>
+ windowHandleList) {
+ MagnificationSpec currentMagnificationSpec;
+ MagnificationSpec previousMagnificationSpec;
+ for (int i = 0; i < windowHandleList.size(); i++) {
+ final int displayId = windowHandleList.keyAt(i);
+ List<InputWindowHandle> inputWindowHandles = windowHandleList.get(displayId);
+
+ final MagnificationSpec currentSpec = mCurrentMagnificationSpec.get(displayId);
+ if (currentSpec == null) {
+ continue;
+ }
+ currentMagnificationSpec = new MagnificationSpec();
+ currentMagnificationSpec.setTo(currentSpec);
+
+ final MagnificationSpec previousSpec = mPreviousMagnificationSpec.get(displayId);
+
+ if (previousSpec == null) {
+ final Matrix inverseMatrixForCurrentSpec = new Matrix();
+ generateInverseMatrix(currentMagnificationSpec, inverseMatrixForCurrentSpec);
+ mMagnificationSpecInverseMatrix.put(displayId, inverseMatrixForCurrentSpec);
+ continue;
+ }
+ previousMagnificationSpec = new MagnificationSpec();
+ previousMagnificationSpec.setTo(previousSpec);
+
+ generateInverseMatrixBasedOnProperMagnificationSpecForDisplay(inputWindowHandles,
+ currentMagnificationSpec, previousMagnificationSpec);
}
- sTempFloats[Matrix.MSCALE_X] = spec.scale;
- sTempFloats[Matrix.MSKEW_Y] = 0;
- sTempFloats[Matrix.MSKEW_X] = 0;
- sTempFloats[Matrix.MSCALE_Y] = spec.scale;
- sTempFloats[Matrix.MTRANS_X] = spec.offsetX;
- sTempFloats[Matrix.MTRANS_Y] = spec.offsetY;
- sTempFloats[Matrix.MPERSP_0] = 0;
- sTempFloats[Matrix.MPERSP_1] = 0;
- sTempFloats[Matrix.MPERSP_2] = 1;
+ }
+
+ @GuardedBy("mLock")
+ private void generateInverseMatrixBasedOnProperMagnificationSpecForDisplay(
+ List<InputWindowHandle> inputWindowHandles, MagnificationSpec currentMagnificationSpec,
+ MagnificationSpec previousMagnificationSpec) {
+ // To decrease the counts of holding the WindowManagerService#mGlogalLock in
+ // the method, getWindowTransformMatrix(), this for loop begins from the bottom
+ // to top of the z-order windows.
+ for (int index = inputWindowHandles.size() - 1; index >= 0; index--) {
+ final Matrix windowTransformMatrix = mTempMatrix2;
+ final InputWindowHandle windowHandle = inputWindowHandles.get(index);
+ final IBinder iBinder = windowHandle.getWindow().asBinder();
+
+ if (getWindowTransformMatrix(iBinder, windowTransformMatrix)) {
+ generateMagnificationSpecInverseMatrix(windowHandle, currentMagnificationSpec,
+ previousMagnificationSpec, windowTransformMatrix);
+
+ break;
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private boolean getWindowTransformMatrix(IBinder iBinder, Matrix outTransform) {
+ final Matrix windowMatrix = iBinder != null
+ ? mWindowsTransformMatrixMap.get(iBinder) : null;
+
+ if (windowMatrix == null) {
+ return false;
+ }
+ outTransform.set(windowMatrix);
+
+ return true;
+ }
+
+ /**
+ * Generates the inverse matrix based on the proper magnification spec.
+ * The magnification spec associated with the InputWindowHandle might not the current
+ * spec set by WM, which might be the previous one. To find the appropriate spec,
+ * we store two consecutive magnification specs, and found out which one is the proper
+ * one closing the identity matrix for generating the inverse matrix.
+ *
+ * @param inputWindowHandle The window from the surface flinger.
+ * @param currentMagnificationSpec The current magnification spec.
+ * @param previousMagnificationSpec The previous magnification spec.
+ * @param transformMatrix The transform matrix of the window doesn't consider the
+ * magnifying effect.
+ */
+ @GuardedBy("mLock")
+ private void generateMagnificationSpecInverseMatrix(InputWindowHandle inputWindowHandle,
+ @NonNull MagnificationSpec currentMagnificationSpec,
+ @NonNull MagnificationSpec previousMagnificationSpec, Matrix transformMatrix) {
+
+ final float[] identityMatrixFloatsForCurrentSpec = mTempFloat1;
+ computeIdentityMatrix(inputWindowHandle, currentMagnificationSpec,
+ transformMatrix, identityMatrixFloatsForCurrentSpec);
+ final float[] identityMatrixFloatsForPreviousSpec = mTempFloat2;
+ computeIdentityMatrix(inputWindowHandle, previousMagnificationSpec,
+ transformMatrix, identityMatrixFloatsForPreviousSpec);
+
+ Matrix inverseMatrixForMagnificationSpec = new Matrix();
+ if (selectProperMagnificationSpecByComparingIdentityDegree(
+ identityMatrixFloatsForCurrentSpec, identityMatrixFloatsForPreviousSpec)) {
+ generateInverseMatrix(currentMagnificationSpec,
+ inverseMatrixForMagnificationSpec);
+
+ // Choosing the current spec means the previous spec is out of date,
+ // so removing it. And if the current spec is no magnifying, meaning
+ // the magnifying is done so removing the inverse matrix of this display.
+ mPreviousMagnificationSpec.remove(inputWindowHandle.displayId);
+ if (currentMagnificationSpec.isNop()) {
+ mCurrentMagnificationSpec.remove(inputWindowHandle.displayId);
+ mMagnificationSpecInverseMatrix.remove(inputWindowHandle.displayId);
+ return;
+ }
+ } else {
+ generateInverseMatrix(previousMagnificationSpec,
+ inverseMatrixForMagnificationSpec);
+ }
+
+ mMagnificationSpecInverseMatrix.put(inputWindowHandle.displayId,
+ inverseMatrixForMagnificationSpec);
+ }
+
+ /**
+ * Computes the identity matrix for generating the
+ * inverse matrix based on below formula under window is at the stable state:
+ * inputWindowHandle#transform * MagnificationSpecMatrix * WindowState#transform
+ * = IdentityMatrix
+ */
+ @GuardedBy("mLock")
+ private void computeIdentityMatrix(InputWindowHandle inputWindowHandle,
+ @NonNull MagnificationSpec magnificationSpec,
+ Matrix transformMatrix, float[] magnifyMatrixFloats) {
+ final Matrix specMatrix = mTempMatrix1;
+ transformMagnificationSpecToMatrix(magnificationSpec, specMatrix);
+
+ final Matrix resultMatrix = new Matrix(inputWindowHandle.transform);
+ resultMatrix.preConcat(specMatrix);
+ resultMatrix.preConcat(transformMatrix);
+
+ resultMatrix.getValues(magnifyMatrixFloats);
+ }
+
+ /**
+ * @return true if selecting the magnification spec one, otherwise selecting the
+ * magnification spec two.
+ */
+ @GuardedBy("mLock")
+ private boolean selectProperMagnificationSpecByComparingIdentityDegree(
+ float[] magnifyMatrixFloatsForSpecOne,
+ float[] magnifyMatrixFloatsForSpecTwo) {
+ final float[] IdentityMatrixValues = mTempFloat3;
+ Matrix.IDENTITY_MATRIX.getValues(IdentityMatrixValues);
+
+ final float scaleDiffForSpecOne = Math.abs(IdentityMatrixValues[Matrix.MSCALE_X]
+ - magnifyMatrixFloatsForSpecOne[Matrix.MSCALE_X]);
+ final float scaleDiffForSpecTwo = Math.abs(IdentityMatrixValues[Matrix.MSCALE_X]
+ - magnifyMatrixFloatsForSpecTwo[Matrix.MSCALE_X]);
+ final float offsetXDiffForSpecOne = Math.abs(IdentityMatrixValues[Matrix.MTRANS_X]
+ - magnifyMatrixFloatsForSpecOne[Matrix.MTRANS_X]);
+ final float offsetXDiffForSpecTwo = Math.abs(IdentityMatrixValues[Matrix.MTRANS_X]
+ - magnifyMatrixFloatsForSpecTwo[Matrix.MTRANS_X]);
+ final float offsetYDiffForSpecOne = Math.abs(IdentityMatrixValues[Matrix.MTRANS_Y]
+ - magnifyMatrixFloatsForSpecOne[Matrix.MTRANS_Y]);
+ final float offsetYDiffForSpecTwo = Math.abs(IdentityMatrixValues[Matrix.MTRANS_Y]
+ - magnifyMatrixFloatsForSpecTwo[Matrix.MTRANS_Y]);
+ final float offsetDiffForSpecOne = offsetXDiffForSpecOne
+ + offsetYDiffForSpecOne;
+ final float offsetDiffForSpecTwo = offsetXDiffForSpecTwo
+ + offsetYDiffForSpecTwo;
+
+ return Float.compare(scaleDiffForSpecTwo, scaleDiffForSpecOne) > 0
+ || (Float.compare(scaleDiffForSpecTwo, scaleDiffForSpecOne) == 0
+ && Float.compare(offsetDiffForSpecTwo, offsetDiffForSpecOne) > 0);
+ }
+
+ @GuardedBy("mLock")
+ private static void generateInverseMatrix(MagnificationSpec spec, Matrix outMatrix) {
+ outMatrix.reset();
final Matrix tempMatrix = new Matrix();
- tempMatrix.setValues(sTempFloats);
+ transformMagnificationSpecToMatrix(spec, tempMatrix);
- final Matrix inverseMatrix = new Matrix();
- final boolean result = tempMatrix.invert(inverseMatrix);
-
+ final boolean result = tempMatrix.invert(outMatrix);
if (!result) {
Slog.e(TAG, "Can't inverse the magnification spec matrix with the "
- + "magnification spec = " + spec + " on the displayId = " + displayId);
- return;
+ + "magnification spec = " + spec);
+ outMatrix.reset();
}
- mMagnificationSpecInverseMatrix.set(displayId, inverseMatrix);
+ }
+
+ @GuardedBy("mLock")
+ private static void transformMagnificationSpecToMatrix(MagnificationSpec spec,
+ Matrix outMatrix) {
+ outMatrix.reset();
+ outMatrix.postScale(spec.scale, spec.scale);
+ outMatrix.postTranslate(spec.offsetX, spec.offsetY);
}
private void notifyWindowsChanged(@NonNull List<Integer> displayIdsForWindowsChanged) {
@@ -310,6 +542,9 @@
mMagnificationSpecInverseMatrix.clear();
mVisibleWindows.clear();
mDisplayInfos.clear();
+ mCurrentMagnificationSpec.clear();
+ mPreviousMagnificationSpec.clear();
+ mWindowsTransformMatrixMap.clear();
mWindowsNotificationEnabled = false;
mHandler.removeCallbacksAndMessages(null);
}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index d772586..26815b4 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -5084,10 +5084,9 @@
}
if (!visible) {
- final InsetsControlTarget imeInputTarget = mDisplayContent.getImeTarget(
- DisplayContent.IME_TARGET_INPUT);
- mLastImeShown = imeInputTarget != null && imeInputTarget.getWindow() != null
- && imeInputTarget.getWindow().mActivityRecord == this
+ final InputTarget imeInputTarget = mDisplayContent.getImeInputTarget();
+ mLastImeShown = imeInputTarget != null && imeInputTarget.getWindowState() != null
+ && imeInputTarget.getWindowState().mActivityRecord == this
&& mDisplayContent.mInputMethodWindow != null
&& mDisplayContent.mInputMethodWindow.isVisible();
mImeInsetsFrozenUntilStartInput = true;
@@ -6187,6 +6186,10 @@
// The pending transition state will be cleared after the transition is started, so
// save the state for launching the client later (used by LaunchActivityItem).
mStartingData.mIsTransitionForward = true;
+ // Ensure that the transition can run with the latest orientation.
+ if (this != mDisplayContent.getLastOrientationSource()) {
+ mDisplayContent.updateOrientation();
+ }
mDisplayContent.executeAppTransition();
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 2a26050..c9b8501 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -523,8 +523,8 @@
}
void registerRemoteAnimationForNextActivityStart(String packageName,
- RemoteAnimationAdapter adapter) {
- mPendingRemoteAnimationRegistry.addPendingAnimation(packageName, adapter);
+ RemoteAnimationAdapter adapter, @Nullable IBinder launchCookie) {
+ mPendingRemoteAnimationRegistry.addPendingAnimation(packageName, adapter, launchCookie);
}
PendingRemoteAnimationRegistry getPendingRemoteAnimationRegistry() {
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 47bec30..fd2afd4 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -208,6 +208,9 @@
private boolean mAvoidMoveToFront;
private boolean mFrozeTaskList;
private boolean mTransientLaunch;
+ // The task which was above the targetTask before starting this activity. null if the targetTask
+ // was already on top or if the activity is in a new task.
+ private Task mPriorAboveTask;
// We must track when we deliver the new intent since multiple code paths invoke
// {@link #deliverNewIntent}. This is due to early returns in the code path. This flag is used
@@ -1666,7 +1669,8 @@
if (isTransient) {
// `r` isn't guaranteed to be the actual relevant activity, so we must wait
// until after we launched to identify the relevant activity.
- transitionController.setTransientLaunch(mLastStartActivityRecord);
+ transitionController.setTransientLaunch(mLastStartActivityRecord,
+ mPriorAboveTask);
}
if (newTransition != null) {
transitionController.requestStartTransition(newTransition,
@@ -1785,6 +1789,10 @@
return startResult;
}
+ if (targetTask != null) {
+ mPriorAboveTask = TaskDisplayArea.getRootTaskAbove(targetTask.getRootTask());
+ }
+
final ActivityRecord targetTaskTop = newTask
? null : targetTask.getTopNonFinishingActivity();
if (targetTaskTop != null) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index fe4eae91..062e73d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -3714,7 +3714,7 @@
@Override
public void registerRemoteAnimationForNextActivityStart(String packageName,
- RemoteAnimationAdapter adapter) {
+ RemoteAnimationAdapter adapter, IBinder launchCookie) {
mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
"registerRemoteAnimationForNextActivityStart");
adapter.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
@@ -3722,7 +3722,7 @@
final long origId = Binder.clearCallingIdentity();
try {
getActivityStartController().registerRemoteAnimationForNextActivityStart(
- packageName, adapter);
+ packageName, adapter, launchCookie);
} finally {
Binder.restoreCallingIdentity(origId);
}
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 9893f68..487aff6 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -98,20 +98,33 @@
HardwareBuffer screenshotBuffer = null;
int prevTaskId;
int prevUserId;
- IOnBackInvokedCallback applicationCallback = null;
- IOnBackInvokedCallback systemCallback = null;
RemoteAnimationTarget topAppTarget;
SurfaceControl animLeash;
+ IOnBackInvokedCallback callback = null;
synchronized (task.mWmService.mGlobalLock) {
- activityRecord = task.topRunningActivity();
- removedWindowContainer = activityRecord;
- taskWindowConfiguration = task.getTaskInfo().configuration.windowConfiguration;
- WindowState window = task.getWindow(WindowState::isFocused);
+ // TODO Temp workaround for Sysui until b/221071505 is fixed
+ WindowState window = task.mWmService.getFocusedWindowLocked();
+ if (window == null) {
+ activityRecord = task.topRunningActivity();
+ removedWindowContainer = activityRecord;
+ taskWindowConfiguration = task.getTaskInfo().configuration.windowConfiguration;
+ window = task.getWindow(WindowState::isFocused);
+ } else {
+ activityRecord = window.mActivityRecord;
+ removedWindowContainer = activityRecord;
+ taskWindowConfiguration = window.getWindowConfiguration();
+ }
+ IOnBackInvokedCallback applicationCallback = null;
+ IOnBackInvokedCallback systemCallback = null;
if (window != null) {
applicationCallback = window.getApplicationOnBackInvokedCallback();
- systemCallback = window.getSystemOnBackInvokedCallback();
+ callback = applicationCallback;
+ if (callback == null) {
+ systemCallback = window.getSystemOnBackInvokedCallback();
+ callback = systemCallback;
+ }
}
ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "startBackNavigation task=%s, "
@@ -119,16 +132,25 @@
+ "systemBackCallback=%s",
task, activityRecord, applicationCallback, systemCallback);
+ // TODO Temp workaround for Sysui until b/221071505 is fixed
+ if (activityRecord == null && callback != null) {
+ return new BackNavigationInfo(BackNavigationInfo.TYPE_CALLBACK,
+ null /* topWindowLeash */, null /* screenshotSurface */,
+ null /* screenshotBuffer */, null /* taskWindowConfiguration */,
+ null /* onBackNavigationDone */,
+ callback /* onBackInvokedCallback */);
+ }
+
// For IME and Home, either a callback is registered, or we do nothing. In both cases,
// we don't need to pass the leashes below.
- if (task.getDisplayContent().getImeContainer().isVisible()
+ if (activityRecord == null || task.getDisplayContent().getImeContainer().isVisible()
|| activityRecord.isActivityTypeHome()) {
- if (applicationCallback != null) {
+ if (callback != null) {
return new BackNavigationInfo(BackNavigationInfo.TYPE_CALLBACK,
null /* topWindowLeash */, null /* screenshotSurface */,
null /* screenshotBuffer */, null /* taskWindowConfiguration */,
null /* onBackNavigationDone */,
- applicationCallback /* onBackInvokedCallback */);
+ callback /* onBackInvokedCallback */);
} else {
return null;
}
@@ -137,12 +159,12 @@
prev = task.getActivity(
(r) -> !r.finishing && r.getTask() == task && !r.isTopRunningActivity());
- if (applicationCallback != null) {
+ if (callback != null) {
return new BackNavigationInfo(BackNavigationInfo.TYPE_CALLBACK,
null /* topWindowLeash */, null /* screenshotSurface */,
null /* screenshotBuffer */, null /* taskWindowConfiguration */,
null /* onBackNavigationDone */,
- applicationCallback /* onBackInvokedCallback */);
+ callback /* onBackInvokedCallback */);
} else if (prev != null) {
backType = BackNavigationInfo.TYPE_CROSS_ACTIVITY;
} else if (task.returnsToHomeRootTask()) {
@@ -239,8 +261,6 @@
return null;
}
- final IOnBackInvokedCallback callback =
- applicationCallback != null ? applicationCallback : systemCallback;
RemoteCallback onBackNavigationDone = new RemoteCallback(
result -> resetSurfaces(finalRemovedWindowContainer
));
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 83ff2f0..195d425 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -592,7 +592,15 @@
* The window which receives input from the input method. This is also a candidate of the
* input method control target.
*/
- private WindowState mImeInputTarget;
+ private InputTarget mImeInputTarget;
+
+ /**
+ * The last ime input target processed from setImeLayeringTargetInner
+ * this is to ensure we update the control target in the case when the IME
+ * target changes while the IME layering target stays the same, for example
+ * the case of the IME moving to a SurfaceControlViewHost backed EmbeddedWindow
+ */
+ private InputTarget mLastImeInputTarget;
/**
* This controls the visibility and animation of the input method window.
@@ -608,14 +616,6 @@
static final int IME_TARGET_LAYERING = 0;
/**
- * Used by {@link #getImeTarget} to return the IME target which received the input connection
- * from IME.
- *
- * @see #mImeInputTarget
- */
- static final int IME_TARGET_INPUT = 1;
-
- /**
* Used by {@link #getImeTarget} to return the IME target which controls the IME insets
* visibility and animation.
*
@@ -625,7 +625,6 @@
@IntDef(flag = false, prefix = { "IME_TARGET_" }, value = {
IME_TARGET_LAYERING,
- IME_TARGET_INPUT,
IME_TARGET_CONTROL,
})
@Retention(RetentionPolicy.SOURCE)
@@ -1642,18 +1641,12 @@
// It has been set and not yet finished.
return true;
}
- if (!r.occludesParent()) {
+ if (!r.occludesParent() || r.isReportedDrawn()) {
// While entering or leaving a translucent or floating activity (e.g. dialog style),
// there is a visible activity in the background. Then it still needs rotation animation
// to cover the activity configuration change.
return false;
}
- if (mTransitionController.isShellTransitionsEnabled()
- ? mTransitionController.wasVisibleAtStart(r) : r.isVisible()) {
- // If activity is already visible, then it's not "launching". However, shell-transitions
- // will make it visible immediately.
- return false;
- }
if (checkOpening) {
if (mTransitionController.isShellTransitionsEnabled()) {
if (!mTransitionController.isCollecting(r)) {
@@ -3314,7 +3307,7 @@
mImeLayeringTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel);
}
if (mImeInputTarget != null) {
- mImeInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel);
+ mImeInputTarget.dumpProto(proto, INPUT_METHOD_INPUT_TARGET, logLevel);
}
if (mImeControlTarget != null
&& mImeControlTarget.getWindow() != null) {
@@ -3877,7 +3870,7 @@
}
private boolean isImeControlledByApp() {
- return mImeInputTarget != null && !mImeInputTarget.inMultiWindowMode();
+ return mImeInputTarget != null && mImeInputTarget.shouldControlIme();
}
boolean shouldImeAttachedToApp() {
@@ -3940,19 +3933,21 @@
*
* @param type The type of the IME target.
* @see #IME_TARGET_LAYERING
- * @see #IME_TARGET_INPUT
* @see #IME_TARGET_CONTROL
*/
InsetsControlTarget getImeTarget(@InputMethodTarget int type) {
switch (type) {
case IME_TARGET_LAYERING: return mImeLayeringTarget;
- case IME_TARGET_INPUT: return mImeInputTarget;
case IME_TARGET_CONTROL: return mImeControlTarget;
default:
return null;
}
}
+ InputTarget getImeInputTarget() {
+ return mImeInputTarget;
+ }
+
// IMPORTANT: When introducing new dependencies in this method, make sure that
// changes to those result in RootWindowContainer.updateDisplayImePolicyCache()
// being called.
@@ -4001,9 +3996,18 @@
* placed at its parent's surface.
*/
private void setImeLayeringTargetInner(@Nullable WindowState target) {
- if (target == mImeLayeringTarget) {
+ /**
+ * This function is also responsible for updating the IME control target
+ * and so in the case where the IME layering target does not change
+ * but the Input target does (for example, IME moving to a SurfaceControlViewHost
+ * we have to continue executing this function, otherwise there is no work
+ * to do.
+ */
+ if (target == mImeLayeringTarget && mLastImeInputTarget == mImeInputTarget) {
return;
}
+ mLastImeInputTarget = mImeInputTarget;
+
// If the IME target is the input target, before it changes, prepare the IME screenshot
// for the last IME target when its task is applying app transition. This is for the
// better IME transition to keep IME visibility when transitioning to the next task.
@@ -4045,9 +4049,9 @@
}
@VisibleForTesting
- void setImeInputTarget(WindowState target) {
+ void setImeInputTarget(InputTarget target) {
mImeInputTarget = target;
- boolean canScreenshot = mImeInputTarget == null || !mImeInputTarget.isSecureLocked();
+ boolean canScreenshot = mImeInputTarget == null || mImeInputTarget.canScreenshotIme();
if (mImeWindowsContainer.setCanScreenshot(canScreenshot)) {
mWmService.requestTraversal();
}
@@ -4163,7 +4167,7 @@
* The IME input target is the window which receives input from IME. It is also a candidate
* which controls the visibility and animation of the input method window.
*/
- void updateImeInputAndControlTarget(WindowState target) {
+ void updateImeInputAndControlTarget(InputTarget target) {
if (mImeInputTarget != target) {
ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target);
setImeInputTarget(target);
@@ -4173,8 +4177,8 @@
}
// Unfreeze IME insets after the new target updated, in case updateAboveInsetsState may
// deliver unrelated IME insets change to the non-IME requester.
- if (target != null && target.mActivityRecord != null) {
- target.mActivityRecord.mImeInsetsFrozenUntilStartInput = false;
+ if (target != null) {
+ target.unfreezeInsetsAfterStartInput();
}
}
@@ -4232,11 +4236,11 @@
InsetsControlTarget computeImeControlTarget() {
if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null
|| (mImeInputTarget != null
- && getImeHostOrFallback(mImeInputTarget.getWindow())
- == mRemoteInsetsControlTarget)) {
+ && getImeHostOrFallback(mImeInputTarget.getWindowState())
+ == mRemoteInsetsControlTarget)) {
return mRemoteInsetsControlTarget;
} else {
- return mImeInputTarget;
+ return mImeInputTarget != null ? mImeInputTarget.getWindowState() : null;
}
}
@@ -4249,7 +4253,7 @@
// screen. If it's not covering the entire screen the IME might extend beyond the apps
// bounds.
if (shouldImeAttachedToApp()) {
- if (mImeLayeringTarget.mActivityRecord != mImeInputTarget.mActivityRecord) {
+ if (mImeLayeringTarget.mActivityRecord != mImeInputTarget.getActivityRecord()) {
// Do not change parent if the window hasn't requested IME.
return null;
}
diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
index 2ab08e6..dcc16eb 100644
--- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java
+++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
@@ -17,6 +17,9 @@
package com.android.server.wm;
+import static com.android.server.wm.IdentifierProto.HASH_CODE;
+import static com.android.server.wm.IdentifierProto.TITLE;
+import static com.android.server.wm.WindowContainerProto.IDENTIFIER;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -25,6 +28,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.ArrayMap;
+import android.util.proto.ProtoOutputStream;
import android.util.Slog;
import android.view.IWindow;
import android.view.InputApplicationHandle;
@@ -43,6 +47,8 @@
private ArrayMap<IBinder /*input token */, EmbeddedWindow> mWindows = new ArrayMap<>();
private ArrayMap<IBinder /*focus grant token */, EmbeddedWindow> mWindowsByFocusToken =
new ArrayMap<>();
+ private ArrayMap<IBinder /*window token*/, EmbeddedWindow> mWindowsByWindowToken =
+ new ArrayMap<>();
private final Object mGlobalLock;
private final ActivityTaskManagerService mAtmService;
@@ -63,6 +69,7 @@
mWindows.put(inputToken, window);
final IBinder focusToken = window.getFocusGrantToken();
mWindowsByFocusToken.put(focusToken, window);
+ mWindowsByWindowToken.put(window.getWindowToken(), window);
updateProcessController(window);
window.mClient.asBinder().linkToDeath(()-> {
synchronized (mGlobalLock) {
@@ -116,6 +123,7 @@
if (ew.mClient.asBinder() == client.asBinder()) {
mWindows.removeAt(i).onRemoved();
mWindowsByFocusToken.remove(ew.getFocusGrantToken());
+ mWindowsByWindowToken.remove(ew.getWindowToken());
return;
}
}
@@ -127,6 +135,7 @@
if (ew.mHostWindowState == host) {
mWindows.removeAt(i).onRemoved();
mWindowsByFocusToken.remove(ew.getFocusGrantToken());
+ mWindowsByWindowToken.remove(ew.getWindowToken());
}
}
}
@@ -139,6 +148,10 @@
return mWindowsByFocusToken.get(focusGrantToken);
}
+ EmbeddedWindow getByWindowToken(IBinder windowToken) {
+ return mWindowsByWindowToken.get(windowToken);
+ }
+
void onActivityRemoved(ActivityRecord activityRecord) {
for (int i = mWindows.size() - 1; i >= 0; i--) {
final EmbeddedWindow window = mWindows.valueAt(i);
@@ -244,15 +257,29 @@
}
@Override
+ public DisplayContent getDisplayContent() {
+ return mWmService.mRoot.getDisplayContent(getDisplayId());
+ }
+
+ @Override
public IWindow getIWindow() {
return mClient;
}
+ public IBinder getWindowToken() {
+ return mClient.asBinder();
+ }
+
@Override
public int getPid() {
return mOwnerPid;
}
+ @Override
+ public int getUid() {
+ return mOwnerUid;
+ }
+
void setIsOverlay() {
mIsOverlay = true;
}
@@ -297,5 +324,46 @@
public void handleTapOutsideFocusInsideSelf() {
handleTap(true);
}
+
+ @Override
+ public boolean shouldControlIme() {
+ return false;
+ }
+
+ @Override
+ public boolean canScreenshotIme() {
+ return true;
+ }
+
+ @Override
+ public void unfreezeInsetsAfterStartInput() {
+ }
+
+ @Override
+ public InsetsControlTarget getImeControlTarget() {
+ return mWmService.getDefaultDisplayContentLocked().mRemoteInsetsControlTarget;
+ }
+
+ @Override
+ public boolean isInputMethodClientFocus(int uid, int pid) {
+ return uid == mOwnerUid && pid == mOwnerPid;
+ }
+
+ @Override
+ public ActivityRecord getActivityRecord() {
+ return null;
+ }
+
+ @Override
+ public void dumpProto(ProtoOutputStream proto, long fieldId,
+ @WindowTraceLogLevel int logLevel) {
+ final long token = proto.start(fieldId);
+
+ final long token2 = proto.start(IDENTIFIER);
+ proto.write(HASH_CODE, System.identityHashCode(this));
+ proto.write(TITLE, "EmbeddedWindow");
+ proto.end(token2);
+ proto.end(token);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index f24e429..199517c 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -21,7 +21,6 @@
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
-import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.ImeInsetsSourceProviderProto.IME_TARGET_FROM_IME;
import static com.android.server.wm.ImeInsetsSourceProviderProto.INSETS_SOURCE_PROVIDER;
@@ -249,7 +248,7 @@
}
private boolean isImeInputTarget(InsetsControlTarget target) {
- return target == mDisplayContent.getImeTarget(IME_TARGET_INPUT);
+ return target == mDisplayContent.getImeInputTarget();
}
private boolean sameAsImeControlTarget() {
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 44818a8..31ae864 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -414,6 +414,17 @@
final IBinder focusToken = focus != null ? focus.mInputChannelToken : null;
if (focusToken == null) {
mInputFocus = null;
+ // When an app is focused, but its window is not showing yet, remove the input focus
+ // from the current window.
+ if (mDisplayContent.mFocusedApp != null) {
+ ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "App %s is focused,"
+ + " but the window is not ready. Start a transaction to remove focus from"
+ + " the window of non-focused apps.",
+ mDisplayContent.mFocusedApp.getName());
+ EventLog.writeEvent(LOGTAG_INPUT_FOCUS, "Requesting to set focus to null window",
+ "reason=UpdateInputWindows");
+ mInputTransaction.removeCurrentInputFocus(mDisplayId);
+ }
return;
}
diff --git a/services/core/java/com/android/server/wm/InputTarget.java b/services/core/java/com/android/server/wm/InputTarget.java
index 5166b8a..b5ab62b 100644
--- a/services/core/java/com/android/server/wm/InputTarget.java
+++ b/services/core/java/com/android/server/wm/InputTarget.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import android.view.IWindow;
+import android.util.proto.ProtoOutputStream;
/**
* Common interface between focusable objects.
@@ -36,6 +37,7 @@
/* Owning pid of the target. */
int getPid();
+ int getUid();
/**
* Indicates whether a target should receive focus from server side
@@ -45,7 +47,25 @@
*/
boolean receiveFocusFromTapOutside();
+ // Gaining focus
void handleTapOutsideFocusInsideSelf();
+ // Losing focus
void handleTapOutsideFocusOutsideSelf();
+
+ // Whether this input target can control the IME itself
+ boolean shouldControlIme();
+ // Whether this input target can be screenshoted by the IME system
+ boolean canScreenshotIme();
+
+ ActivityRecord getActivityRecord();
+ void unfreezeInsetsAfterStartInput();
+
+ boolean isInputMethodClientFocus(int uid, int pid);
+
+ DisplayContent getDisplayContent();
+ InsetsControlTarget getImeControlTarget();
+
+ void dumpProto(ProtoOutputStream proto, long fieldId,
+ @WindowTraceLogLevel int logLevel);
}
diff --git a/services/core/java/com/android/server/wm/PendingRemoteAnimationRegistry.java b/services/core/java/com/android/server/wm/PendingRemoteAnimationRegistry.java
index 3b8631a..073bbbb 100644
--- a/services/core/java/com/android/server/wm/PendingRemoteAnimationRegistry.java
+++ b/services/core/java/com/android/server/wm/PendingRemoteAnimationRegistry.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.os.Handler;
+import android.os.IBinder;
import android.util.ArrayMap;
import android.view.RemoteAnimationAdapter;
@@ -43,8 +44,9 @@
/**
* Adds a remote animation to be run for all activity starts originating from a certain package.
*/
- void addPendingAnimation(String packageName, RemoteAnimationAdapter adapter) {
- mEntries.put(packageName, new Entry(packageName, adapter));
+ void addPendingAnimation(String packageName, RemoteAnimationAdapter adapter,
+ @Nullable IBinder launchCookie) {
+ mEntries.put(packageName, new Entry(packageName, adapter, launchCookie));
}
/**
@@ -62,6 +64,10 @@
} else {
options.setRemoteAnimationAdapter(entry.adapter);
}
+ IBinder launchCookie = entry.launchCookie;
+ if (launchCookie != null) {
+ options.setLaunchCookie(launchCookie);
+ }
mEntries.remove(callingPackage);
return options;
}
@@ -69,10 +75,13 @@
private class Entry {
final String packageName;
final RemoteAnimationAdapter adapter;
+ @Nullable
+ final IBinder launchCookie;
- Entry(String packageName, RemoteAnimationAdapter adapter) {
+ Entry(String packageName, RemoteAnimationAdapter adapter, @Nullable IBinder launchCookie) {
this.packageName = packageName;
this.adapter = adapter;
+ this.launchCookie = launchCookie;
mHandler.postDelayed(() -> {
synchronized (mLock) {
final Entry entry = mEntries.get(packageName);
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index bf33f86..0f5828c 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -167,8 +167,11 @@
*/
private final ArraySet<WindowToken> mVisibleAtTransitionEndTokens = new ArraySet<>();
- /** Set of transient activities (lifecycle initially tied to this transition). */
- private ArraySet<ActivityRecord> mTransientLaunches = null;
+ /**
+ * Set of transient activities (lifecycle initially tied to this transition) and their
+ * restore-below tasks.
+ */
+ private ArrayMap<ActivityRecord, Task> mTransientLaunches = null;
/** Custom activity-level animation options and callbacks. */
private TransitionInfo.AnimationOptions mOverrideOptions;
@@ -196,17 +199,26 @@
}
/** Records an activity as transient-launch. This activity must be already collected. */
- void setTransientLaunch(@NonNull ActivityRecord activity) {
+ void setTransientLaunch(@NonNull ActivityRecord activity, @Nullable Task restoreBelow) {
if (mTransientLaunches == null) {
- mTransientLaunches = new ArraySet<>();
+ mTransientLaunches = new ArrayMap<>();
}
- mTransientLaunches.add(activity);
+ mTransientLaunches.put(activity, restoreBelow);
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Transition %d: Set %s as "
+ "transient-launch", mSyncId, activity);
}
boolean isTransientLaunch(@NonNull ActivityRecord activity) {
- return mTransientLaunches != null && mTransientLaunches.contains(activity);
+ return mTransientLaunches != null && mTransientLaunches.containsKey(activity);
+ }
+
+ Task getTransientLaunchRestoreTarget(@NonNull WindowContainer container) {
+ for (int i = 0; i < mTransientLaunches.size(); ++i) {
+ if (mTransientLaunches.keyAt(i).isDescendantOf(container)) {
+ return mTransientLaunches.valueAt(i);
+ }
+ }
+ return null;
}
boolean isOnDisplay(@NonNull DisplayContent dc) {
@@ -464,7 +476,7 @@
&& ar.pictureInPictureArgs.isAutoEnterEnabled()) {
if (mTransientLaunches != null) {
for (int j = 0; j < mTransientLaunches.size(); ++j) {
- if (mTransientLaunches.valueAt(j).isVisibleRequested()) {
+ if (mTransientLaunches.keyAt(j).isVisibleRequested()) {
// force enable pip-on-task-switch now that we've committed
// to actually launching to the transient activity.
ar.supportsEnterPipOnTaskSwitch = true;
@@ -543,7 +555,7 @@
// Transient-launch activities cannot be IME target (WindowState#canBeImeTarget),
// so re-compute in case the IME target is changed after transition.
for (int t = 0; t < mTransientLaunches.size(); ++t) {
- if (mTransientLaunches.valueAt(t).getDisplayContent() == dc) {
+ if (mTransientLaunches.keyAt(t).getDisplayContent() == dc) {
dc.computeImeTarget(true /* updateImeTarget */);
break;
}
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index c13ae95..b0532c2 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -282,21 +282,6 @@
return false;
}
- /**
- * Temporary work-around to deal with integration of legacy fixed-rotation. Returns whether
- * the activity was visible before the collecting transition.
- * TODO: at-least replace the polling mechanism.
- */
- boolean wasVisibleAtStart(@NonNull ActivityRecord ar) {
- if (mCollectingTransition == null) return ar.isVisible();
- final Transition.ChangeInfo ci = mCollectingTransition.mChanges.get(ar);
- if (ci == null) {
- // not part of transition, so use current state.
- return ar.isVisible();
- }
- return ci.mVisible;
- }
-
@WindowConfiguration.WindowingMode
int getWindowingModeAtStart(@NonNull WindowContainer wc) {
if (mCollectingTransition == null) return wc.getWindowingMode();
@@ -520,10 +505,12 @@
/**
* Record that the launch of {@param activity} is transient (meaning its lifecycle is currently
* tied to the transition).
+ * @param restoreBelowTask If non-null, the activity's task will be ordered right below this
+ * task if requested.
*/
- void setTransientLaunch(@NonNull ActivityRecord activity) {
+ void setTransientLaunch(@NonNull ActivityRecord activity, @Nullable Task restoreBelowTask) {
if (mCollectingTransition == null) return;
- mCollectingTransition.setTransientLaunch(activity);
+ mCollectingTransition.setTransientLaunch(activity, restoreBelowTask);
// TODO(b/188669821): Remove once legacy recents behavior is moved to shell.
// Also interpret HOME transient launch as recents
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index bbc8462..d306082 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -437,15 +437,9 @@
+ " already exists. Overwriting");
}
}
- if (insetsSourceProvider == null
- || !(insetsSourceProvider instanceof RectInsetsSourceProvider)) {
- insetsSourceProvider =
- new RectInsetsSourceProvider(
- new InsetsSource(insetsTypes[i]),
- mDisplayContent.getInsetsStateController(),
- mDisplayContent);
- mLocalInsetsSourceProviders.put(insetsTypes[i], insetsSourceProvider);
- }
+ insetsSourceProvider = new RectInsetsSourceProvider(new InsetsSource(insetsTypes[i]),
+ mDisplayContent.getInsetsStateController(), mDisplayContent);
+ mLocalInsetsSourceProviders.put(insetsTypes[i], insetsSourceProvider);
((RectInsetsSourceProvider) insetsSourceProvider).setRect(providerFrame);
}
mDisplayContent.getInsetsStateController().updateAboveInsetsState(true);
@@ -1029,7 +1023,7 @@
return mProvidedInsetsSources;
}
- DisplayContent getDisplayContent() {
+ public DisplayContent getDisplayContent() {
return mDisplayContent;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 709f885..6445d1e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -114,7 +114,6 @@
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON_CHANGE_DISPLAY;
import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
-import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL;
@@ -4900,7 +4899,7 @@
}
}
- private WindowState getFocusedWindowLocked() {
+ WindowState getFocusedWindowLocked() {
// Return the focused window in the focused display.
return mRoot.getTopFocusedDisplayContent().mCurrentFocus;
}
@@ -5069,6 +5068,15 @@
return null;
}
+ @Nullable InputTarget getInputTargetFromWindowTokenLocked(IBinder windowToken) {
+ InputTarget window = mWindowMap.get(windowToken);
+ if (window != null) {
+ return window;
+ }
+ window = mEmbeddedWindowController.getByWindowToken(windowToken);
+ return window;
+ }
+
void reportFocusChanged(IBinder oldToken, IBinder newToken) {
InputTarget lastTarget;
InputTarget newTarget;
@@ -6506,7 +6514,7 @@
mRoot.forAllDisplays(dc -> {
final int displayId = dc.getDisplayId();
final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING);
- final InsetsControlTarget imeInputTarget = dc.getImeTarget(IME_TARGET_INPUT);
+ final InputTarget imeInputTarget = dc.getImeInputTarget();
final InsetsControlTarget imeControlTarget = dc.getImeTarget(IME_TARGET_CONTROL);
if (imeLayeringTarget != null) {
pw.print(" imeLayeringTarget in display# "); pw.print(displayId);
@@ -7714,7 +7722,8 @@
+ " imeTargetWindowToken=" + imeTargetWindowToken);
}
synchronized (mGlobalLock) {
- final WindowState imeTarget = mWindowMap.get(imeTargetWindowToken);
+ InputTarget imeTarget =
+ getInputTargetFromWindowTokenLocked(imeTargetWindowToken);
if (imeTarget != null) {
imeTarget.getDisplayContent().updateImeInputAndControlTarget(imeTarget);
}
@@ -7794,11 +7803,11 @@
}
synchronized (mGlobalLock) {
final DisplayContent displayContent = mRoot.getTopFocusedDisplayContent();
- final WindowState window = mWindowMap.get(windowToken);
- if (window == null) {
+ InputTarget target = getInputTargetFromWindowTokenLocked(windowToken);
+ if (target == null) {
return ImeClientFocusResult.NOT_IME_TARGET_WINDOW;
}
- final int tokenDisplayId = window.getDisplayContent().getDisplayId();
+ final int tokenDisplayId = target.getDisplayContent().getDisplayId();
if (tokenDisplayId != displayId) {
Slog.e(TAG, "isInputMethodClientFocus: display ID mismatch."
+ " from client: " + displayId
@@ -7811,7 +7820,7 @@
return ImeClientFocusResult.INVALID_DISPLAY_ID;
}
- if (displayContent.isInputMethodClientFocus(uid, pid)) {
+ if (target.isInputMethodClientFocus(uid, pid)) {
return ImeClientFocusResult.HAS_IME_FOCUS;
}
// Okay, how about this... what is the current focus?
@@ -7835,7 +7844,7 @@
@Override
public void showImePostLayout(IBinder imeTargetWindowToken) {
synchronized (mGlobalLock) {
- WindowState imeTarget = mWindowMap.get(imeTargetWindowToken);
+ InputTarget imeTarget = getInputTargetFromWindowTokenLocked(imeTargetWindowToken);
if (imeTarget == null) {
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 4c7891b..c70a40c 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -30,6 +30,7 @@
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT_ACTIVITY_TO_TASK_FRAGMENT;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REPARENT_CHILDREN;
+import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_RESTORE_TRANSIENT_ORDER;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_ROOTS;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS;
import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT;
@@ -358,10 +359,11 @@
if (t != null && callback != null) {
syncId = startSyncWithOrganizer(callback);
}
+ final Transition transition = Transition.fromBinder(transitionToken);
// apply the incoming transaction before finish in case it alters the visibility
// of the participants.
if (t != null) {
- applyTransaction(t, syncId, null /*transition*/, caller);
+ applyTransaction(t, syncId, null /*transition*/, caller, transition);
}
getTransitionController().finishTransition(transitionToken);
if (syncId >= 0) {
@@ -374,13 +376,20 @@
}
}
+ private void applyTransaction(@NonNull WindowContainerTransaction t, int syncId,
+ @Nullable Transition transition, @NonNull CallerInfo caller) {
+ applyTransaction(t, syncId, transition, caller, null /* finishTransition */);
+ }
+
/**
* @param syncId If non-null, this will be a sync-transaction.
* @param transition A transition to collect changes into.
* @param caller Info about the calling process.
+ * @param finishTransition The transition that is currently being finished.
*/
private void applyTransaction(@NonNull WindowContainerTransaction t, int syncId,
- @Nullable Transition transition, @NonNull CallerInfo caller) {
+ @Nullable Transition transition, @NonNull CallerInfo caller,
+ @Nullable Transition finishTransition) {
int effects = 0;
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Apply window transaction, syncId=%d", syncId);
mService.deferWindowLayout();
@@ -433,7 +442,7 @@
for (int i = 0; i < hopSize; ++i) {
effects |= applyHierarchyOp(hops.get(i), effects, syncId, transition,
isInLockTaskMode, caller, t.getErrorCallbackToken(),
- t.getTaskFragmentOrganizer());
+ t.getTaskFragmentOrganizer(), finishTransition);
}
}
// Queue-up bounds-change transactions for tasks which are now organized. Do
@@ -604,7 +613,7 @@
private int applyHierarchyOp(WindowContainerTransaction.HierarchyOp hop, int effects,
int syncId, @Nullable Transition transition, boolean isInLockTaskMode,
@NonNull CallerInfo caller, @Nullable IBinder errorCallbackToken,
- @Nullable ITaskFragmentOrganizer organizer) {
+ @Nullable ITaskFragmentOrganizer organizer, @Nullable Transition finishTransition) {
final int type = hop.getType();
switch (type) {
case HIERARCHY_OP_TYPE_SET_LAUNCH_ROOT: {
@@ -873,6 +882,19 @@
effects |= TRANSACT_EFFECTS_LIFECYCLE;
break;
}
+ case HIERARCHY_OP_TYPE_RESTORE_TRANSIENT_ORDER: {
+ if (finishTransition == null) break;
+ final WindowContainer container = WindowContainer.fromBinder(hop.getContainer());
+ if (container == null) break;
+ final Task thisTask = container.asActivityRecord() != null
+ ? container.asActivityRecord().getTask() : container.asTask();
+ if (thisTask == null) break;
+ final Task restoreAt = finishTransition.getTransientLaunchRestoreTarget(container);
+ if (restoreAt == null) break;
+ final TaskDisplayArea taskDisplayArea = thisTask.getTaskDisplayArea();
+ taskDisplayArea.moveRootTaskBehindRootTask(thisTask.getRootTask(), restoreAt);
+ break;
+ }
}
return effects;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 26acf43..517837c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -120,7 +120,6 @@
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT;
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
import static com.android.server.wm.AnimationSpecProto.MOVE;
-import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.DisplayContent.logsGestureExclusionRestrictions;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
@@ -1602,14 +1601,14 @@
}
@Override
- DisplayContent getDisplayContent() {
+ public DisplayContent getDisplayContent() {
return mToken.getDisplayContent();
}
@Override
void onDisplayChanged(DisplayContent dc) {
if (dc != null && mDisplayContent != null && dc != mDisplayContent
- && getImeInputTarget() == this) {
+ && mDisplayContent.getImeInputTarget() == this) {
dc.updateImeInputAndControlTarget(getImeInputTarget());
mDisplayContent.setImeInputTarget(null);
}
@@ -1749,6 +1748,11 @@
return mSession.mPid;
}
+ @Override
+ public int getUid() {
+ return mSession.mUid;
+ }
+
Task getTask() {
return mActivityRecord != null ? mActivityRecord.getTask() : null;
}
@@ -2348,7 +2352,7 @@
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
- if (getDisplayContent().getImeTarget(IME_TARGET_INPUT) != this && !isImeLayeringTarget()) {
+ if (getDisplayContent().getImeInputTarget() != this && !isImeLayeringTarget()) {
super.onConfigurationChanged(newParentConfig);
return;
}
@@ -2424,7 +2428,7 @@
dc.setImeLayeringTarget(null);
dc.computeImeTarget(true /* updateImeTarget */);
}
- if (dc.getImeTarget(IME_TARGET_INPUT) == this) {
+ if (dc.getImeInputTarget() == this) {
dc.updateImeInputAndControlTarget(null);
}
@@ -5596,7 +5600,8 @@
* @return {@link InsetsControlTarget} of host that controls the IME.
* When window is doesn't have a parent, it is returned as-is.
*/
- InsetsControlTarget getImeControlTarget() {
+ @Override
+ public InsetsControlTarget getImeControlTarget() {
return getDisplayContent().getImeHostOrFallback(this);
}
@@ -5731,8 +5736,8 @@
}
WindowState getImeInputTarget() {
- final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_INPUT);
- return target != null ? target.getWindow() : null;
+ final InputTarget target = mDisplayContent.getImeInputTarget();
+ return target != null ? target.getWindowState() : null;
}
void forceReportingResized() {
@@ -6117,4 +6122,37 @@
mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
mGivenTouchableRegion.setEmpty();
}
+
+ @Override
+ public boolean shouldControlIme() {
+ return !inMultiWindowMode();
+ }
+
+ @Override
+ public boolean canScreenshotIme() {
+ return !isSecureLocked();
+ }
+
+ @Override
+ public ActivityRecord getActivityRecord() {
+ return mActivityRecord;
+ }
+
+ @Override
+ public void unfreezeInsetsAfterStartInput() {
+ if (mActivityRecord != null) {
+ mActivityRecord.mImeInsetsFrozenUntilStartInput = false;
+ }
+ }
+
+ @Override
+ public boolean isInputMethodClientFocus(int uid, int pid) {
+ return getDisplayContent().isInputMethodClientFocus(uid, pid);
+ }
+
+ @Override
+ public void dumpProto(ProtoOutputStream proto, long fieldId,
+ @WindowTraceLogLevel int logLevel) {
+ dumpDebug(proto, fieldId, logLevel);
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 97ef490..ef61fbf 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -5938,6 +5938,7 @@
* (1.1) The caller is the Device Owner
* (1.2) The caller is another app in the same user as the device owner, AND
* The caller is the delegated certificate installer.
+ * (1.3) The caller is a Profile Owner and the calling user is affiliated.
* (2) The user has a profile owner, AND:
* (2.1) The profile owner has been granted access to Device IDs and one of the following
* holds:
@@ -5963,12 +5964,14 @@
* If the caller is from the work profile, then it must be the PO or the delegate, and
* it must have the right permission to access device identifiers.
*/
- if (hasProfileOwner(caller.getUserId())) {
+ int callerUserId = caller.getUserId();
+ if (hasProfileOwner(callerUserId)) {
// Make sure that the caller is the profile owner or delegate.
Preconditions.checkCallAuthorization(canInstallCertificates(caller));
- // Verify that the managed profile is on an organization-owned device and as such
- // the profile owner can access Device IDs.
- if (isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId())) {
+ // Verify that the managed profile is on an organization-owned device (or is affiliated
+ // with the device owner user) and as such the profile owner can access Device IDs.
+ if (isProfileOwnerOfOrganizationOwnedDevice(callerUserId)
+ || isUserAffiliatedWithDevice(callerUserId)) {
return;
}
throw new SecurityException(
@@ -9471,10 +9474,11 @@
return false;
}
- // Allow access to the device owner or delegate cert installer.
+ // Allow access to the device owner or delegate cert installer or profile owner of an
+ // affiliated user
ComponentName deviceOwner = getDeviceOwnerComponent(true);
if (deviceOwner != null && (deviceOwner.getPackageName().equals(packageName)
- || isCallerDelegate(packageName, uid, DELEGATION_CERT_INSTALL))) {
+ || isCallerDelegate(packageName, uid, DELEGATION_CERT_INSTALL))) {
return true;
}
final int userId = UserHandle.getUserId(uid);
@@ -9484,7 +9488,8 @@
final boolean isCallerProfileOwnerOrDelegate = profileOwner != null
&& (profileOwner.getPackageName().equals(packageName)
|| isCallerDelegate(packageName, uid, DELEGATION_CERT_INSTALL));
- if (isCallerProfileOwnerOrDelegate && isProfileOwnerOfOrganizationOwnedDevice(userId)) {
+ if (isCallerProfileOwnerOrDelegate && (isProfileOwnerOfOrganizationOwnedDevice(userId)
+ || isUserAffiliatedWithDevice(userId))) {
return true;
}
@@ -14939,7 +14944,13 @@
final CallerIdentity caller = getCallerIdentity();
Preconditions.checkCallAuthorization(hasCrossUsersPermission(caller, userId));
- return isUserAffiliatedWithDeviceLocked(userId);
+ return isUserAffiliatedWithDevice(userId);
+ }
+
+ private boolean isUserAffiliatedWithDevice(@UserIdInt int userId) {
+ synchronized (getLockObject()) {
+ return isUserAffiliatedWithDeviceLocked(userId);
+ }
}
private boolean isUserAffiliatedWithDeviceLocked(@UserIdInt int userId) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 5098abe..a14e14b 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -415,10 +415,12 @@
private static final String UWB_APEX_SERVICE_JAR_PATH =
"/apex/com.android.uwb/javalib/service-uwb.jar";
private static final String UWB_SERVICE_CLASS = "com.android.server.uwb.UwbService";
- private static final String SAFETY_CENTER_SERVICE_CLASS =
- "com.android.safetycenter.SafetyCenterService";
+ private static final String BLUETOOTH_APEX_SERVICE_JAR_PATH =
+ "/apex/com.android.bluetooth/javalib/service-bluetooth.jar";
private static final String BLUETOOTH_SERVICE_CLASS =
"com.android.server.bluetooth.BluetoothService";
+ private static final String SAFETY_CENTER_SERVICE_CLASS =
+ "com.android.safetycenter.SafetyCenterService";
private static final String SUPPLEMENTALPROCESS_SERVICE_CLASS =
"com.android.server.supplementalprocess.SupplementalProcessManagerService$Lifecycle";
@@ -1626,7 +1628,8 @@
Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
} else {
t.traceBegin("StartBluetoothService");
- mSystemServiceManager.startService(BLUETOOTH_SERVICE_CLASS);
+ mSystemServiceManager.startServiceFromJar(BLUETOOTH_SERVICE_CLASS,
+ BLUETOOTH_APEX_SERVICE_JAR_PATH);
t.traceEnd();
}
diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java
index bcdbc5d..ca67bcb 100644
--- a/services/midi/java/com/android/server/midi/MidiService.java
+++ b/services/midi/java/com/android/server/midi/MidiService.java
@@ -50,6 +50,7 @@
import android.util.EventLog;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
@@ -136,10 +137,12 @@
private final Object mUsbMidiLock = new Object();
// Number of times a USB MIDI 1.0 device has opened, based on the device name.
+ @GuardedBy("mUsbMidiLock")
private final HashMap<String, Integer> mUsbMidiLegacyDeviceOpenCount =
new HashMap<String, Integer>();
// Whether a USB MIDI device has opened, based on the device name.
+ @GuardedBy("mUsbMidiLock")
private final HashSet<String> mUsbMidiUniversalDeviceInUse = new HashSet<String>();
// UID of BluetoothMidiService
@@ -1246,7 +1249,7 @@
pw.decreaseIndent();
}
- // hold mUsbMidiLock before calling this
+ @GuardedBy("mUsbMidiLock")
private boolean isUsbMidiDeviceInUseLocked(MidiDeviceInfo info) {
String name = info.getProperties().getString(MidiDeviceInfo.PROPERTY_NAME);
if (name.length() < MIDI_LEGACY_STRING.length()) {
@@ -1265,7 +1268,7 @@
return false;
}
- // hold mUsbMidiLock before calling this
+ @GuardedBy("mUsbMidiLock")
void addUsbMidiDeviceLocked(MidiDeviceInfo info) {
String name = info.getProperties().getString(MidiDeviceInfo.PROPERTY_NAME);
if (name.length() < MIDI_LEGACY_STRING.length()) {
@@ -1282,7 +1285,7 @@
}
}
- // hold mUsbMidiLock before calling this
+ @GuardedBy("mUsbMidiLock")
void removeUsbMidiDeviceLocked(MidiDeviceInfo info) {
String name = info.getProperties().getString(MidiDeviceInfo.PROPERTY_NAME);
if (name.length() < MIDI_LEGACY_STRING.length()) {
diff --git a/services/tests/inprocesstests/AndroidTest.xml b/services/tests/inprocesstests/AndroidTest.xml
index b541512..f5fea1b 100644
--- a/services/tests/inprocesstests/AndroidTest.xml
+++ b/services/tests/inprocesstests/AndroidTest.xml
@@ -18,6 +18,8 @@
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true"/>
<option name="test-file-name" value="FrameworksInProcessTests.apk"/>
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
index e6bb0ce..0535513 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
@@ -345,6 +345,7 @@
@After
public void tearDown() {
+ mBgRestrictionController.tearDown();
mBgRestrictionController.getBackgroundHandlerThread().quitSafely();
}
@@ -561,6 +562,7 @@
DeviceConfigSession<Float> bgCurrentDrainRestrictedBucketThreshold = null;
DeviceConfigSession<Float> bgCurrentDrainBgRestrictedThreshold = null;
DeviceConfigSession<Boolean> bgPromptFgsWithNotiToBgRestricted = null;
+ DeviceConfigSession<Long> bgNotificationMinInterval = null;
mBgRestrictionController.addAppBackgroundRestrictionListener(listener);
@@ -615,6 +617,13 @@
R.bool.config_bg_prompt_fgs_with_noti_to_bg_restricted));
bgPromptFgsWithNotiToBgRestricted.set(true);
+ bgNotificationMinInterval = new DeviceConfigSession<>(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
+ ConstantsObserver.KEY_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL,
+ DeviceConfig::getLong,
+ ConstantsObserver.DEFAULT_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL_MS);
+ bgNotificationMinInterval.set(windowMs);
+
mCurrentTimeMillis = 10_000L;
doReturn(mCurrentTimeMillis - windowMs).when(stats).getStatsStartTimestamp();
doReturn(mCurrentTimeMillis).when(stats).getStatsEndTimestamp();
@@ -754,6 +763,7 @@
// Sleep a while and set a higher drain
Thread.sleep(windowMs);
clearInvocations(mInjector.getAppStandbyInternal());
+ clearInvocations(mInjector.getNotificationManager());
clearInvocations(mBgRestrictionController);
// We're not going to prompt the user if the abusive app has a FGS with notification.
@@ -794,6 +804,7 @@
mAppFGSTracker.onForegroundServiceNotificationUpdated(
testPkgName, testUid, -notificationId);
clearInvocations(mInjector.getAppStandbyInternal());
+ clearInvocations(mInjector.getNotificationManager());
clearInvocations(mBgRestrictionController);
runTestBgCurrentDrainMonitorOnce(listener, stats, uids,
@@ -832,6 +843,7 @@
// Now we'll prompt the user even it has a FGS with notification.
bgPromptFgsWithNotiToBgRestricted.set(true);
clearInvocations(mInjector.getAppStandbyInternal());
+ clearInvocations(mInjector.getNotificationManager());
clearInvocations(mBgRestrictionController);
runTestBgCurrentDrainMonitorOnce(listener, stats, uids,
@@ -899,6 +911,7 @@
closeIfNotNull(bgCurrentDrainRestrictedBucketThreshold);
closeIfNotNull(bgCurrentDrainBgRestrictedThreshold);
closeIfNotNull(bgPromptFgsWithNotiToBgRestricted);
+ closeIfNotNull(bgNotificationMinInterval);
}
}
@@ -1921,6 +1934,7 @@
.checkUidPermission(uid, perm);
mInjector.getAppPermissionTracker().onPermissionsChanged(uid);
}
+ waitForIdleHandler(mBgRestrictionController.getBackgroundHandler());
runExemptionTestOnce(
packageName, uid, pid, serviceType, sleepMs, stopAfterSleep,
perm, mediaControllers, topStateChanges, resetFGSTracker, false,
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index a0ac506..9a4f8e2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -16,11 +16,6 @@
package com.android.server.job.controllers;
-import static android.app.job.JobInfo.PRIORITY_DEFAULT;
-import static android.app.job.JobInfo.PRIORITY_HIGH;
-import static android.app.job.JobInfo.PRIORITY_LOW;
-import static android.app.job.JobInfo.PRIORITY_MIN;
-
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -275,14 +270,14 @@
}
private void setCharging() {
- when(mJobSchedulerService.isBatteryCharging()).thenReturn(true);
+ doReturn(true).when(mJobSchedulerService).isBatteryCharging();
synchronized (mQuotaController.mLock) {
mQuotaController.onBatteryStateChangedLocked();
}
}
private void setDischarging() {
- when(mJobSchedulerService.isBatteryCharging()).thenReturn(false);
+ doReturn(false).when(mJobSchedulerService).isBatteryCharging();
synchronized (mQuotaController.mLock) {
mQuotaController.onBatteryStateChangedLocked();
}
@@ -415,14 +410,6 @@
}
}
- private void setDeviceConfigFloat(String key, float val) {
- mDeviceConfigPropertiesBuilder.setFloat(key, val);
- synchronized (mQuotaController.mLock) {
- mQuotaController.prepareForUpdatedConstantsLocked();
- mQcConstants.processConstantLocked(mDeviceConfigPropertiesBuilder.build(), key);
- }
- }
-
private void waitForNonDelayedMessagesProcessed() {
mQuotaController.getHandler().runWithScissors(() -> {}, 15_000);
}
@@ -861,7 +848,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE, inputStats);
assertEquals(expectedStats, inputStats);
assertTrue(mQuotaController.isWithinQuotaLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX));
}
assertTrue("Job not ready: " + jobStatus, jobStatus.isReady());
}
@@ -885,7 +872,7 @@
assertEquals(expectedStats, inputStats);
assertFalse(
mQuotaController.isWithinQuotaLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX));
}
// Quota should be exceeded due to activity in active timer.
@@ -910,7 +897,7 @@
assertEquals(expectedStats, inputStats);
assertFalse(
mQuotaController.isWithinQuotaLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX));
assertFalse("Job unexpectedly ready: " + jobStatus, jobStatus.isReady());
}
}
@@ -1508,7 +1495,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 30 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
}
@@ -1541,7 +1528,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
setStandbyBucket(FREQUENT_INDEX);
@@ -1551,7 +1538,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
setStandbyBucket(WORKING_INDEX);
@@ -1561,7 +1548,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(7 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
// ACTIVE window = allowed time, so jobs can essentially run non-stop until they reach the
@@ -1573,7 +1560,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 9 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
}
@@ -1597,7 +1584,7 @@
// Max time will phase out, so should use bucket limit.
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE).clear();
@@ -1613,7 +1600,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE).clear();
@@ -1630,7 +1617,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(3 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
}
@@ -1663,7 +1650,7 @@
// window time.
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE).clear();
@@ -1690,107 +1677,7 @@
// Max time only has one minute phase out. Bucket time has 2 minute phase out.
assertEquals(9 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
- }
- }
-
- /**
- * Test getTimeUntilQuotaConsumedLocked when the determination is based on the job's priority.
- */
- @Test
- public void testGetTimeUntilQuotaConsumedLocked_Priority() {
- final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
- // Close to RARE boundary.
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (24 * HOUR_IN_MILLIS - 30 * SECOND_IN_MILLIS),
- 150 * SECOND_IN_MILLIS, 5), false);
- // Far away from FREQUENT boundary.
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (7 * HOUR_IN_MILLIS), 2 * MINUTE_IN_MILLIS, 5), false);
- // Overlap WORKING_SET boundary.
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (2 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS),
- 2 * MINUTE_IN_MILLIS, 5), false);
- // Close to ACTIVE boundary.
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (9 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
-
- setStandbyBucket(RARE_INDEX);
- synchronized (mQuotaController.mLock) {
- assertEquals(30 * SECOND_IN_MILLIS,
- mQuotaController.getRemainingExecutionTimeLocked(
SOURCE_USER_ID, SOURCE_PACKAGE));
- assertEquals(3 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_HIGH));
- assertEquals(3 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
- assertEquals(0,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_LOW));
- assertEquals(0,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_MIN));
- }
-
- setStandbyBucket(FREQUENT_INDEX);
- synchronized (mQuotaController.mLock) {
- assertEquals(3 * MINUTE_IN_MILLIS,
- mQuotaController.getRemainingExecutionTimeLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE));
- assertEquals(3 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_HIGH));
- assertEquals(3 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
- assertEquals(30 * SECOND_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_LOW));
- assertEquals(0,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_MIN));
- }
-
- setStandbyBucket(WORKING_INDEX);
- synchronized (mQuotaController.mLock) {
- assertEquals(6 * MINUTE_IN_MILLIS,
- mQuotaController.getRemainingExecutionTimeLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE));
- assertEquals(7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_HIGH));
- assertEquals(7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
- assertEquals(4 * MINUTE_IN_MILLIS + 30 * SECOND_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_LOW));
- assertEquals(2 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_MIN));
- }
-
- // ACTIVE window = allowed time, so jobs can essentially run non-stop until they reach the
- // max execution time.
- setStandbyBucket(ACTIVE_INDEX);
- synchronized (mQuotaController.mLock) {
- assertEquals(7 * MINUTE_IN_MILLIS,
- mQuotaController.getRemainingExecutionTimeLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE));
- assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_HIGH));
- assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
- assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_LOW));
- assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 7 * MINUTE_IN_MILLIS,
- mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_MIN));
}
}
@@ -1820,7 +1707,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
}
@@ -1842,7 +1729,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
@@ -1854,7 +1741,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
@@ -1867,7 +1754,7 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(10 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
@@ -1882,15 +1769,15 @@
SOURCE_USER_ID, SOURCE_PACKAGE));
assertEquals(mQcConstants.MAX_EXECUTION_TIME_MS - 30 * MINUTE_IN_MILLIS,
mQuotaController.getTimeUntilQuotaConsumedLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, PRIORITY_DEFAULT));
+ SOURCE_USER_ID, SOURCE_PACKAGE));
}
}
@Test
public void testIsWithinQuotaLocked_NeverApp() {
synchronized (mQuotaController.mLock) {
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test.never", NEVER_INDEX, PRIORITY_DEFAULT));
+ assertFalse(
+ mQuotaController.isWithinQuotaLocked(0, "com.android.test.never", NEVER_INDEX));
}
}
@@ -1898,8 +1785,7 @@
public void testIsWithinQuotaLocked_Charging() {
setCharging();
synchronized (mQuotaController.mLock) {
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", RARE_INDEX, PRIORITY_DEFAULT));
+ assertTrue(mQuotaController.isWithinQuotaLocked(0, "com.android.test", RARE_INDEX));
}
}
@@ -1913,8 +1799,7 @@
createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
synchronized (mQuotaController.mLock) {
mQuotaController.incrementJobCountLocked(0, "com.android.test", 5);
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_DEFAULT));
+ assertTrue(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX));
}
}
@@ -1931,7 +1816,7 @@
synchronized (mQuotaController.mLock) {
mQuotaController.incrementJobCountLocked(0, "com.android.test.spam", jobCount);
assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test.spam", WORKING_INDEX, PRIORITY_DEFAULT));
+ 0, "com.android.test.spam", WORKING_INDEX));
}
mQuotaController.saveTimingSession(0, "com.android.test.frequent",
@@ -1941,7 +1826,7 @@
createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 500), false);
synchronized (mQuotaController.mLock) {
assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test.frequent", FREQUENT_INDEX, PRIORITY_DEFAULT));
+ 0, "com.android.test.frequent", FREQUENT_INDEX));
}
}
@@ -1957,8 +1842,7 @@
createTimingSession(now - (5 * MINUTE_IN_MILLIS), 4 * MINUTE_IN_MILLIS, 5), false);
synchronized (mQuotaController.mLock) {
mQuotaController.incrementJobCountLocked(0, "com.android.test", 5);
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_DEFAULT));
+ assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX));
}
}
@@ -1974,8 +1858,7 @@
false);
synchronized (mQuotaController.mLock) {
mQuotaController.incrementJobCountLocked(0, "com.android.test", jobCount);
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_DEFAULT));
+ assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX));
}
}
@@ -2128,66 +2011,22 @@
assertEquals("Rare has incorrect quota status with " + (i + 1) + " sessions",
i < 2,
- mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", RARE_INDEX, PRIORITY_DEFAULT));
+ mQuotaController.isWithinQuotaLocked(0, "com.android.test", RARE_INDEX));
assertEquals("Frequent has incorrect quota status with " + (i + 1) + " sessions",
i < 3,
mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", FREQUENT_INDEX, PRIORITY_DEFAULT));
+ 0, "com.android.test", FREQUENT_INDEX));
assertEquals("Working has incorrect quota status with " + (i + 1) + " sessions",
i < 4,
- mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_DEFAULT));
+ mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX));
assertEquals("Active has incorrect quota status with " + (i + 1) + " sessions",
i < 5,
- mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", ACTIVE_INDEX, PRIORITY_DEFAULT));
+ mQuotaController.isWithinQuotaLocked(0, "com.android.test", ACTIVE_INDEX));
}
}
}
@Test
- public void testIsWithinQuotaLocked_Priority() {
- setDischarging();
- final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
- mQuotaController.saveTimingSession(0, "com.android.test",
- createTimingSession(now - (7 * HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
- mQuotaController.saveTimingSession(0, "com.android.test",
- createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
- mQuotaController.saveTimingSession(0, "com.android.test",
- createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5), false);
- synchronized (mQuotaController.mLock) {
- mQuotaController.incrementJobCountLocked(0, "com.android.test", 5);
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", FREQUENT_INDEX, PRIORITY_HIGH));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", FREQUENT_INDEX, PRIORITY_DEFAULT));
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", FREQUENT_INDEX, PRIORITY_LOW));
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", FREQUENT_INDEX, PRIORITY_MIN));
-
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_HIGH));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_DEFAULT));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_LOW));
- assertFalse(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", WORKING_INDEX, PRIORITY_MIN));
-
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", ACTIVE_INDEX, PRIORITY_HIGH));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", ACTIVE_INDEX, PRIORITY_DEFAULT));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", ACTIVE_INDEX, PRIORITY_LOW));
- assertTrue(mQuotaController.isWithinQuotaLocked(
- 0, "com.android.test", ACTIVE_INDEX, PRIORITY_MIN));
- }
- }
-
- @Test
public void testIsWithinEJQuotaLocked_NeverApp() {
JobStatus js = createExpeditedJobStatus("testIsWithinEJQuotaLocked_NeverApp", 1);
setStandbyBucket(NEVER_INDEX, js);
@@ -2737,8 +2576,7 @@
mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
createTimingSession(now - 25 * HOUR_IN_MILLIS, 5 * MINUTE_IN_MILLIS, 1), false);
synchronized (mQuotaController.mLock) {
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, standbyBucket);
+ mQuotaController.maybeScheduleStartAlarmLocked(0, "com.android.test", standbyBucket);
}
verify(mAlarmManager, timeout(1000).times(0)).setWindow(
anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
@@ -2790,128 +2628,6 @@
anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
}
- @Test
- public void testMaybeScheduleStartAlarmLocked_Priority() {
- // saveTimingSession calls maybeScheduleCleanupAlarmLocked which interferes with these tests
- // because it schedules an alarm too. Prevent it from doing so.
- spyOn(mQuotaController);
- doNothing().when(mQuotaController).maybeScheduleCleanupAlarmLocked();
-
- setDeviceConfigInt(QcConstants.KEY_MAX_SESSION_COUNT_RARE, 5);
-
- final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (24 * HOUR_IN_MILLIS), MINUTE_IN_MILLIS, 1), false);
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (7 * HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 1), false);
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 1), false);
- mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE,
- createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 1), false);
-
- InOrder inOrder = inOrder(mAlarmManager);
-
- JobStatus jobDef = createJobStatus("testMaybeScheduleStartAlarmLocked_Priority",
- SOURCE_PACKAGE, CALLING_UID,
- new JobInfo.Builder(1, new ComponentName(mContext, "TestQuotaJobService"))
- .setPriority(PRIORITY_DEFAULT)
- .build());
- JobStatus jobLow = createJobStatus("testMaybeScheduleStartAlarmLocked_Priority",
- SOURCE_PACKAGE, CALLING_UID,
- new JobInfo.Builder(2, new ComponentName(mContext, "TestQuotaJobService"))
- .setPriority(PRIORITY_LOW)
- .build());
- JobStatus jobMin = createJobStatus("testMaybeScheduleStartAlarmLocked_Priority",
- SOURCE_PACKAGE, CALLING_UID,
- new JobInfo.Builder(3, new ComponentName(mContext, "TestQuotaJobService"))
- .setPriority(PRIORITY_MIN)
- .build());
-
- setStandbyBucket(RARE_INDEX, jobDef, jobLow, jobMin);
- synchronized (mQuotaController.mLock) {
- mQuotaController.maybeStartTrackingJobLocked(jobMin, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX);
- // Min job requires 5 mins of surplus.
- long expectedAlarmTime = now + 23 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobLow, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX);
- // Low job requires 2.5 mins of surplus.
- expectedAlarmTime = now + 17 * HOUR_IN_MILLIS + 90 * SECOND_IN_MILLIS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobDef, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, RARE_INDEX);
- // Default+ jobs require IN_QUOTA_BUFFER_MS.
- expectedAlarmTime = now + mQcConstants.IN_QUOTA_BUFFER_MS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStopTrackingJobLocked(jobMin, null, false);
- mQuotaController.maybeStopTrackingJobLocked(jobLow, null, false);
- mQuotaController.maybeStopTrackingJobLocked(jobDef, null, false);
-
- setStandbyBucket(FREQUENT_INDEX, jobDef, jobLow, jobMin);
-
- mQuotaController.maybeStartTrackingJobLocked(jobMin, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, FREQUENT_INDEX);
- // Min job requires 5 mins of surplus.
- expectedAlarmTime = now + 7 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobLow, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, FREQUENT_INDEX);
- // Low job requires 2.5 mins of surplus.
- expectedAlarmTime = now + HOUR_IN_MILLIS + 90 * SECOND_IN_MILLIS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobDef, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, FREQUENT_INDEX);
- // Default+ jobs already have enough quota.
- inOrder.verify(mAlarmManager, timeout(1000).times(0)).setWindow(
- anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStopTrackingJobLocked(jobMin, null, false);
- mQuotaController.maybeStopTrackingJobLocked(jobLow, null, false);
- mQuotaController.maybeStopTrackingJobLocked(jobDef, null, false);
-
- setStandbyBucket(WORKING_INDEX, jobDef, jobLow, jobMin);
-
- mQuotaController.maybeStartTrackingJobLocked(jobMin, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, WORKING_INDEX);
- // Min job requires 5 mins of surplus.
- expectedAlarmTime = now + HOUR_IN_MILLIS + MINUTE_IN_MILLIS;
- inOrder.verify(mAlarmManager, timeout(1000).times(1)).setWindow(
- anyInt(), eq(expectedAlarmTime), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobLow, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, WORKING_INDEX);
- // Low job has enough surplus.
- inOrder.verify(mAlarmManager, timeout(1000).times(0)).setWindow(
- anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
-
- mQuotaController.maybeStartTrackingJobLocked(jobDef, null);
- mQuotaController.maybeScheduleStartAlarmLocked(
- SOURCE_USER_ID, SOURCE_PACKAGE, WORKING_INDEX);
- // Default+ jobs already have enough quota.
- inOrder.verify(mAlarmManager, timeout(1000).times(0)).setWindow(
- anyInt(), anyLong(), anyLong(), eq(TAG_QUOTA_CHECK), any(), any());
- }
- }
-
/** Tests that the start alarm is properly rescheduled if the app's bucket is changed. */
@Test
public void testMaybeScheduleStartAlarmLocked_BucketChange() {
@@ -3212,8 +2928,6 @@
setDeviceConfigLong(QcConstants.KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
11 * MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_IN_QUOTA_BUFFER_MS, 2 * MINUTE_IN_MILLIS);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW, .7f);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN, .2f);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_EXEMPTED_MS, 99 * MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_ACTIVE_MS, 15 * MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_WORKING_MS, 30 * MINUTE_IN_MILLIS);
@@ -3269,8 +2983,6 @@
assertEquals(11 * MINUTE_IN_MILLIS,
mQuotaController.getAllowedTimePerPeriodMs()[RESTRICTED_INDEX]);
assertEquals(2 * MINUTE_IN_MILLIS, mQuotaController.getInQuotaBufferMs());
- assertEquals(.7f, mQuotaController.getAllowedTimeSurplusPriorityLow(), 1e-6);
- assertEquals(.2f, mQuotaController.getAllowedTimeSurplusPriorityMin(), 1e-6);
assertEquals(99 * MINUTE_IN_MILLIS,
mQuotaController.getBucketWindowSizes()[EXEMPTED_INDEX]);
assertEquals(15 * MINUTE_IN_MILLIS, mQuotaController.getBucketWindowSizes()[ACTIVE_INDEX]);
@@ -3327,8 +3039,6 @@
setDeviceConfigLong(QcConstants.KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
-MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_IN_QUOTA_BUFFER_MS, -MINUTE_IN_MILLIS);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW, -.1f);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN, -.01f);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_EXEMPTED_MS, -MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_ACTIVE_MS, -MINUTE_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_WORKING_MS, -MINUTE_IN_MILLIS);
@@ -3379,8 +3089,6 @@
assertEquals(MINUTE_IN_MILLIS,
mQuotaController.getAllowedTimePerPeriodMs()[RESTRICTED_INDEX]);
assertEquals(0, mQuotaController.getInQuotaBufferMs());
- assertEquals(0f, mQuotaController.getAllowedTimeSurplusPriorityLow(), 1e-6);
- assertEquals(0f, mQuotaController.getAllowedTimeSurplusPriorityMin(), 1e-6);
assertEquals(MINUTE_IN_MILLIS, mQuotaController.getBucketWindowSizes()[EXEMPTED_INDEX]);
assertEquals(MINUTE_IN_MILLIS, mQuotaController.getBucketWindowSizes()[ACTIVE_INDEX]);
assertEquals(MINUTE_IN_MILLIS, mQuotaController.getBucketWindowSizes()[WORKING_INDEX]);
@@ -3451,8 +3159,6 @@
setDeviceConfigLong(QcConstants.KEY_ALLOWED_TIME_PER_PERIOD_RESTRICTED_MS,
25 * HOUR_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_IN_QUOTA_BUFFER_MS, 25 * HOUR_IN_MILLIS);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_LOW, 1f);
- setDeviceConfigFloat(QcConstants.KEY_ALLOWED_TIME_SURPLUS_PRIORITY_MIN, .95f);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_EXEMPTED_MS, 25 * HOUR_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_ACTIVE_MS, 25 * HOUR_IN_MILLIS);
setDeviceConfigLong(QcConstants.KEY_WINDOW_SIZE_WORKING_MS, 25 * HOUR_IN_MILLIS);
@@ -3492,8 +3198,6 @@
assertEquals(24 * HOUR_IN_MILLIS,
mQuotaController.getAllowedTimePerPeriodMs()[RESTRICTED_INDEX]);
assertEquals(5 * MINUTE_IN_MILLIS, mQuotaController.getInQuotaBufferMs());
- assertEquals(.9f, mQuotaController.getAllowedTimeSurplusPriorityLow(), 1e-6);
- assertEquals(.9f, mQuotaController.getAllowedTimeSurplusPriorityMin(), 1e-6);
assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getBucketWindowSizes()[EXEMPTED_INDEX]);
assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getBucketWindowSizes()[ACTIVE_INDEX]);
assertEquals(24 * HOUR_IN_MILLIS, mQuotaController.getBucketWindowSizes()[WORKING_INDEX]);
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
index 4e4854c..d8f409d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java
@@ -213,7 +213,7 @@
public void testProperties() {
assertThat(mManager.getName()).isEqualTo(NAME);
assertThat(mManager.getProperties()).isEqualTo(PROPERTIES);
- assertThat(mManager.getIdentity()).isEqualTo(IDENTITY);
+ assertThat(mManager.getProviderIdentity()).isEqualTo(IDENTITY);
assertThat(mManager.hasProvider()).isTrue();
ProviderProperties newProperties = new ProviderProperties.Builder()
@@ -230,7 +230,7 @@
CallerIdentity newIdentity = CallerIdentity.forTest(OTHER_USER, 1, "otherpackage",
"otherattribution");
mProvider.setIdentity(newIdentity);
- assertThat(mManager.getIdentity()).isEqualTo(newIdentity);
+ assertThat(mManager.getProviderIdentity()).isEqualTo(newIdentity);
mManager.setRealProvider(null);
assertThat(mManager.hasProvider()).isFalse();
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index a6c81a0..152f3b3 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -25,7 +25,6 @@
"test-apps/JobTestApp/src/**/*.java",
"test-apps/SuspendTestApp/src/**/*.java",
- ":service-bluetooth-tests-sources", // TODO(b/214988855) : Remove once framework-bluetooth jar is ready
],
static_libs: [
"frameworks-base-testutils",
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java
index 3160272..f0c907d 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/audio/VirtualAudioControllerTest.java
@@ -25,6 +25,7 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import android.companion.virtual.VirtualDeviceParams;
import android.companion.virtual.audio.IAudioSessionCallback;
import android.content.Context;
import android.content.ContextWrapper;
@@ -72,7 +73,8 @@
/* allowedUsers= */ new ArraySet<>(),
/* allowedActivities= */ new ArraySet<>(),
/* blockedActivities= */ new ArraySet<>(),
- /* activityListener= */null,
+ VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED,
+ /* activityListener= */ null,
/* activityBlockedCallback= */ null);
}
diff --git a/services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java b/services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java
index 0287510..bd35be4 100644
--- a/services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java
@@ -107,6 +107,7 @@
private PackageManager mMockPackageManager;
@Mock
private LocaleManagerService mMockLocaleManagerService;
+
BroadcastReceiver mUserMonitor;
PackageMonitor mPackageMonitor;
@@ -131,6 +132,7 @@
mMockPackageManagerInternal = mock(PackageManagerInternal.class);
mMockPackageManager = mock(PackageManager.class);
mMockLocaleManagerService = mock(LocaleManagerService.class);
+ SystemAppUpdateTracker systemAppUpdateTracker = mock(SystemAppUpdateTracker.class);
doReturn(mMockPackageManager).when(mMockContext).getPackageManager();
@@ -144,7 +146,8 @@
doNothing().when(mBackupHelper).notifyBackupManager();
mUserMonitor = mBackupHelper.getUserMonitor();
- mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper);
+ mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper,
+ systemAppUpdateTracker);
setCurrentTimeMillis(DEFAULT_CREATION_TIME_MILLIS);
}
diff --git a/services/tests/servicestests/src/com/android/server/locales/SystemAppUpdateTrackerTest.java b/services/tests/servicestests/src/com/android/server/locales/SystemAppUpdateTrackerTest.java
new file mode 100644
index 0000000..5185e15
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locales/SystemAppUpdateTrackerTest.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.locales;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.app.ActivityManagerInternal;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.os.Binder;
+import android.os.Environment;
+import android.os.LocaleList;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.AtomicFile;
+import android.util.TypedXmlPullParser;
+import android.util.Xml;
+
+import com.android.internal.content.PackageMonitor;
+import com.android.internal.util.XmlUtils;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Unit tests for {@link SystemAppUpdateTracker}.
+ */
+public class SystemAppUpdateTrackerTest {
+ private static final String DEFAULT_PACKAGE_NAME_1 = "com.android.myapp1";
+ private static final String DEFAULT_PACKAGE_NAME_2 = "com.android.myapp2";
+ private static final String DEFAULT_LOCALE_TAGS = "en-XC,ar-XB";
+ private static final LocaleList DEFAULT_LOCALES =
+ LocaleList.forLanguageTags(DEFAULT_LOCALE_TAGS);
+ private static final String PACKAGE_XML_TAG = "package";
+ private static final String ATTR_NAME = "name";
+ private static final String SYSTEM_APPS_XML_TAG = "system_apps";
+ private static final int DEFAULT_USER_ID = 0;
+
+ private AtomicFile mStoragefile;
+ private static final String DEFAULT_INSTALLER_PACKAGE_NAME = "com.android.myapp.installer";
+ private static final InstallSourceInfo DEFAULT_INSTALL_SOURCE_INFO = new InstallSourceInfo(
+ /* initiatingPackageName = */ null, /* initiatingPackageSigningInfo = */ null,
+ /* originatingPackageName = */ null,
+ /* installingPackageName = */ DEFAULT_INSTALLER_PACKAGE_NAME,
+ /* packageSource = */ PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED);
+
+ @Mock
+ private Context mMockContext;
+ @Mock
+ PackageManager mMockPackageManager;
+ @Mock
+ private PackageManagerInternal mMockPackageManagerInternal;
+ @Mock
+ private ActivityTaskManagerInternal mMockActivityTaskManager;
+ @Mock
+ private ActivityManagerInternal mMockActivityManager;
+ @Mock
+ private LocaleManagerBackupHelper mMockLocaleManagerBackupHelper;
+ @Mock
+ PackageMonitor mMockPackageMonitor;
+
+ private LocaleManagerService mLocaleManagerService;
+
+ // Object under test.
+ private SystemAppUpdateTracker mSystemAppUpdateTracker;
+
+ @Before
+ public void setUp() throws Exception {
+ mMockContext = mock(Context.class);
+ mMockActivityTaskManager = mock(ActivityTaskManagerInternal.class);
+ mMockActivityManager = mock(ActivityManagerInternal.class);
+ mMockPackageManagerInternal = mock(PackageManagerInternal.class);
+ mMockPackageMonitor = mock(PackageMonitor.class);
+ mMockLocaleManagerBackupHelper = mock(ShadowLocaleManagerBackupHelper.class);
+ mLocaleManagerService = new LocaleManagerService(mMockContext,
+ mMockActivityTaskManager, mMockActivityManager,
+ mMockPackageManagerInternal, mMockLocaleManagerBackupHelper, mMockPackageMonitor);
+
+ doReturn(DEFAULT_USER_ID).when(mMockActivityManager)
+ .handleIncomingUser(anyInt(), anyInt(), eq(DEFAULT_USER_ID), anyBoolean(), anyInt(),
+ anyString(), anyString());
+
+ mMockPackageManager = mock(PackageManager.class);
+ doReturn(DEFAULT_INSTALL_SOURCE_INFO).when(mMockPackageManager)
+ .getInstallSourceInfo(anyString());
+ doReturn(mMockPackageManager).when(mMockContext).getPackageManager();
+
+ mStoragefile = new AtomicFile(new File(
+ Environment.getExternalStorageDirectory(), "systemUpdateUnitTests.xml"));
+
+ mSystemAppUpdateTracker = new SystemAppUpdateTracker(mMockContext,
+ mLocaleManagerService, mStoragefile);
+ }
+
+ @After
+ public void tearDown() {
+ mStoragefile.delete();
+ }
+
+ @Test
+ public void testInit_loadsCorrectly() throws Exception {
+ doReturn(createApplicationInfoForApp(DEFAULT_PACKAGE_NAME_1,
+ /* isUpdatedSystemApp = */ true))
+ .when(mMockPackageManager).getApplicationInfo(eq(DEFAULT_PACKAGE_NAME_1), any());
+
+ // Updates the app once so that it writes to the file.
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_1,
+ Binder.getCallingUid());
+ // Clear the in-memory data of updated apps
+ mSystemAppUpdateTracker.getUpdatedApps().clear();
+ // Invoke init to verify if it correctly populates in-memory set.
+ mSystemAppUpdateTracker.init();
+
+ assertEquals(Set.of(DEFAULT_PACKAGE_NAME_1), mSystemAppUpdateTracker.getUpdatedApps());
+ }
+
+ @Test
+ public void testOnPackageUpdatedFinished_systemAppFirstUpdate_writesToFile() throws Exception {
+ doReturn(createApplicationInfoForApp(DEFAULT_PACKAGE_NAME_1,
+ /* isUpdatedSystemApp = */ true))
+ .when(mMockPackageManager).getApplicationInfo(eq(DEFAULT_PACKAGE_NAME_1), any());
+ doReturn(new ActivityTaskManagerInternal.PackageConfig(/* nightMode = */ 0,
+ DEFAULT_LOCALES)).when(mMockActivityTaskManager)
+ .getApplicationConfig(anyString(), anyInt());
+
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_1,
+ Binder.getCallingUid());
+
+ assertBroadcastSentToInstaller(DEFAULT_PACKAGE_NAME_1, DEFAULT_LOCALES);
+ Set<String> expectedAppList = Set.of(DEFAULT_PACKAGE_NAME_1);
+ assertEquals(expectedAppList, mSystemAppUpdateTracker.getUpdatedApps());
+ verifyStorageFileContents(expectedAppList);
+ }
+
+ @Test
+ public void testOnPackageUpdatedFinished_systemAppSecondUpdate_doesNothing() throws Exception {
+ doReturn(createApplicationInfoForApp(DEFAULT_PACKAGE_NAME_1,
+ /* isUpdatedSystemApp = */ true))
+ .when(mMockPackageManager).getApplicationInfo(eq(DEFAULT_PACKAGE_NAME_1), any());
+ doReturn(new ActivityTaskManagerInternal.PackageConfig(/* nightMode = */ 0,
+ DEFAULT_LOCALES)).when(mMockActivityTaskManager)
+ .getApplicationConfig(anyString(), anyInt());
+
+ // first update
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_1,
+ Binder.getCallingUid());
+
+ assertBroadcastSentToInstaller(DEFAULT_PACKAGE_NAME_1, DEFAULT_LOCALES);
+ Set<String> expectedAppList = Set.of(DEFAULT_PACKAGE_NAME_1);
+ assertEquals(expectedAppList, mSystemAppUpdateTracker.getUpdatedApps());
+ verifyStorageFileContents(expectedAppList);
+
+ // second update
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_1,
+ Binder.getCallingUid());
+ // getApplicationLocales should be invoked only once on the first update.
+ verify(mMockActivityTaskManager, times(1))
+ .getApplicationConfig(anyString(), anyInt());
+ // Broadcast should be sent only once on first update.
+ verify(mMockContext, times(1)).sendBroadcastAsUser(any(), any());
+ // Verify that the content remains the same.
+ verifyStorageFileContents(expectedAppList);
+ }
+
+ @Test
+ public void testOnPackageUpdatedFinished_notSystemApp_doesNothing() throws Exception {
+ doReturn(createApplicationInfoForApp(DEFAULT_PACKAGE_NAME_2,
+ /* isUpdatedSystemApp = */false))
+ .when(mMockPackageManager).getApplicationInfo(eq(DEFAULT_PACKAGE_NAME_2), any());
+
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_2,
+ Binder.getCallingUid());
+
+ assertTrue(!mSystemAppUpdateTracker.getUpdatedApps().contains(DEFAULT_PACKAGE_NAME_2));
+ // getApplicationLocales should be never be invoked if not a system app.
+ verifyZeroInteractions(mMockActivityTaskManager);
+ // Broadcast should be never sent if not a system app.
+ verify(mMockContext, never()).sendBroadcastAsUser(any(), any());
+ // It shouldn't write to the file if not a system app.
+ assertTrue(!mStoragefile.getBaseFile().isFile());
+ }
+
+ @Test
+ public void testOnPackageUpdatedFinished_noInstaller_doesNothing() throws Exception {
+ doReturn(createApplicationInfoForApp(DEFAULT_PACKAGE_NAME_1,
+ /* isUpdatedSystemApp = */ true))
+ .when(mMockPackageManager).getApplicationInfo(eq(DEFAULT_PACKAGE_NAME_1), any());
+ doReturn(null).when(mMockPackageManager).getInstallSourceInfo(anyString());
+
+ mSystemAppUpdateTracker.onPackageUpdateFinished(DEFAULT_PACKAGE_NAME_1,
+ Binder.getCallingUid());
+
+ // getApplicationLocales should be never be invoked if not installer is not present.
+ verifyZeroInteractions(mMockActivityTaskManager);
+ // Broadcast should be never sent if installer is not present.
+ verify(mMockContext, never()).sendBroadcastAsUser(any(), any());
+ // It shouldn't write to file if no installer present.
+ assertTrue(!mStoragefile.getBaseFile().isFile());
+ }
+
+ private void verifyStorageFileContents(Set<String> expectedAppList)
+ throws IOException, XmlPullParserException {
+ assertTrue(mStoragefile.getBaseFile().isFile());
+ try (InputStream storageInputStream = mStoragefile.openRead()) {
+ assertEquals(expectedAppList, readFromXml(storageInputStream));
+ } catch (IOException | XmlPullParserException e) {
+ throw e;
+ }
+ }
+
+ private Set<String> readFromXml(InputStream storageInputStream)
+ throws XmlPullParserException, IOException {
+ Set<String> outputList = new HashSet<>();
+ final TypedXmlPullParser parser = Xml.newFastPullParser();
+ parser.setInput(storageInputStream, StandardCharsets.UTF_8.name());
+ XmlUtils.beginDocument(parser, SYSTEM_APPS_XML_TAG);
+ int depth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ if (parser.getName().equals(PACKAGE_XML_TAG)) {
+ String packageName = parser.getAttributeValue(/* namespace= */ null,
+ ATTR_NAME);
+ if (!TextUtils.isEmpty(packageName)) {
+ outputList.add(packageName);
+ }
+ }
+ }
+ return outputList;
+ }
+
+ /**
+ * Verifies the broadcast sent to the installer of the updated app.
+ */
+ private void assertBroadcastSentToInstaller(String packageName, LocaleList locales) {
+ ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ verify(mMockContext).sendBroadcastAsUser(captor.capture(), any(UserHandle.class));
+ for (Intent intent : captor.getAllValues()) {
+ assertTrue(Intent.ACTION_APPLICATION_LOCALE_CHANGED.equals(intent.getAction()));
+ assertTrue(DEFAULT_INSTALLER_PACKAGE_NAME.equals(intent.getPackage()));
+ assertTrue(packageName.equals(intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME)));
+ assertTrue(locales.equals(intent.getParcelableExtra(Intent.EXTRA_LOCALE_LIST)));
+ }
+ }
+
+ private ApplicationInfo createApplicationInfoForApp(String packageName,
+ boolean isUpdatedSystemApp) {
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.packageName = packageName;
+ if (isUpdatedSystemApp) {
+ applicationInfo.flags = ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+ }
+ return applicationInfo;
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 5d3da43..c7a903b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -489,6 +489,20 @@
assertThat(e).hasMessageThat().contains("Failed to collect certificates from ");
}
+ @Test
+ public void testGetActivePackageNameForApexModuleName() throws Exception {
+ final String moduleName = "com.android.module_name";
+
+ ApexInfo[] apexInfo = createApexInfoForTestPkg(true, false);
+ apexInfo[0].moduleName = moduleName;
+ when(mApexService.getAllPackages()).thenReturn(apexInfo);
+ mApexManager.scanApexPackagesTraced(mPackageParser2,
+ ParallelPackageParser.makeExecutorService());
+
+ assertThat(mApexManager.getActivePackageNameForApexModuleName(moduleName))
+ .isEqualTo(TEST_APEX_PKG);
+ }
+
private ApexInfo createApexInfoForTestPkg(boolean isActive, boolean isFactory, int version) {
File apexFile = extractResource(TEST_APEX_PKG, TEST_APEX_FILE_NAME);
ApexInfo apexInfo = new ApexInfo();
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 9f7130e..c083870 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -75,7 +75,6 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP;
-import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_FIXED_TRANSFORM;
@@ -1117,7 +1116,7 @@
app.removeImmediately();
- assertNull(dc.getImeTarget(IME_TARGET_INPUT));
+ assertNull(dc.getImeInputTarget());
assertNull(dc.computeImeControlTarget());
}
@@ -1126,19 +1125,19 @@
final DisplayContent dc = createNewDisplay();
dc.setRemoteInsetsController(createDisplayWindowInsetsController());
dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app"));
- dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow());
- assertEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), dc.computeImeControlTarget());
+ dc.setImeLayeringTarget(dc.getImeInputTarget().getWindowState());
+ assertEquals(dc.getImeInputTarget().getWindowState(), dc.computeImeControlTarget());
}
@Test
public void testComputeImeControlTarget_splitscreen() throws Exception {
final DisplayContent dc = createNewDisplay();
dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app"));
- dc.getImeTarget(IME_TARGET_INPUT).getWindow().setWindowingMode(
+ dc.getImeInputTarget().getWindowState().setWindowingMode(
WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW);
- dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow());
+ dc.setImeLayeringTarget(dc.getImeInputTarget().getWindowState());
dc.setRemoteInsetsController(createDisplayWindowInsetsController());
- assertNotEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(),
+ assertNotEquals(dc.getImeInputTarget().getWindowState(),
dc.computeImeControlTarget());
}
@@ -1149,7 +1148,7 @@
doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds();
mDisplayContent.setImeInputTarget(mAppWindow);
mDisplayContent.setImeLayeringTarget(
- mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow());
+ mDisplayContent.getImeInputTarget().getWindowState());
mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController());
assertEquals(mAppWindow, mDisplayContent.computeImeControlTarget());
}
@@ -1927,7 +1926,7 @@
child1.removeImmediately();
verify(mDisplayContent).computeImeTarget(true);
- assertNull(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
+ assertNull(mDisplayContent.getImeInputTarget());
verify(child1, never()).needsRelativeLayeringToIme();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index e387615..90a6918 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -30,7 +30,6 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static org.junit.Assert.assertEquals;
@@ -182,12 +181,13 @@
// Make IME and stay visible during the test.
mImeWindow.setHasSurface(true);
getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null);
- getController().onImeControlTargetChanged(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
+ getController().onImeControlTargetChanged(
+ mDisplayContent.getImeInputTarget().getWindowState());
final InsetsVisibilities requestedVisibilities = new InsetsVisibilities();
requestedVisibilities.setVisibility(ITYPE_IME, true);
- mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow()
+ mDisplayContent.getImeInputTarget().getWindowState()
.setRequestedVisibilities(requestedVisibilities);
- getController().onInsetsModified(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
+ getController().onInsetsModified(mDisplayContent.getImeInputTarget().getWindowState());
// Send our spy window (app) into the system so that we can detect the invocation.
final WindowState win = createWindow(null, TYPE_APPLICATION, "app");
diff --git a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
index f007149..972567b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/PendingRemoteAnimationRegistryTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertNull;
import android.app.ActivityOptions;
+import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
import android.view.RemoteAnimationAdapter;
@@ -45,6 +46,7 @@
public class PendingRemoteAnimationRegistryTest {
@Mock RemoteAnimationAdapter mAdapter;
+ @Mock IBinder mLaunchCookie;
private PendingRemoteAnimationRegistry mRegistry;
private final OffsettableClock mClock = new OffsettableClock.Stopped();
private TestHandler mHandler;
@@ -65,7 +67,7 @@
@Test
public void testOverrideActivityOptions() {
- mRegistry.addPendingAnimation("com.android.test", mAdapter);
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, null /* launchCookie */);
ActivityOptions opts = ActivityOptions.makeBasic();
opts = mRegistry.overrideOptionsIfNeeded("com.android.test", opts);
assertEquals(mAdapter, opts.getRemoteAnimationAdapter());
@@ -73,15 +75,24 @@
@Test
public void testOverrideActivityOptions_null() {
- mRegistry.addPendingAnimation("com.android.test", mAdapter);
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, null /* launchCookie */);
final ActivityOptions opts = mRegistry.overrideOptionsIfNeeded("com.android.test", null);
assertNotNull(opts);
assertEquals(mAdapter, opts.getRemoteAnimationAdapter());
}
@Test
+ public void testOverrideLaunchCookie() {
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, mLaunchCookie);
+ ActivityOptions opts = ActivityOptions.makeBasic();
+ opts = mRegistry.overrideOptionsIfNeeded("com.android.test", opts);
+ assertNotNull(opts);
+ assertEquals(mLaunchCookie, opts.getLaunchCookie());
+ }
+
+ @Test
public void testTimeout() {
- mRegistry.addPendingAnimation("com.android.test", mAdapter);
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, null /* launchCookie */);
mClock.fastForward(5000);
mHandler.timeAdvance();
assertNull(mRegistry.overrideOptionsIfNeeded("com.android.test", null));
@@ -89,10 +100,10 @@
@Test
public void testTimeout_overridenEntry() {
- mRegistry.addPendingAnimation("com.android.test", mAdapter);
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, null /* launchCookie */);
mClock.fastForward(2500);
mHandler.timeAdvance();
- mRegistry.addPendingAnimation("com.android.test", mAdapter);
+ mRegistry.addPendingAnimation("com.android.test", mAdapter, null /* launchCookie */);
mClock.fastForward(1000);
mHandler.timeAdvance();
final ActivityOptions opts = mRegistry.overrideOptionsIfNeeded("com.android.test", null);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index d74e1be..29289a4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -713,7 +713,7 @@
closeTransition.collectExistenceChange(activity1);
closeTransition.collectExistenceChange(task2);
closeTransition.collectExistenceChange(activity2);
- closeTransition.setTransientLaunch(activity2);
+ closeTransition.setTransientLaunch(activity2, null /* restoreBelow */);
activity1.mVisibleRequested = false;
activity2.mVisibleRequested = true;
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index a442de5..5743922 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -1340,6 +1340,41 @@
}
@Test
+ public void testAddLocalInsetsSourceProvider_sameType_replacesInsets() {
+ /*
+ ___ rootTask ________________________________________
+ | | |
+ activity0 navigationBarInsetsProvider1 navigationBarInsetsProvider2
+ */
+ final Task rootTask = createTask(mDisplayContent);
+
+ final ActivityRecord activity0 = createActivityRecord(mDisplayContent,
+ createTaskInRootTask(rootTask, 0 /* userId */));
+ final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
+ TYPE_BASE_APPLICATION);
+ attrs.setTitle("AppWindow0");
+ activity0.addWindow(createWindowState(attrs, activity0));
+
+ Rect navigationBarInsetsRect1 = new Rect(0, 200, 1080, 700);
+ Rect navigationBarInsetsRect2 = new Rect(0, 0, 1080, 200);
+
+ rootTask.addLocalRectInsetsSourceProvider(navigationBarInsetsRect1,
+ new int[]{ITYPE_LOCAL_NAVIGATION_BAR_1});
+ activity0.forAllWindows(window -> {
+ assertEquals(navigationBarInsetsRect1,
+ window.getInsetsState().peekSource(ITYPE_LOCAL_NAVIGATION_BAR_1).getFrame());
+ }, true);
+
+ rootTask.addLocalRectInsetsSourceProvider(navigationBarInsetsRect2,
+ new int[]{ITYPE_LOCAL_NAVIGATION_BAR_1});
+
+ activity0.forAllWindows(window -> {
+ assertEquals(navigationBarInsetsRect2,
+ window.getInsetsState().peekSource(ITYPE_LOCAL_NAVIGATION_BAR_1).getFrame());
+ }, true);
+ }
+
+ @Test
public void testRemoveLocalInsetsSourceProvider() {
/*
___ rootTask _______________________________________________
diff --git a/telephony/java/android/service/euicc/EuiccService.java b/telephony/java/android/service/euicc/EuiccService.java
index 8d92520..7129a27 100644
--- a/telephony/java/android/service/euicc/EuiccService.java
+++ b/telephony/java/android/service/euicc/EuiccService.java
@@ -29,7 +29,6 @@
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
-import android.telephony.TelephonyManager;
import android.telephony.euicc.DownloadableSubscription;
import android.telephony.euicc.EuiccInfo;
import android.telephony.euicc.EuiccManager;
@@ -744,18 +743,16 @@
public void run() {
DownloadSubscriptionResult result;
try {
- result =
- EuiccService.this.onDownloadSubscription(
- slotId, subscription, switchAfterDownload, forceDeactivateSim,
- resolvedBundle);
+ result = EuiccService.this.onDownloadSubscription(
+ slotId, portIndex, subscription, switchAfterDownload,
+ forceDeactivateSim, resolvedBundle);
} catch (AbstractMethodError e) {
- Log.w(TAG, "The new onDownloadSubscription(int, "
+ Log.w(TAG, "The new onDownloadSubscription(int, int, "
+ "DownloadableSubscription, boolean, boolean, Bundle) is not "
+ "implemented. Fall back to the old one.", e);
- int resultCode = EuiccService.this.onDownloadSubscription(
- slotId, subscription, switchAfterDownload, forceDeactivateSim);
- result = new DownloadSubscriptionResult(resultCode,
- 0 /* resolvableErrors */, TelephonyManager.UNSUPPORTED_CARD_ID);
+ result = EuiccService.this.onDownloadSubscription(
+ slotId, subscription, switchAfterDownload,
+ forceDeactivateSim, resolvedBundle);
}
try {
callback.onComplete(result);
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 0394a54..1eb391d 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -48,6 +48,7 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
+import android.content.ContextParams;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
@@ -143,6 +144,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;
@@ -388,16 +390,8 @@
@UnsupportedAppUsage
public TelephonyManager(Context context, int subId) {
mSubId = subId;
- Context appContext = context.getApplicationContext();
- if (appContext != null) {
- if (Objects.equals(context.getAttributionTag(), appContext.getAttributionTag())) {
- mContext = appContext;
- } else {
- mContext = appContext.createAttributionContext(context.getAttributionTag());
- }
- } else {
- mContext = context;
- }
+ mContext = mergeAttributionAndRenouncedPermissions(context.getApplicationContext(),
+ context);
mSubscriptionManager = SubscriptionManager.from(mContext);
}
@@ -418,6 +412,34 @@
return sInstance;
}
+ // This method takes the Application context and adds the attributionTag
+ // and renouncedPermissions from the given context.
+ private Context mergeAttributionAndRenouncedPermissions(Context to, Context from) {
+ Context contextToReturn = from;
+ if (to != null) {
+ if (!Objects.equals(from.getAttributionTag(), to.getAttributionTag())) {
+ contextToReturn = to.createAttributionContext(from.getAttributionTag());
+ } else {
+ contextToReturn = to;
+ }
+
+ Set<String> renouncedPermissions =
+ from.getAttributionSource().getRenouncedPermissions();
+ if (!renouncedPermissions.isEmpty()) {
+ if (to.getParams() != null) {
+ contextToReturn = contextToReturn.createContext(
+ new ContextParams.Builder(to.getParams())
+ .setRenouncedPermissions(renouncedPermissions).build());
+ } else {
+ contextToReturn = contextToReturn.createContext(
+ new ContextParams.Builder()
+ .setRenouncedPermissions(renouncedPermissions).build());
+ }
+ }
+ }
+ return contextToReturn;
+ }
+
private String getOpPackageName() {
// For legacy reasons the TelephonyManager has API for getting
// a static instance with no context set preventing us from
@@ -448,6 +470,16 @@
return null;
}
+ private Set<String> getRenouncedPermissions() {
+ // For legacy reasons the TelephonyManager has API for getting
+ // a static instance with no context set preventing us from
+ // getting the attribution source.
+ if (mContext != null) {
+ return mContext.getAttributionSource().getRenouncedPermissions();
+ }
+ return Collections.emptySet();
+ }
+
/**
* Post a runnable to the BackgroundThread.
*
@@ -6308,8 +6340,14 @@
(TelephonyRegistryManager)
mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);
if (telephonyRegistry != null) {
- telephonyRegistry.listenFromListener(mSubId, getOpPackageName(),
- getAttributionTag(), listener, events, notifyNow);
+ Set<String> renouncedPermissions = getRenouncedPermissions();
+ boolean renounceFineLocationAccess = renouncedPermissions
+ .contains(Manifest.permission.ACCESS_FINE_LOCATION);
+ boolean renounceCoarseLocationAccess = renouncedPermissions
+ .contains(Manifest.permission.ACCESS_COARSE_LOCATION);
+ telephonyRegistry.listenFromListener(mSubId, renounceFineLocationAccess,
+ renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag(),
+ listener, events, notifyNow);
} else {
Rlog.w(TAG, "telephony registry not ready.");
}
@@ -12132,7 +12170,10 @@
})
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS)
public @Nullable ServiceState getServiceState() {
- return getServiceState(false, false);
+ return getServiceState(getRenouncedPermissions()
+ .contains(Manifest.permission.ACCESS_FINE_LOCATION),
+ getRenouncedPermissions()
+ .contains(Manifest.permission.ACCESS_COARSE_LOCATION));
}
/**
@@ -12144,6 +12185,11 @@
* If you want continuous updates of service state info, register a {@link PhoneStateListener}
* via {@link #listen} with the {@link PhoneStateListener#LISTEN_SERVICE_STATE} event.
*
+ * There's another way to renounce permissions with a custom context
+ * {@code AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system
+ * apps. To avoid confusion, calling this method supersede renouncing permissions with a
+ * custom context.
+ *
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges})
* and {@link android.Manifest.permission#ACCESS_COARSE_LOCATION}.
@@ -12187,8 +12233,7 @@
ITelephony service = getITelephony();
if (service != null) {
return service.getServiceStateForSubscriber(subId, renounceFineLocationAccess,
- renounceCoarseLocationAccess,
- getOpPackageName(), getAttributionTag());
+ renounceCoarseLocationAccess, getOpPackageName(), getAttributionTag());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#getServiceStateForSubscriber", e);
@@ -16123,7 +16168,10 @@
*/
public void registerTelephonyCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull TelephonyCallback callback) {
- registerTelephonyCallback(false, false, executor, callback);
+ registerTelephonyCallback(
+ getRenouncedPermissions().contains(Manifest.permission.ACCESS_FINE_LOCATION),
+ getRenouncedPermissions().contains(Manifest.permission.ACCESS_COARSE_LOCATION),
+ executor, callback);
}
/**
@@ -16153,6 +16201,12 @@
* instability. If a process has registered too many callbacks without unregistering them, it
* may encounter an {@link IllegalStateException} when trying to register more callbacks.
*
+ * <p>
+ * There's another way to renounce permissions with a custom context
+ * {@code AttributionSource.Builder#setRenouncedPermissions(Set<String>)} but only for system
+ * apps. To avoid confusion, calling this method supersede renouncing permissions with a
+ * custom context.
+ *
* @param renounceFineLocationAccess Set this to true if the caller would not like to receive
* location related information which will be sent if the caller already possess
* {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and do not renounce the permissions.
diff --git a/tests/AttestationVerificationTest/Android.bp b/tests/AttestationVerificationTest/Android.bp
index a4741eed..b98f8cb 100644
--- a/tests/AttestationVerificationTest/Android.bp
+++ b/tests/AttestationVerificationTest/Android.bp
@@ -40,5 +40,6 @@
"androidx.test.rules",
"androidx.test.ext.junit",
"platform-test-annotations",
+ "services.core",
],
}
diff --git a/tests/AttestationVerificationTest/AndroidManifest.xml b/tests/AttestationVerificationTest/AndroidManifest.xml
index c42bde9..37321ad8 100755
--- a/tests/AttestationVerificationTest/AndroidManifest.xml
+++ b/tests/AttestationVerificationTest/AndroidManifest.xml
@@ -24,6 +24,7 @@
<application>
<uses-library android:name="android.test.runner"/>
<activity android:name=".SystemAttestationVerificationTest$TestActivity" />
+ <activity android:name=".PeerDeviceSystemAttestationVerificationTest$TestActivity" />
</application>
<!-- self-instrumenting test package. -->
diff --git a/tests/AttestationVerificationTest/assets/test_attestation_with_root_certs.pem b/tests/AttestationVerificationTest/assets/test_attestation_with_root_certs.pem
new file mode 100644
index 0000000..e29ff48
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_attestation_with_root_certs.pem
@@ -0,0 +1,81 @@
+-----BEGIN CERTIFICATE-----
+MIICkjCCAjmgAwIBAgIBATAKBggqhkjOPQQDAjA5MQwwCgYDVQQMDANURUUxKTAn
+BgNVBAUTIDg2ZTQ0MjRhMjY2NDlhZDcyZWZhNWM0MWEwM2IyN2QxMCAXDTcwMDEw
+MTAwMDAwMFoYDzIxMDYwMjA3MDYyODE1WjAfMR0wGwYDVQQDDBRBbmRyb2lkIEtl
+eXN0b3JlIEtleTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIlTwcvhe+DLV45X
+RCTO7HoN20Ib7IbCEhV5+YdMiYOp/0AdKk8oYvsri1XODeC4zcoPfHNdQGt/68i0
+ADbilJmjggFIMIIBRDAOBgNVHQ8BAf8EBAMCB4AwggEwBgorBgEEAdZ5AgERBIIB
+IDCCARwCAQMKAQECAQQKAQEECXBsYXllcjQ1NgQAMFe/hT0IAgYBfvkgVei/hUVH
+BEUwQzEdMBsEFmNvbS5nb29nbGUuYXR0ZXN0YXRpb24CAQExIgQgOqyVXRJUdAGY
+/XVx8y/uRPiebqlyELt1EpqIz29h5tUwgaehCDEGAgECAgEDogMCAQOjBAICAQCl
+CDEGAgEEAgEGqgMCAQG/g3cCBQC/hT4DAgEAv4VATDBKBCCEZx8qY8Ys0HC2TqPq
+74eYPzh5L/agxD7Bn7zVBQHoNAEB/woBAAQguJwoDfWBjRaedzQ6TJPFJJKs+ytr
++8Vu2CSmqifFBHW/hUEFAgMB1MC/hUIFAgMDFdm/hU4GAgQBNIjJv4VPBgIEATSI
+yTAKBggqhkjOPQQDAgNHADBEAiBdGxfMEx59k5+zo+hV3Q9kgjbGi0zU3WH355P5
+JZttBwIgY4FZsSreUJL8RY3JvfvD8BRw8GuXcB1OQ600hwaYYC4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIB8zCCAXqgAwIBAgIRAOuuukN0OHbNQvKngECkewEwCgYIKoZIzj0EAwIwOTEM
+MAoGA1UEDAwDVEVFMSkwJwYDVQQFEyA3MDkxMmRmNDYxMDRmYWFlOTQ3ODY0ZTU4
+MDRmMWY4ZDAeFw0yMDA5MjgyMDI3NTZaFw0zMDA5MjYyMDI3NTZaMDkxDDAKBgNV
+BAwMA1RFRTEpMCcGA1UEBRMgODZlNDQyNGEyNjY0OWFkNzJlZmE1YzQxYTAzYjI3
+ZDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT3Mjl05ewv6G8zAR4fXJy2iadU
+yK7rNvzlECy2+nhEieL8BFXDvo0tx5fYs8qr67j/KvluFBfp2r9s+ckWz3Kzo2Mw
+YTAdBgNVHQ4EFgQUsVKBzAs1lMXAauQ3mGAJZJqK5tAwHwYDVR0jBBgwFoAUEsQA
+i8d2oLULSi5Ix4BTGGbvUEkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AgQwCgYIKoZIzj0EAwIDZwAwZAIwfFziBCwuM1thLUSUNI61Xx/vnDnNkSv/aX5D
+yLjxbLlgnFSzIrc+6vf6h6L/+TjYAjAq6h9GKtMn4R0286MoqYqzp/rHn6JD2sqH
+iM8KZ0oA+Ut242EcmGjAoNfGZGZGddQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDkzCCAXugAwIBAgIQNTAX5z3CBac6nD3hQiMDcDANBgkqhkiG9w0BAQsFADAb
+MRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MB4XDTIwMDkyODIwMjUwMloXDTMw
+MDkyNjIwMjUwMlowOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQFEyA3MDkxMmRmNDYx
+MDRmYWFlOTQ3ODY0ZTU4MDRmMWY4ZDB2MBAGByqGSM49AgEGBSuBBAAiA2IABA/7
+xZFlFtTjdy2B3p7E+FsrBjyhBSqY4a9FywawXMJRSja3HAK36ruzJjWlEkD+D0vq
+HI2joY39FHmWoZWwm2cq9gOleFGYOSCpMr4ib7xtq/6nefvKTP5rutxudF97t6Nj
+MGEwHQYDVR0OBBYEFBLEAIvHdqC1C0ouSMeAUxhm71BJMB8GA1UdIwQYMBaAFDZh
+4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgIEMA0GCSqGSIb3DQEBCwUAA4ICAQAaMONDQxJz3PRn9gHQW5KP+TIoBPJZyGa1
+QFuEBcMDTtIxBxEh5Pj3ivPBc76PrdYu5U47Ve5YYCPsTpUTj7dOxbzGSZjfjvHF
+fNwy24g1Lah2iAdQRVErhWKBlpnQhBnnRrrNmTTmzhl8NvSExqAPP746dqwm1kQ7
+YesC5yoEAHpxamhlZpIKAjSxSZeHWace2qV00M8qWd/7lIpqttJjFFrhCjzR0dtr
+oIIpC5EtmqIWdLeg6yZjJkX+Cjv4F8mRfBtwuNuxFsfALQ3D5l8WKw3iwPebmCy1
+kEby8Eoq88FxzXQp/XgAaljlrKXyuxptrc1noRuob4g42Oh6wetueYRSCtO6Bkym
+0UMnld/kG77aeiHOMVVb86wrhNuAGir1vgDGOBsclITVyuu9ka0YVQjjDm3phTpd
+O8JV16gbei2Phn+FfRV1MSDsZo/wu0i2KVzgs27bfJocMHXv+GzvwfefYgMJ/rYq
+Bg27lpsWzmFEPv2cyhA5PwwbG8ceswa3RZE/2eS9o7STkz93jr/KsKLcMBY6cX2C
+q4CBJByKFJtVANOVj+neFNxc2sQgeTT33yYNKbe4b5bm7Ki1FbrhFVckpzUGDnKs
+gL+AxvALWOoryDGwNbJiW8PRiD3HHByiMvSEQ7e7BSc2KjbsaWbCfYZAMZJEhEsc
+P1l8lcUVuA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
+BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz
+NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
+Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
+tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
+nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
+C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
+oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
+JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
+sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
+igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
+RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
+aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
+AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
+IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu
+XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U
+h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno
+L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok
+QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA
+D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI
+mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW
+Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91
+oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o
+jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB
+ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
+ex0SdDrx+tWUDqG8At2JHA==
+-----END CERTIFICATE-----
diff --git a/tests/AttestationVerificationTest/assets/test_attestation_wrong_root_certs.pem b/tests/AttestationVerificationTest/assets/test_attestation_wrong_root_certs.pem
new file mode 100644
index 0000000..3d6410a
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_attestation_wrong_root_certs.pem
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIGCDCCBHCgAwIBAgIBATANBgkqhkiG9w0BAQsFADApMRkwFwYDVQQFExAyZGM1OGIyZDFhMjQx
+MzI2MQwwCgYDVQQMDANURUUwIBcNNzAwMTAxMDAwMDAwWhgPMjEwNjAyMDcwNjI4MTVaMB8xHTAb
+BgNVBAMMFEFuZHJvaWQgS2V5c3RvcmUgS2V5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEApNVcnyN40MANMbbo2nMGNq2NNysDSjfLm0W3i6wPKf0ffCYkhWM4dCmQKKf50uAZTBeTit4c
+NwXeZn3qellMlOsIN3Qc384rfN/8cikrRvUAgibz0Jy7STykjwa7x6tKwqITxbO8HqAhKo8/BQXU
+xzrOdIg5ciy+UM7Vgh7a7ogen0KL2iGgrsalb1ti7Vlzb6vIJ4WzIC3TGD2sCkoPahghwqFDZZCo
+/FzaLoNY0jAUX2mL+kf8aUaoxz7xA9FTvgara+1pLBR1s4c8xPS2HdZipcVXWfey0wujv1VAKs4+
+tXjKlHkYBHBBceEjxUtEmrapSQEdpHPv7Xh9Uanq4QIDAQABo4ICwTCCAr0wDgYDVR0PAQH/BAQD
+AgeAMIICqQYKKwYBBAHWeQIBEQSCApkwggKVAgEDCgEBAgEECgEBBANhYmMEADCCAc2/hT0IAgYB
+ZOYGEYe/hUWCAbsEggG3MIIBszGCAYswDAQHYW5kcm9pZAIBHTAZBBRjb20uYW5kcm9pZC5rZXlj
+aGFpbgIBHTAZBBRjb20uYW5kcm9pZC5zZXR0aW5ncwIBHTAZBBRjb20ucXRpLmRpYWdzZXJ2aWNl
+cwIBHTAaBBVjb20uYW5kcm9pZC5keW5zeXN0ZW0CAR0wHQQYY29tLmFuZHJvaWQuaW5wdXRkZXZp
+Y2VzAgEdMB8EGmNvbS5hbmRyb2lkLmxvY2FsdHJhbnNwb3J0AgEdMB8EGmNvbS5hbmRyb2lkLmxv
+Y2F0aW9uLmZ1c2VkAgEdMB8EGmNvbS5hbmRyb2lkLnNlcnZlci50ZWxlY29tAgEdMCAEG2NvbS5h
+bmRyb2lkLndhbGxwYXBlcmJhY2t1cAIBHTAhBBxjb20uZ29vZ2xlLlNTUmVzdGFydERldGVjdG9y
+AgEdMCIEHWNvbS5nb29nbGUuYW5kcm9pZC5oaWRkZW5tZW51AgEBMCMEHmNvbS5hbmRyb2lkLnBy
+b3ZpZGVycy5zZXR0aW5ncwIBHTEiBCAwGqPLCBE0UBxF8UIqvGbCQiT9Xe1f3I8X5pcXb9hmqjCB
+rqEIMQYCAQICAQOiAwIBAaMEAgIIAKUFMQMCAQSmCDEGAgEDAgEFv4FIBQIDAQABv4N3AgUAv4U+
+AwIBAL+FQEwwSgQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAKAQIEIHKNsSdP
+HxzxVx3kOAsEilVKxKOA529TVQg1KQhKk3gBv4VBAwIBAL+FQgUCAwMUs7+FTgUCAwMUs7+FTwUC
+AwMUszANBgkqhkiG9w0BAQsFAAOCAYEAJMIuzdNUdfrE6sIdmsnMn/scSG2odbphj8FkX9JGdF2S
+OT599HuDY9qhvkru2Dza4sLKK3f4ViBhuR9lpfeprKvstxbtBO7jkLYfVn0ZRzHRHVEyiW5IVKh+
+qOXVJ9S1lMShOTlsaYJytLKIlcrRAZBEXZiNbzTuVh1CH6X9Ni1dog14snm+lcOeORdL9fht2CHa
+u/caRnpWiZbjoAoJp0O89uBrRkXPpln51+3jPY6AFny30grNAvKguauDcPPhNV1yR+ylSsQi2gm3
+Rs4pgtlxFLMfZLgT0cbkl+9zk/QUqlpBP8ftUBsOI0ARr8xhFN3cvq9kXGLtJ9hEP9PRaflAFREk
+DK3IBIbVcAFZBFoAQOdE9zy0+F5bQrznPGaZg4Dzhcx33qMDUTgHtWoy+k3ePGQMEtmoTTLgQywW
+OIkXEoFqqGi9GKJXUT1KYi5NsigaYqu7FoN4Qsvs61pMUEfZSPP2AFwkA8uNFbmb9uxcxaGHCA8i
+3i9VM6yOLIrP
+-----END CERTIFICATE-----
diff --git a/tests/AttestationVerificationTest/assets/test_no_attestation_ext_certs.pem b/tests/AttestationVerificationTest/assets/test_no_attestation_ext_certs.pem
new file mode 100644
index 0000000..6d261fa
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_no_attestation_ext_certs.pem
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFoDCCA4igAwIBAgIQTfpKgAsLZJhp2V4xUriMADANBgkqhkiG9w0BAQ0FADBp
+MQswCQYDVQQGEwJVUzEUMBIGA1UECgwLR29vZ2xlIEluYy4xFzAVBgNVBAsMDkFu
+ZHJvaWQgVGhpbmdzMSswKQYDVQQDDCJBbmRyb2lkIFRoaW5ncyBBdHRlc3RhdGlv
+biBSb290IENBMCAXDTE3MDYyMTIwMjQzN1oYDzIwNTcwNjExMjAyNDM3WjBpMQsw
+CQYDVQQGEwJVUzEUMBIGA1UECgwLR29vZ2xlIEluYy4xFzAVBgNVBAsMDkFuZHJv
+aWQgVGhpbmdzMSswKQYDVQQDDCJBbmRyb2lkIFRoaW5ncyBBdHRlc3RhdGlvbiBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuO82oerGivb9
+G9bWyM8Pg0y6SOnAC8/8b92dp1v4Npnc+QpjPRUKgn8lzjQ9Jo6IGY3OShRBiQYl
+bbZYkfJnC5HtqbOETdPLZclErVE/G6Oda1IeZWvQVMjNImEYOLL5ct2RxiPttd8v
+SLyOSNFPf5/SeFqX/La0NcmXMOvPSrTW3qO34brnC+ih7mlpJFLz6Up93N3Umxsl
+IElz2wCG72t6k3+caWLyIPVgIPmsQrfTeBK/hN5dAJgAN65BsTevLHRP9J610wj3
+RagSIK1NdTuJRnr5ZyTQrwE2nA8H3IJ7/eo6IlGhXPwLKDhbdxYygPxdlCq6Rl96
+aVLjfpqDPtJ9ow+QKZuEDbYJ4z4olNXC6O5G7vqnCuULA/2E7y7DZObjzXOrdx2z
+9YKd8BrIDMTN/5mmw2us8tywiaQhbl8vOtjU+A+iBBnkj/wt9TYyLKopdrDlo5mz
+wy5l750HOkVZXC3VkeECnp+9duSHdS4qeUf/W1j9nPM7kY0HFLPUVX9AFVp2JXnC
+iKZC32GQAVsDc1iyAZWAVTqA7E0fBHhk9jUnA0W9b5Lq06oW95ngNR1MIFY871i8
+aLHCBpIix8DuMe8NB9spCIP6WCQqGiWQQpzbeuBPtoi424xwZTO4oectTd77bs9V
+Rvunn49fz308KnoWjk/by1N7gWyTb38CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMDQ1I0RKwFCI+Fy9uIIJ/HrXuqu
+MA0GCSqGSIb3DQEBDQUAA4ICAQB09qkyEpEDocdN5pPeXqtjj9d0AXREUGH2LhnC
+z9KZcUFR+JskwEMHCaOENOmKI3zWRmxT7d8cVywwGk+ExE7EBQoeHlh3Yo44M8aj
+ZL7RHCvHRYsePhAJkYpJ02IMR60TV+1jhMqE8+BnqFivS7kft4t295EyrnLRZE3b
+Nfc0t011j02RwUrioR57mdvS9EZBRnMQkobhn+jWt9O+V3mtplW+1A2n4ec6uni1
+2MMgAWHuO1sKVYd5Sp4JMUpNnfmQAMnNiOMF6VxkpaoF1lZWo4TrLxuDKJG3O8h1
+fByjCpNVY8kOvvYEadbldzh6Agy/3ppb9yfG7X7FtHr1ghNjuNT6w5VgvbRtoRja
+/ZSKuJMaKm5emMWNkls/cwVSPJIvTOzPTeYK1BKSyAL2LDJ93HI7x8h79/Q7gKRi
+kL8qT7GW2FqpWTK0253sJHqCJJP4A5Rxtf2+Afwqadfc6Ga4jJHb7rPXngz4j1ZB
+gl5yjXgWF9wHGxqrjKWe2EA3d47BC4HG3Rf5L56KQiRPhTqTk5vtZwtwLRLFDLt7
+Hdff13O1oLhn+2z9xkASUL3rFE/qWajZP7fk3CvzcuXwKDTZomIC4nNaglx4nLdj
+lHhOq+6ON8MZC46sLStD+D4a9A1HOoihJgI/yGGkwdrp4KQIveRkEBO/x9v3NNBE
+bMwG9w==
+-----END CERTIFICATE-----
diff --git a/tests/AttestationVerificationTest/assets/test_root_certs.pem b/tests/AttestationVerificationTest/assets/test_root_certs.pem
new file mode 100644
index 0000000..c51851fe
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_root_certs.pem
@@ -0,0 +1,61 @@
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIJAOj6GWMU0voYMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
+BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTYwNTI2MTYyODUyWhcNMjYwNTI0MTYy
+ODUyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
+Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
+tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
+nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
+C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
+oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
+JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
+sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
+igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
+RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
+aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
+AGMCAwEAAaOBpjCBozAdBgNVHQ4EFgQUNmHhAHyIBQlRi0RsR/8aTMnqTxIwHwYD
+VR0jBBgwFoAUNmHhAHyIBQlRi0RsR/8aTMnqTxIwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cHM6Ly9hbmRyb2lk
+Lmdvb2dsZWFwaXMuY29tL2F0dGVzdGF0aW9uL2NybC8wDQYJKoZIhvcNAQELBQAD
+ggIBACDIw41L3KlXG0aMiS//cqrG+EShHUGo8HNsw30W1kJtjn6UBwRM6jnmiwfB
+Pb8VA91chb2vssAtX2zbTvqBJ9+LBPGCdw/E53Rbf86qhxKaiAHOjpvAy5Y3m00m
+qC0w/Zwvju1twb4vhLaJ5NkUJYsUS7rmJKHHBnETLi8GFqiEsqTWpG/6ibYCv7rY
+DBJDcR9W62BW9jfIoBQcxUCUJouMPH25lLNcDc1ssqvC2v7iUgI9LeoM1sNovqPm
+QUiG9rHli1vXxzCyaMTjwftkJLkf6724DFhuKug2jITV0QkXvaJWF4nUaHOTNA4u
+JU9WDvZLI1j83A+/xnAJUucIv/zGJ1AMH2boHqF8CY16LpsYgBt6tKxxWH00XcyD
+CdW2KlBCeqbQPcsFmWyWugxdcekhYsAWyoSf818NUsZdBWBaR/OukXrNLfkQ79Iy
+ZohZbvabO/X+MVT3rriAoKc8oE2Uws6DF+60PV7/WIPjNvXySdqspImSN78mflxD
+qwLqRBYkA3I75qppLGG9rp7UCdRjxMl8ZDBld+7yvHVgt1cVzJx9xnyGCC23Uaic
+MDSXYrB4I4WHXPGjxhZuCuPBLTdOLU8YRvMYdEvYebWHMpvwGCF6bAx3JBpIeOQ1
+wDB5y0USicV3YgYGmi+NZfhA4URSh77Yd6uuJOJENRaNVTzk
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
+BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz
+NzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
+Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
+tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
+nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
+C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
+oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
+JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
+sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
+igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
+RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
+aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
+AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
+IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu
+XKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U
+h6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno
+L/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok
+QBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA
+D32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI
+mMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW
+Fua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91
+oeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o
+jm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB
+ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
+ex0SdDrx+tWUDqG8At2JHA==
+-----END CERTIFICATE-----
diff --git a/tests/AttestationVerificationTest/assets/test_virtual_device_attestation_certs.pem b/tests/AttestationVerificationTest/assets/test_virtual_device_attestation_certs.pem
new file mode 100644
index 0000000..2827710
--- /dev/null
+++ b/tests/AttestationVerificationTest/assets/test_virtual_device_attestation_certs.pem
@@ -0,0 +1,50 @@
+-----BEGIN CERTIFICATE-----
+MIIC7DCCApGgAwIBAgIBATAKBggqhkjOPQQDAjCBiDELMAkGA1UEBhMCVVMxEzAR
+BgNVBAgMCkNhbGlmb3JuaWExFTATBgNVBAoMDEdvb2dsZSwgSW5jLjEQMA4GA1UE
+CwwHQW5kcm9pZDE7MDkGA1UEAwwyQW5kcm9pZCBLZXlzdG9yZSBTb2Z0d2FyZSBB
+dHRlc3RhdGlvbiBJbnRlcm1lZGlhdGUwHhcNNzAwMTAxMDAwMDAwWhcNNjkxMjMx
+MjM1OTU5WjAfMR0wGwYDVQQDDBRBbmRyb2lkIEtleXN0b3JlIEtleTBZMBMGByqG
+SM49AgEGCCqGSM49AwEHA0IABEYtCH28qu+St0F0TixVsQz0L/Y7DcRHgYAU98E6
+edwOpACFmmseYxMjvmZv/4jURSG2/Z0J1s3A/qFzIY96/tyjggFSMIIBTjALBgNV
+HQ8EBAMCB4AwggEcBgorBgEEAdZ5AgERBIIBDDCCAQgCAQQKAQACASkKAQAECXBs
+YXllcjQ1NgQAMIHqoQgxBgIBAgIBA6IDAgEDowQCAgEApQgxBgIBBAIBBqoDAgEB
+v4N3AgUAv4U9CAIGAX8DoY9Qv4U+AwIBAL+FQEwwSgQgAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAABAQAKAQIEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAv4VBBQIDAa2wv4VCBQIDAxUbv4VFRwRFMEMxHTAbBBZjb20uZ29v
+Z2xlLmF0dGVzdGF0aW9uAgEBMSIEIDqslV0SVHQBmP11cfMv7kT4nm6pchC7dRKa
+iM9vYebVMAAwHwYDVR0jBBgwFoAUP/ys1hqxOp6BILjVJRzFZbsekakwCgYIKoZI
+zj0EAwIDSQAwRgIhAMzs7gWWBIITpeLeEEx9B8ihdhkFqpMGlsYLRO01ZIOeAiEA
+uKs9xfK3fIOpVAhDmsrp+zE8KUwyvqCU/IS13tXz7Ng=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICeDCCAh6gAwIBAgICEAEwCgYIKoZIzj0EAwIwgZgxCzAJBgNVBAYTAlVTMRMw
+EQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRUwEwYD
+VQQKDAxHb29nbGUsIEluYy4xEDAOBgNVBAsMB0FuZHJvaWQxMzAxBgNVBAMMKkFu
+ZHJvaWQgS2V5c3RvcmUgU29mdHdhcmUgQXR0ZXN0YXRpb24gUm9vdDAeFw0xNjAx
+MTEwMDQ2MDlaFw0yNjAxMDgwMDQ2MDlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEVMBMGA1UECgwMR29vZ2xlLCBJbmMuMRAwDgYDVQQLDAdB
+bmRyb2lkMTswOQYDVQQDDDJBbmRyb2lkIEtleXN0b3JlIFNvZnR3YXJlIEF0dGVz
+dGF0aW9uIEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOue
+efhCY1msyyqRTImGzHCtkGaTgqlzJhP+rMv4ISdMIXSXSir+pblNf2bU4GUQZjW8
+U7ego6ZxWD7bPhGuEBSjZjBkMB0GA1UdDgQWBBQ//KzWGrE6noEguNUlHMVlux6R
+qTAfBgNVHSMEGDAWgBTIrel3TEXDo88NFhDkeUM6IVowzzASBgNVHRMBAf8ECDAG
+AQH/AgEAMA4GA1UdDwEB/wQEAwIChDAKBggqhkjOPQQDAgNIADBFAiBLipt77oK8
+wDOHri/AiZi03cONqycqRZ9pDMfDktQPjgIhAO7aAV229DLp1IQ7YkyUBO86fMy9
+Xvsiu+f+uXc/WT/7
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICizCCAjKgAwIBAgIJAKIFntEOQ1tXMAoGCCqGSM49BAMCMIGYMQswCQYDVQQG
+EwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmll
+dzEVMBMGA1UECgwMR29vZ2xlLCBJbmMuMRAwDgYDVQQLDAdBbmRyb2lkMTMwMQYD
+VQQDDCpBbmRyb2lkIEtleXN0b3JlIFNvZnR3YXJlIEF0dGVzdGF0aW9uIFJvb3Qw
+HhcNMTYwMTExMDA0MzUwWhcNMzYwMTA2MDA0MzUwWjCBmDELMAkGA1UEBhMCVVMx
+EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFTAT
+BgNVBAoMDEdvb2dsZSwgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDEzMDEGA1UEAwwq
+QW5kcm9pZCBLZXlzdG9yZSBTb2Z0d2FyZSBBdHRlc3RhdGlvbiBSb290MFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAE7l1ex+HA220Dpn7mthvsTWpdamguD/9/SQ59
+dx9EIm29sa/6FsvHrcV30lacqrewLVQBXT5DKyqO107sSHVBpKNjMGEwHQYDVR0O
+BBYEFMit6XdMRcOjzw0WEOR5QzohWjDPMB8GA1UdIwQYMBaAFMit6XdMRcOjzw0W
+EOR5QzohWjDPMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgKEMAoGCCqG
+SM49BAMCA0cAMEQCIDUho++LNEYenNVg8x1YiSBq3KNlQfYNns6KGYxmSGB7AiBN
+C/NR2TB8fVvaNTQdqEcbY6WFZTytTySn502vQX3xvw==
+-----END CERTIFICATE-----
diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt
new file mode 100644
index 0000000..32c2230
--- /dev/null
+++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt
@@ -0,0 +1,161 @@
+package android.security.attestationverification
+
+import android.app.Activity
+import android.os.Bundle
+import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
+import android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY
+import android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE
+import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
+import android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE
+import android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY
+import android.security.attestationverification.AttestationVerificationManager.TYPE_UNKNOWN
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.ByteArrayOutputStream
+import java.security.cert.CertificateFactory
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.TimeUnit
+
+/** Test for system-defined attestation verifiers. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class PeerDeviceSystemAttestationVerificationTest {
+
+ @get:Rule
+ val rule = ActivityScenarioRule(TestActivity::class.java)
+
+ private val certifcateFactory = CertificateFactory.getInstance("X.509")
+ private lateinit var activity: Activity
+ private lateinit var avm: AttestationVerificationManager
+ private lateinit var invalidAttestationByteArray: ByteArray
+
+ @Before
+ fun setup() {
+ rule.getScenario().onActivity {
+ avm = it.getSystemService(AttestationVerificationManager::class.java)
+ activity = it
+ }
+ invalidAttestationByteArray = TEST_ATTESTATION_CERT_FILENAME.fromPEMFileToByteArray()
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureWrongBindingType() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ avm.verifyAttestation(profile, TYPE_UNKNOWN, Bundle(),
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureEmptyRequirements() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, Bundle(),
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureMismatchBindingType() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val publicKeyRequirements = Bundle()
+ publicKeyRequirements.putByteArray(PARAM_PUBLIC_KEY, "publicKeyStr".encodeToByteArray())
+ avm.verifyAttestation(profile, TYPE_CHALLENGE, publicKeyRequirements,
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+
+ val future2 = CompletableFuture<Int>()
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "challengeStr".encodeToByteArray())
+ avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, challengeRequirements,
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future2.complete(result)
+ }
+
+ assertThat(future2.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureWrongResourceKey() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val wrongKeyRequirements = Bundle()
+ wrongKeyRequirements.putByteArray("wrongReqKey", "publicKeyStr".encodeToByteArray())
+ avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, wrongKeyRequirements,
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureEmptyAttestation() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val requirements = Bundle()
+ requirements.putByteArray(PARAM_PUBLIC_KEY, "publicKeyStr".encodeToByteArray())
+ avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, requirements, ByteArray(0),
+ activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureTrustAnchorMismatch() {
+ val future = CompletableFuture<Int>()
+ val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+ avm.verifyAttestation(profile, TYPE_CHALLENGE, challengeRequirements,
+ invalidAttestationByteArray, activity.mainExecutor) { result, _ ->
+ future.complete(result)
+ }
+ assertThat(future.getSoon()).isEqualTo(RESULT_FAILURE)
+ }
+
+ private fun <T> CompletableFuture<T>.getSoon(): T {
+ return this.get(1, TimeUnit.SECONDS)
+ }
+
+ private fun String.fromPEMFileToByteArray(): ByteArray {
+ val certs = certifcateFactory.generateCertificates(
+ InstrumentationRegistry.getInstrumentation().getContext().getResources().getAssets()
+ .open(this))
+ val bos = ByteArrayOutputStream()
+ certs.forEach {
+ bos.write(it.encoded)
+ }
+ return bos.toByteArray()
+ }
+
+ class TestActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ }
+ }
+
+ companion object {
+ private const val TEST_ATTESTATION_CERT_FILENAME = "test_attestation_wrong_root_certs.pem"
+ }
+}
diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
index 6290292..169effa 100644
--- a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
+++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt
@@ -12,8 +12,8 @@
import org.junit.runner.RunWith
import com.google.common.truth.Truth.assertThat
import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
-import android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE
import android.security.attestationverification.AttestationVerificationManager.PROFILE_SELF_TRUSTED
+import android.security.attestationverification.AttestationVerificationManager.PROFILE_UNKNOWN
import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
import android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS
import android.security.attestationverification.AttestationVerificationManager.RESULT_UNKNOWN
@@ -52,7 +52,7 @@
@Test
fun verifyAttestation_returnsUnknown() {
val future = CompletableFuture<Int>()
- val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val profile = AttestationProfile(PROFILE_UNKNOWN)
avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, Bundle(), ByteArray(0),
activity.mainExecutor) { result, _ ->
future.complete(result)
@@ -137,7 +137,7 @@
@Test
fun verifyToken_returnsUnknown() {
val future = CompletableFuture<Int>()
- val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val profile = AttestationProfile(PROFILE_SELF_TRUSTED)
avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, Bundle(), ByteArray(0),
activity.mainExecutor) { _, token ->
val result = avm.verifyToken(profile, TYPE_PUBLIC_KEY, Bundle(), token, null)
@@ -150,7 +150,7 @@
@Test
fun verifyToken_tooBigMaxAgeThrows() {
val future = CompletableFuture<VerificationToken>()
- val profile = AttestationProfile(PROFILE_PEER_DEVICE)
+ val profile = AttestationProfile(PROFILE_SELF_TRUSTED)
avm.verifyAttestation(profile, TYPE_PUBLIC_KEY, Bundle(), ByteArray(0),
activity.mainExecutor) { _, token ->
future.complete(token)
diff --git a/tests/AttestationVerificationTest/src/com/android/server/security/AndroidKeystoreAttestationVerificationAttributesTest.java b/tests/AttestationVerificationTest/src/com/android/server/security/AndroidKeystoreAttestationVerificationAttributesTest.java
new file mode 100644
index 0000000..0d15fe7
--- /dev/null
+++ b/tests/AttestationVerificationTest/src/com/android/server/security/AndroidKeystoreAttestationVerificationAttributesTest.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/** Test for data class holding parsed X509Certificate attestation attributes. */
+@RunWith(AndroidJUnit4.class)
+public class AndroidKeystoreAttestationVerificationAttributesTest {
+ @Rule public ExpectedException mException = ExpectedException.none();
+ private static final String TEST_PHYSCIAL_DEVICE_CERTS =
+ "test_attestation_wrong_root_certs.pem";
+ private static final String TEST_PHYSICAL_DEVICE_CERTS_2 =
+ "test_attestation_with_root_certs.pem";
+ private static final String TEST_VIRTUAL_DEVICE_CERTS =
+ "test_virtual_device_attestation_certs.pem";
+ private static final String TEST_CERT_NO_ATTESTATION_EXTENSION =
+ "test_no_attestation_ext_certs.pem";
+ private static final String TEST_CERTS_NO_ATTESTATION_EXTENSION_2 =
+ "test_root_certs.pem";
+
+
+ private CertificateFactory mFactory;
+ private AndroidKeystoreAttestationVerificationAttributes mPhysicalDeviceAttributes;
+ private AndroidKeystoreAttestationVerificationAttributes mPhysicalDeviceAttributes2;
+ private AndroidKeystoreAttestationVerificationAttributes mVirtualDeviceAttributes;
+
+ @Before
+ public void setUp() throws Exception {
+ mFactory = CertificateFactory.getInstance("X.509");
+ mPhysicalDeviceAttributes =
+ AndroidKeystoreAttestationVerificationAttributes.fromCertificate(
+ generateCertificate(TEST_PHYSCIAL_DEVICE_CERTS));
+ mPhysicalDeviceAttributes2 =
+ AndroidKeystoreAttestationVerificationAttributes.fromCertificate(
+ generateCertificates(TEST_PHYSICAL_DEVICE_CERTS_2).get(0));
+ mVirtualDeviceAttributes =
+ AndroidKeystoreAttestationVerificationAttributes.fromCertificate(
+ generateCertificates(TEST_VIRTUAL_DEVICE_CERTS).get(0));
+ }
+
+ @Test
+ public void parseCertificate_noAttestationExtension() throws Exception {
+ List<X509Certificate> certsNoAttestation =
+ generateCertificates(TEST_CERTS_NO_ATTESTATION_EXTENSION_2);
+ certsNoAttestation.add(generateCertificate(TEST_CERT_NO_ATTESTATION_EXTENSION));
+ for (X509Certificate cert: certsNoAttestation) {
+ mException.expect(CertificateEncodingException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("No attestation extension found in certificate."));
+
+ AndroidKeystoreAttestationVerificationAttributes.fromCertificate(cert);
+ }
+ }
+
+ @Test
+ public void parseCertificate_attestationLevel() {
+ assertThat(mPhysicalDeviceAttributes.getAttestationVersion()).isEqualTo(3);
+ assertThat(mPhysicalDeviceAttributes2.getAttestationVersion()).isEqualTo(3);
+ assertThat(mVirtualDeviceAttributes.getAttestationVersion()).isEqualTo(4);
+ }
+
+ @Test
+ public void parseCertificate_attestationSecurityLevel() {
+ assertThat(mPhysicalDeviceAttributes.getAttestationSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.TRUSTED_ENVIRONMENT);
+ assertThat(mPhysicalDeviceAttributes2.getAttestationSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.TRUSTED_ENVIRONMENT);
+ assertThat(mVirtualDeviceAttributes.getAttestationSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.SOFTWARE);
+ }
+
+ @Test
+ public void parseCertificate_isAttestationHardwareBacked() {
+ assertThat(mPhysicalDeviceAttributes.isAttestationHardwareBacked()).isTrue();
+ assertThat(mPhysicalDeviceAttributes2.isAttestationHardwareBacked()).isTrue();
+ assertThat(mVirtualDeviceAttributes.isAttestationHardwareBacked()).isFalse();
+ }
+
+ @Test
+ public void parseCertificate_keymasterLevel() {
+ assertThat(mPhysicalDeviceAttributes.getKeymasterVersion()).isEqualTo(4);
+ assertThat(mPhysicalDeviceAttributes2.getKeymasterVersion()).isEqualTo(4);
+ assertThat(mVirtualDeviceAttributes.getKeymasterVersion()).isEqualTo(41);
+ }
+
+ @Test
+ public void parseCertificate_keymasterSecurityLevel() {
+ assertThat(mPhysicalDeviceAttributes.getKeymasterSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.TRUSTED_ENVIRONMENT);
+ assertThat(mPhysicalDeviceAttributes2.getKeymasterSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.TRUSTED_ENVIRONMENT);
+ assertThat(mVirtualDeviceAttributes.getKeymasterSecurityLevel()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.SecurityLevel.SOFTWARE);
+ }
+
+ @Test
+ public void parseCertificate_isKeymasterHardwareBacked() {
+ assertThat(mPhysicalDeviceAttributes.isKeymasterHardwareBacked()).isTrue();
+ assertThat(mPhysicalDeviceAttributes2.isKeymasterHardwareBacked()).isTrue();
+ assertThat(mVirtualDeviceAttributes.isKeymasterHardwareBacked()).isFalse();
+ }
+
+ @Test
+ public void parseCertificate_attestationChallenge() {
+ assertThat(mPhysicalDeviceAttributes.getAttestationChallenge().toByteArray()).isEqualTo(
+ "abc".getBytes(UTF_8));
+ assertThat(mPhysicalDeviceAttributes2.getAttestationChallenge().toByteArray()).isEqualTo(
+ "player456".getBytes(UTF_8));
+ assertThat(mVirtualDeviceAttributes.getAttestationChallenge().toByteArray()).isEqualTo(
+ "player456".getBytes(UTF_8));
+ }
+
+ @Test
+ public void parseCertificate_verifiedBootState() {
+ assertThat(mPhysicalDeviceAttributes.getVerifiedBootState()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.VerifiedBootState.UNVERIFIED);
+ assertThat(mPhysicalDeviceAttributes2.getVerifiedBootState()).isEqualTo(
+ AndroidKeystoreAttestationVerificationAttributes.VerifiedBootState.VERIFIED);
+ assertThat(mVirtualDeviceAttributes.getVerifiedBootState()).isNull();
+ }
+
+ @Test
+ public void parseCertificate_keyBootPatchLevel() {
+ assertThat(mPhysicalDeviceAttributes.getKeyBootPatchLevel()).isEqualTo(201907);
+ assertThat(mPhysicalDeviceAttributes2.getKeyBootPatchLevel()).isEqualTo(20220105);
+ }
+
+ @Test
+ public void parseCertificate_keyBootPatchLevelNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("KeyBootPatchLevel is not set."));
+
+ mVirtualDeviceAttributes.getKeyBootPatchLevel();
+ }
+
+ @Test
+ public void parseCertificate_keyOsPatchLevel() {
+ assertThat(mPhysicalDeviceAttributes.getKeyOsPatchLevel()).isEqualTo(201907);
+ assertThat(mPhysicalDeviceAttributes2.getKeyOsPatchLevel()).isEqualTo(202201);
+ }
+
+ @Test
+ public void parseCertificate_keyOsPatchLevelNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("KeyOsPatchLevel is not set."));
+
+ mVirtualDeviceAttributes.getKeyOsPatchLevel();
+ }
+
+ @Test
+ public void parseCertificate_keyVendorPatchLevel() {
+ assertThat(mPhysicalDeviceAttributes.getKeyVendorPatchLevel()).isEqualTo(201907);
+ assertThat(mPhysicalDeviceAttributes2.getKeyVendorPatchLevel()).isEqualTo(20220105);
+ }
+
+ @Test
+ public void parseCertificate_keyVendorPatchLevelNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("KeyVendorPatchLevel is not set."));
+
+ mVirtualDeviceAttributes.getKeyVendorPatchLevel();
+ }
+
+ @Test
+ public void parseCertificate_keyAuthenticatorType() {
+ assertThat(mPhysicalDeviceAttributes.getKeyAuthenticatorType()).isEqualTo(0);
+ assertThat(mPhysicalDeviceAttributes2.getKeyAuthenticatorType()).isEqualTo(0);
+ }
+
+ @Test
+ public void parseCertificate_keyOsVersion() {
+ assertThat(mPhysicalDeviceAttributes.getKeyOsVersion()).isEqualTo(0);
+ assertThat(mPhysicalDeviceAttributes2.getKeyOsVersion()).isEqualTo(120000);
+ }
+
+ @Test
+ public void parseCertificate_keyOsVersionNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("KeyOsVersion is not set."));
+
+ mVirtualDeviceAttributes.getKeyOsVersion();
+ }
+
+ @Test
+ public void parseCertificate_verifiedBootHash() {
+ assertThat(mPhysicalDeviceAttributes.getVerifiedBootHash()).isNotEmpty();
+ assertThat(mPhysicalDeviceAttributes2.getVerifiedBootHash()).isNotEmpty();
+ }
+
+ @Test
+ public void parseCertificate_verifiedBootKey() {
+ assertThat(mPhysicalDeviceAttributes.getVerifiedBootKey()).isNotEmpty();
+ assertThat(mPhysicalDeviceAttributes2.getVerifiedBootKey()).isNotEmpty();
+ }
+
+ @Test
+ public void parseCertificate_isVerifiedBootLocked() {
+ assertThat(mPhysicalDeviceAttributes.isVerifiedBootLocked()).isFalse();
+ assertThat(mPhysicalDeviceAttributes2.isVerifiedBootLocked()).isTrue();
+ }
+
+ @Test
+ public void parseCertificate_isVerifiedBootLockedNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("VerifiedBootLocked is not set."));
+
+ mVirtualDeviceAttributes.isVerifiedBootLocked();
+ }
+
+ @Test
+ public void parseCertificate_applicationPackageNameVersion() {
+ assertThat(mPhysicalDeviceAttributes.getApplicationPackageNameVersion()).isNotEmpty();
+ }
+
+ @Test
+ public void parseCertificate_applicationCertificateDigests() {
+ assertThat(mPhysicalDeviceAttributes.getApplicationCertificateDigests()).isNotEmpty();
+ }
+
+ @Test
+ public void parseCertificate_valuesNotSet() {
+ assertThat(mPhysicalDeviceAttributes.getDeviceBrand()).isNull();
+ assertThat(mPhysicalDeviceAttributes.getDeviceName()).isNull();
+ assertThat(mPhysicalDeviceAttributes.getDeviceProductName()).isNull();
+ assertThat(mPhysicalDeviceAttributes.isKeyAllowedForAllApplications()).isFalse();
+ assertThat(mPhysicalDeviceAttributes2.getDeviceBrand()).isNull();
+ assertThat(mPhysicalDeviceAttributes2.getDeviceName()).isNull();
+ assertThat(mPhysicalDeviceAttributes2.getDeviceProductName()).isNull();
+ assertThat(mPhysicalDeviceAttributes2.isKeyAllowedForAllApplications()).isFalse();
+ }
+
+ @Test
+ public void parseCertificate_keyRequiresUnlockedDeviceNotSetException() {
+ mException.expect(IllegalStateException.class);
+ mException.expectMessage(
+ CoreMatchers.containsString("KeyRequiresUnlockedDevice is not set."));
+
+ mPhysicalDeviceAttributes.isKeyRequiresUnlockedDevice();
+ }
+
+ private X509Certificate generateCertificate(String certificateString)
+ throws Exception {
+ return generateCertificates(certificateString).get(0);
+ }
+
+ private List<X509Certificate> generateCertificates(String certificateString)
+ throws Exception {
+ Collection<? extends Certificate> certificates = mFactory.generateCertificates(
+ InstrumentationRegistry.getInstrumentation().getContext().getResources().getAssets()
+ .open(certificateString));
+
+ ArrayList<X509Certificate> x509Certs = new ArrayList<>();
+ for (Certificate cert : certificates) {
+ x509Certs.add((X509Certificate) cert);
+ }
+ return x509Certs;
+ }
+}
diff --git a/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt b/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt
new file mode 100644
index 0000000..45f2e5c
--- /dev/null
+++ b/tests/AttestationVerificationTest/src/com/android/server/security/AttestationVerificationPeerDeviceVerifierTest.kt
@@ -0,0 +1,175 @@
+package com.android.server.security
+
+import android.app.Activity
+import android.content.Context
+import android.os.Bundle
+import android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE
+import android.security.attestationverification.AttestationVerificationManager.PARAM_PUBLIC_KEY
+import android.security.attestationverification.AttestationVerificationManager.RESULT_FAILURE
+import android.security.attestationverification.AttestationVerificationManager.RESULT_SUCCESS
+import android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE
+import android.security.attestationverification.AttestationVerificationManager.TYPE_PUBLIC_KEY
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
+import java.io.ByteArrayOutputStream
+import java.security.cert.Certificate
+import java.security.cert.CertificateFactory
+import java.security.cert.TrustAnchor
+import java.security.cert.X509Certificate
+import java.time.LocalDate
+
+/** Test for Peer Device attestation verifier. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class AttestationVerificationPeerDeviceVerifierTest {
+ private val certificateFactory = CertificateFactory.getInstance("X.509")
+ @Mock private lateinit var context: Context
+ private lateinit var trustAnchors: HashSet<TrustAnchor>
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+
+ val rootCerts = TEST_ROOT_CERT_FILENAME.fromPEMFileToCerts()
+ trustAnchors = HashSet<TrustAnchor>()
+ rootCerts.forEach {
+ trustAnchors.add(TrustAnchor(it as X509Certificate, null))
+ }
+ }
+
+ @Test
+ fun verifyAttestation_returnsSuccessTypeChallenge() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, trustAnchors, false, LocalDate.of(2022, 2, 1),
+ LocalDate.of(2021, 8, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_SUCCESS)
+ }
+
+ @Test
+ fun verifyAttestation_returnsSuccessLocalPatchOlderThanOneYear() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, trustAnchors, false, LocalDate.of(2022, 2, 1),
+ LocalDate.of(2021, 1, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_SUCCESS)
+ }
+
+ @Test
+ fun verifyAttestation_returnsSuccessTypePublicKey() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, trustAnchors, false, LocalDate.of(2022, 2, 1),
+ LocalDate.of(2021, 8, 1))
+
+ val leafCert =
+ (TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToCerts() as List)[0]
+ as X509Certificate
+ val pkRequirements = Bundle()
+ pkRequirements.putByteArray(PARAM_PUBLIC_KEY, leafCert.publicKey.encoded)
+
+ val result = verifier.verifyAttestation(
+ TYPE_PUBLIC_KEY, pkRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_SUCCESS)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailurePatchDateNotWithinOneYearLocalPatch() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, trustAnchors, false, LocalDate.of(2023, 3, 1),
+ LocalDate.of(2023, 2, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureTrustedAnchorEmpty() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, HashSet(), false, LocalDate.of(2022, 1, 1),
+ LocalDate.of(2022, 1, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_FAILURE)
+ }
+
+ @Test
+ fun verifyAttestation_returnsFailureTrustedAnchorMismatch() {
+ val badTrustAnchorsCerts = TEST_ATTESTATION_CERT_FILENAME.fromPEMFileToCerts()
+ val badTrustAnchors = HashSet<TrustAnchor>()
+ badTrustAnchorsCerts.forEach {
+ badTrustAnchors.add(TrustAnchor(it as X509Certificate, null))
+ }
+
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, badTrustAnchors, false, LocalDate.of(2022, 1, 1),
+ LocalDate.of(2022, 1, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "player456".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_FAILURE)
+ }
+
+ fun verifyAttestation_returnsFailureChallenge() {
+ val verifier = AttestationVerificationPeerDeviceVerifier(
+ context, trustAnchors, false, LocalDate.of(2022, 1, 1),
+ LocalDate.of(2022, 1, 1))
+ val challengeRequirements = Bundle()
+ challengeRequirements.putByteArray(PARAM_CHALLENGE, "wrong".encodeToByteArray())
+
+ val result = verifier.verifyAttestation(TYPE_CHALLENGE, challengeRequirements,
+ TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME.fromPEMFileToByteArray())
+ assertThat(result).isEqualTo(RESULT_FAILURE)
+ }
+
+ private fun String.fromPEMFileToCerts(): Collection<Certificate> {
+ return certificateFactory.generateCertificates(
+ InstrumentationRegistry.getInstrumentation().getContext().getResources().getAssets()
+ .open(this))
+ }
+
+ private fun String.fromPEMFileToByteArray(): ByteArray {
+ val certs = this.fromPEMFileToCerts()
+ val bos = ByteArrayOutputStream()
+ certs.forEach {
+ bos.write(it.encoded)
+ }
+ return bos.toByteArray()
+ }
+
+ class TestActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ }
+ }
+
+ companion object {
+ private const val TEST_ROOT_CERT_FILENAME = "test_root_certs.pem"
+ private const val TEST_ATTESTATION_WITH_ROOT_CERT_FILENAME =
+ "test_attestation_with_root_certs.pem"
+ private const val TEST_ATTESTATION_CERT_FILENAME = "test_attestation_wrong_root_certs.pem"
+ }
+}