diff options
378 files changed, 7955 insertions, 7684 deletions
diff --git a/Android.bp b/Android.bp index 933d1aff842b..55239868da78 100644 --- a/Android.bp +++ b/Android.bp @@ -132,7 +132,6 @@ filegroup { ":installd_aidl", ":libaudioclient_aidl", ":libbinder_aidl", - ":libbluetooth-binder-aidl", ":libcamera_client_aidl", ":libcamera_client_framework_aidl", ":libupdate_engine_aidl", @@ -273,7 +272,6 @@ java_defaults { 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 @@ java_defaults { "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 @@ java_library { 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 @@ stubs_defaults { "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 @@ stubs_defaults { 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 ba31161009b6..5b7c125ed46b 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -79,6 +79,7 @@ stubs_defaults { ":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 2b0a833e1d1f..ee0f9e8f9658 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.annotation.UserIdInt; 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 final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { + "bgJobCountInMaxPeriod=" + bgJobCountInMaxPeriod + ", " + "sessionCountInWindow=" + sessionCountInWindow + ", " + "inQuotaTime=" + inQuotaTimeElapsed + ", " - + "inQuotaTimeLow=" + inQuotaTimeLowElapsed + ", " - + "inQuotaTimeMin=" + inQuotaTimeMinElapsed + ", " + "rateLimitJobCountExpirationTime=" + jobRateLimitExpirationTimeElapsed + ", " + "rateLimitJobCountWindow=" + jobCountInRateLimitingWindow + ", " + "rateLimitSessionCountExpirationTime=" @@ -385,24 +360,6 @@ public final class QuotaController extends StateController { */ 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { @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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { * 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { /** * 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 @@ public final class QuotaController extends StateController { // 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName); } scheduleCutoff(); - } else if (mRegularJobTimer && priorityLowered) { - rescheduleCutoff(); } } } @@ -2196,19 +2043,6 @@ public final class QuotaController extends StateController { && !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 @@ public final class QuotaController extends StateController { } 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { 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 @@ public final class QuotaController extends StateController { .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 @@ public final class QuotaController extends StateController { } @VisibleForTesting - float getAllowedTimeSurplusPriorityLow() { - return mAllowedTimeSurplusPriorityLow; - } - - @VisibleForTesting - float getAllowedTimeSurplusPriorityMin() { - return mAllowedTimeSurplusPriorityMin; - } - - @VisibleForTesting @NonNull int[] getBucketMaxJobCounts() { return mMaxBucketJobCounts; diff --git a/api/Android.bp b/api/Android.bp index 8370c1069710..9e377a01a498 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -109,6 +109,7 @@ combined_apis { "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 5e5f60ee993f..94bccaaa8250 100644 --- a/api/api.go +++ b/api/api.go @@ -203,8 +203,6 @@ func createMergedSystemStubs(ctx android.LoadHookContext, modules []string) { 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 aa225322af1d..90c3b9c467f2 100644 --- a/boot/Android.bp +++ b/boot/Android.bp @@ -48,6 +48,10 @@ platform_bootclasspath { // 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 @@ platform_bootclasspath { 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 e346ebf827ae..d3b5be906c74 100644 --- a/boot/hiddenapi/hiddenapi-max-target-o.txt +++ b/boot/hiddenapi/hiddenapi-max-target-o.txt @@ -9733,2812 +9733,6 @@ Landroid/appwidget/PendingHostUpdate;->viewId:I 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 351e71dd9538..4a66a7cbfe7a 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 20d7cc01fe1d..dbc3b5102efe 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$Proxy;->updatePersistentConfiguration(Landroi 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 033afb676381..f6199137012f 100644 --- a/boot/hiddenapi/hiddenapi-unsupported.txt +++ b/boot/hiddenapi/hiddenapi-unsupported.txt @@ -62,19 +62,6 @@ Landroid/app/job/IJobService$Stub;-><init>()V 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 aa7d17119fbf..698c1ce93f70 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -3248,7 +3248,7 @@ package android.accessibilityservice { 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 @@ package android.app.admin { 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 @@ package android.content { 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 e04e79895e92..76cac5fa664a 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1088,8 +1088,8 @@ package android.app.admin { 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(); @@ -2823,11 +2823,14 @@ package android.companion.virtual { 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 @@ package android.companion.virtual { 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 @@ package android.content { 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 @@ package android.location { 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 @@ package android.location { 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 @@ package android.provider { 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 e64392b3b0c2..22637ca95b9c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1073,7 +1073,7 @@ package android.hardware { 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 @@ package android.view.autofill { 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 8af68d7c5762..530de0f3af6b 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -83,11 +83,13 @@ import java.util.List; * @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 @@ public class AccessibilityServiceInfo implements Parcelable { 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 @@ public class AccessibilityServiceInfo implements Parcelable { } 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 @@ public class AccessibilityServiceInfo implements Parcelable { } /** - * 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 @@ public class AccessibilityServiceInfo implements Parcelable { parcel.writeInt(mHtmlDescriptionRes); parcel.writeString(mNonLocalizedDescription); parcel.writeBoolean(mIsAccessibilityTool); - parcel.writeString(mTileServiceClassName); + parcel.writeString(mTileServiceName); parcel.writeInt(mIntroResId); } @@ -1170,7 +1172,7 @@ public class AccessibilityServiceInfo implements Parcelable { mHtmlDescriptionRes = parcel.readInt(); mNonLocalizedDescription = parcel.readString(); mIsAccessibilityTool = parcel.readBoolean(); - mTileServiceClassName = parcel.readString(); + mTileServiceName = parcel.readString(); mIntroResId = parcel.readInt(); } @@ -1224,7 +1226,7 @@ public class AccessibilityServiceInfo implements Parcelable { 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 9a732199ed82..4e6cfb358901 100644 --- a/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityShortcutInfo.java @@ -101,11 +101,11 @@ public final class AccessibilityShortcutInfo { 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 @@ public final class AccessibilityShortcutInfo { 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 @@ public final class AccessibilityShortcutInfo { } /** - * 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 11663a52e6ae..bc979fc4af84 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -7416,7 +7416,6 @@ public class Activity extends ContextThemeWrapper } 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 61d186579f1b..64f0301fab22 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4469,12 +4469,6 @@ public final class ActivityThread extends ClientTransactionHandler // 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 9eb3e8fb0160..7c337a4319ca 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -29,14 +29,12 @@ import android.content.Intent; 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 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { @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 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } 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 490afc13ee97..ef9a2f273348 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -299,7 +299,7 @@ interface IActivityTaskManager { * 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 99a523a0e18a..cf259e577a5a 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -160,6 +160,13 @@ public final class LoadedApk { 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 @@ public final class LoadedApk { 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 @@ public final class LoadedApk { } 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 @@ public final class LoadedApk { 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 @@ public final class LoadedApk { } 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/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index b8f67e042e63..b944468f10b1 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -132,11 +132,11 @@ import java.util.List; 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 @@ public class DevicePolicyManager { * 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 @@ -15215,7 +15215,7 @@ public class DevicePolicyManager { * * <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 class DevicePolicyManager { 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 @@ public class DevicePolicyManager { @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 @@ public class DevicePolicyManager { } /** - * 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 @@ public class DevicePolicyManager { @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 @@ public class DevicePolicyManager { } /** - * 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 @@ public class DevicePolicyManager { @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 @@ public class DevicePolicyManager { } /** - * 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 @@ public class DevicePolicyManager { } /** - * 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 @@ public class DevicePolicyManager { @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 @@ public class DevicePolicyManager { } /** - * 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 @@ public class DevicePolicyManager { @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/ParcelableResource.java b/core/java/android/app/admin/ParcelableResource.java index 0b1b166add40..bcae2846ad42 100644 --- a/core/java/android/app/admin/ParcelableResource.java +++ b/core/java/android/app/admin/ParcelableResource.java @@ -39,7 +39,7 @@ import java.io.IOException; 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 final class ParcelableResource implements Parcelable { 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 @@ public final class ParcelableResource implements Parcelable { @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 @@ public final class ParcelableResource implements Parcelable { @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 @@ public final class ParcelableResource implements Parcelable { * 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 45d0ad51da04..41b1a1feae80 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -20,9 +20,7 @@ import static android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY; 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 final class VirtualDeviceParams implements Parcelable { */ 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 @@ public final class VirtualDeviceParams implements Parcelable { 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 @@ public final class VirtualDeviceParams implements Parcelable { * * @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 @@ public final class VirtualDeviceParams implements Parcelable { * * @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 @@ public final class VirtualDeviceParams implements Parcelable { dest.writeArraySet(mUsersWithMatchingAccounts); dest.writeArraySet(mAllowedActivities); dest.writeArraySet(mBlockedActivities); + dest.writeInt(mDefaultActivityPolicy); } @Override @@ -164,12 +196,15 @@ public final class VirtualDeviceParams implements Parcelable { 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 @@ public final class VirtualDeviceParams implements Parcelable { + " mUsersWithMatchingAccounts=" + mUsersWithMatchingAccounts + " mAllowedActivities=" + mAllowedActivities + " mBlockedActivities=" + mBlockedActivities + + " mDefaultActivityPolicy=" + mDefaultActivityPolicy + ")"; } @@ -202,8 +238,11 @@ public final class VirtualDeviceParams implements Parcelable { 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 @@ public final class VirtualDeviceParams implements Parcelable { } /** - * 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 @@ public final class VirtualDeviceParams implements Parcelable { 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 8f82a0ae71e5..2bda020192d5 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3571,11 +3571,11 @@ public abstract class Context { * <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 @@ public abstract class Context { @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 @@ public abstract class Context { * @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 @@ public abstract class Context { } /** - * 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 0aa25ef97dd0..478befd9c26d 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2054,7 +2054,7 @@ public class Intent implements Parcelable, Cloneable { "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 @@ public class Intent implements Parcelable, Cloneable { * <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 a3cc01c0adfb..0460e5831e33 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -136,9 +136,9 @@ public final class SensorPrivacyManager { 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 @@ public final class SensorPrivacyManager { DIALOG, SHELL, OTHER, - SAFETY_HUB + SAFETY_CENTER }) @Retention(RetentionPolicy.SOURCE) public @interface Source {} @@ -652,7 +652,7 @@ public final class SensorPrivacyManager { 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 944b71700450..a3b836adfc8b 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -674,10 +674,12 @@ public class RecoverySystem { } 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 87f4489e30f8..afd12835283b 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -407,6 +407,13 @@ public final class DeviceConfig { 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 @@ public final class DeviceConfig { @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 528156fb8f4e..8feff16c70a2 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9948,6 +9948,14 @@ public final class Settings { 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 @@ public final class Settings { "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 542de3fad8b0..c1fcd664f6fa 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -239,8 +239,10 @@ public class TelephonyRegistryManager { * @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 @@ public class TelephonyRegistryManager { } 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 632af2315bcd..64f5668d8c14 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -248,6 +248,7 @@ public final class SurfaceControl implements Parcelable { 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 @@ public final class SurfaceControl implements Parcelable { 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 @@ public final class SurfaceControl implements Parcelable { } /** + * 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 @@ public final class SurfaceControl implements Parcelable { } /** + * @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 1a458ce5c8ba..55300b3fec36 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -133,9 +133,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mBlastBufferQueue = null; } - Transaction transaction = new Transaction(); + final Transaction transaction = new Transaction(); if (mSurfaceControl != null) { transaction.remove(mSurfaceControl); mSurfaceControl = null; @@ -790,22 +783,18 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mScreenRect.bottom, mSurfaceWidth, mSurfaceHeight)); } } - mTmpTransaction.merge(geometryTransaction); - mTmpTransaction.apply(); + applyTransactionOnVriDraw(surfaceUpdateTransaction); updateEmbeddedAccessibilityMatrix(); mSurfaceFrame.left = 0; @@ -990,17 +982,17 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mBlastSurfaceControl.setTransformHint(mTransformHint); if (mBlastBufferQueue != null) { mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, - mFormat, transaction); + mFormat); } } @@ -1136,7 +1128,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * */ 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall .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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * * @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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } } - 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 - && !mPendingTransaction) { - 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)); } - 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); + 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); } + applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); + } catch (Exception ex) { + Log.e(TAG, "Exception from repositionChild", ex); } } @@ -1319,7 +1302,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall 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 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * @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 1566f9e50f66..785735c2b1e1 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -184,6 +184,7 @@ public final class ThreadedRenderer extends HardwareRenderer { */ 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 34a13868f4d7..553c537d9b95 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8226,9 +8226,25 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } // 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 cd8dd86b8e02..7e16531663d5 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -592,6 +592,11 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par /** * 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 b7994db0cb28..a8cc114c4d69 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -58,6 +58,7 @@ import android.os.Looper; 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 final class AutofillManager { 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 final class AutofillManager { */ 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 @@ public final class AutofillManager { @Nullable private List<AutofillId> mFillDialogTriggerIds; + private final boolean mIsFillDialogEnabled; + /** @hide */ public interface AutofillClient { /** @@ -795,6 +807,14 @@ public final class AutofillManager { 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 @@ public final class AutofillManager { } private boolean hasFillDialogUiFeature() { - return HAS_FILL_DIALOG_UI_FEATURE; + return mIsFillDialogEnabled; } /** @@ -3012,6 +3032,7 @@ public final class AutofillManager { } 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 9712311aab7c..e4f483a29343 100644 --- a/core/java/android/widget/inline/InlineContentView.java +++ b/core/java/android/widget/inline/InlineContentView.java @@ -230,8 +230,9 @@ public class InlineContentView extends ViewGroup { 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 @@ public class InlineContentView extends ViewGroup { 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 4de977a91d05..cdbd0789a9c9 100644 --- a/core/java/android/window/ProxyOnBackInvokedDispatcher.java +++ b/core/java/android/window/ProxyOnBackInvokedDispatcher.java @@ -81,6 +81,10 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher { } 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 4745220e6e56..346aa3336c12 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -571,6 +571,24 @@ public final class WindowContainerTransaction implements Parcelable { } /** + * 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 final class WindowContainerTransaction implements Parcelable { 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/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index 4f13a9cf257e..3be0eb88a91f 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -35,9 +35,10 @@ static struct { 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 nativeSetSyncTransaction(JNIEnv* env, jclass clazz, jlong ptr, jlong } 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 jobject nativeGatherPendingTransactions(JNIEnv* env, jclass clazz, jlong 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 fb5b5ffaac48..68025a8ba0e4 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 @@ static void nativeSanitize(JNIEnv* env, jclass clazz, jlong transactionObj) { 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 @@ static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) { 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 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (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 @@ static const JNINativeMethod sSurfaceControlMethods[] = { {"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 97870a16da2b..9359528b613b 100644 --- a/core/proto/android/hardware/sensorprivacy.proto +++ b/core/proto/android/hardware/sensorprivacy.proto @@ -128,7 +128,7 @@ message SensorPrivacyToggleSourceProto { 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 689d37c91920..da5f8998d156 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 bccd2b6529ac..29eb0c0365b3 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 60a3398c93e6..e543034b6974 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 ce5660f433ff..ff7313ed1b4d 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 f605a0075e8a..eebc5789e935 100644 --- a/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java +++ b/core/tests/coretests/src/android/accessibilityservice/AccessibilityShortcutInfoTest.java @@ -129,7 +129,7 @@ public class AccessibilityShortcutInfoTest { @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 d66cb712b1ca..0e09d563c884 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 android.media.AudioFormat.ENCODING_PCM_16BIT; 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 @@ public class VirtualAudioSessionTest { mVirtualAudioSession.onPlaybackConfigChanged(configs); - verify(mCallback).onPlaybackConfigChanged(configs); + verify(mCallback, timeout(2000)).onPlaybackConfigChanged(configs); } @Test @@ -177,6 +178,6 @@ public class VirtualAudioSessionTest { 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 177965534b18..ed8986993ab0 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 2678c79d1454..369f20fb52a7 100644 --- a/graphics/java/android/graphics/BLASTBufferQueue.java +++ b/graphics/java/android/graphics/BLASTBufferQueue.java @@ -27,13 +27,13 @@ public final class BLASTBufferQueue { // 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 @@ public final class BLASTBufferQueue { /** 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 @@ public final class BLASTBufferQueue { * @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 02cdeef77bec..4b367e0e5b4b 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -1117,6 +1117,7 @@ public final class KeyChain { 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 f140c68b19db..f3e15084d730 100644 --- a/location/java/android/location/SatellitePvt.java +++ b/location/java/android/location/SatellitePvt.java @@ -144,8 +144,8 @@ public final class SatellitePvt implements Parcelable { 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 @@ public final class SatellitePvt implements Parcelable { @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 @@ public final class SatellitePvt implements Parcelable { mClockInfo = clockInfo; mIonoDelayMeters = ionoDelayMeters; mTropoDelayMeters = tropoDelayMeters; - mTimeOfClock = timeOfClock; - mTimeOfEphemeris = timeOfEphemeris; + mTimeOfClockSeconds = timeOfClockSeconds; + mTimeOfEphemerisSeconds = timeOfEphemerisSeconds; mIssueOfDataClock = issueOfDataClock; mIssueOfDataEphemeris = issueOfDataEphemeris; mEphemerisSource = ephemerisSource; @@ -545,31 +545,31 @@ public final class SatellitePvt implements Parcelable { } /** - * 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 @@ public final class SatellitePvt implements Parcelable { 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 @@ public final class SatellitePvt implements Parcelable { 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 @@ public final class SatellitePvt implements Parcelable { + ", ClockInfo=" + mClockInfo + ", IonoDelayMeters=" + mIonoDelayMeters + ", TropoDelayMeters=" + mTropoDelayMeters - + ", TimeOfClock=" + mTimeOfClock - + ", TimeOfEphemeris=" + mTimeOfEphemeris + + ", TimeOfClockSeconds=" + mTimeOfClockSeconds + + ", TimeOfEphemerisSeconds=" + mTimeOfEphemerisSeconds + ", IssueOfDataClock=" + mIssueOfDataClock + ", IssueOfDataEphemeris=" + mIssueOfDataEphemeris + ", EphemerisSource=" + mEphemerisSource @@ -709,8 +709,8 @@ public final class SatellitePvt implements Parcelable { @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 @@ public final class SatellitePvt implements Parcelable { * * <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 @@ public final class SatellitePvt implements Parcelable { * * <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 @@ public final class SatellitePvt implements Parcelable { @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 8e35ee96b691..c7673aa98797 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 @@ public class SecureSettings { 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 5f549fd05e1a..42aa2053e1a4 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 @@ public class SecureSettingsValidators { 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 4b1d00bb18e3..7f8b2f51754c 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 0da60f0b3d66..74b759fcdcf9 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 @@ class ActivityLaunchAnimator( 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 6352f81b4474..c97ebe8d5559 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 Binary files differnew file mode 100644 index 000000000000..2c2f94ebe750 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/dream_preview_back_arrow.png diff --git a/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png b/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png Binary files differnew file mode 100644 index 000000000000..881b9afdc3d2 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/dream_preview_back_arrow.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png b/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png Binary files differnew file mode 100644 index 000000000000..6063b42ef221 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/dream_preview_back_arrow.png 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 e456e2965d21..000000000000 --- 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 37b8365996fd..ca5c4996cddb 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 813787e8f9d0..1cbc3c284874 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 d4e98e217213..000000000000 --- 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 a6f1638a1d89..000000000000 --- 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 b9e39dae13dc..000000000000 --- 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 a5fdcd9e2671..a502d33a0be1 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 88feacd9bbd9..5e8b892018eb 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 6bb6c2d9877c..0f2d372f7158 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 a3d9a69e73c5..60e840c0708b 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 01eb09b659f2..c386a3e684a9 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-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml index c37c804caaa8..8a4516aaa49f 100644 --- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -42,4 +42,8 @@ the shade (in alpha) --> <dimen name="lockscreen_shade_scrim_transition_distance">200dp</dimen> + <!-- Distance that the full shade transition takes in order for media to fully transition to + the shade --> + <dimen name="lockscreen_shade_media_transition_distance">200dp</dimen> + </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 178f93ae3c93..2de8324a506a 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 debf95b86c0c..92bc8642b75c 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 df16b0d45228..6ec6c2384962 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 b3983d276dcb..e743c4e5a83d 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 @@ interface ISystemUiProxy { /** * Get the secondary split screen app's rectangle when not minimized. + * @deprecated */ Rect getNonMinimizedSplitScreenSecondaryBounds() = 7; @@ -104,6 +105,7 @@ interface ISystemUiProxy { /** * 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 0241c593b850..000000000000 --- 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 51c1b5aa13d7..000000000000 --- 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 0c7e56e0715e..0f937bdfe449 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 class ActivityCompat { 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 48fcbbda7e46..461c2dc2c2af 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 @@ public class ActivityManagerWrapper { * 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 e2ca349cc5c8..db62f88325dc 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 @@ public abstract class ActivityOptionsCompat { 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 0b1141ee9b30..000000000000 --- 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/DockedStackListenerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/DockedStackListenerCompat.java deleted file mode 100644 index bb319e625b44..000000000000 --- 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 a8c19ec24124..e6ae19eebc72 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 @@ import com.android.internal.util.LatencyTracker; * @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 d24c779b1416..000000000000 --- 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 a51d668c8224..000000000000 --- 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 952c8aee2408..000000000000 --- 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 ace793892473..98e48f64e9e6 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 @@ public class RemoteTransitionCompat implements Parcelable { // 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 @@ public class RemoteTransitionCompat implements Parcelable { && 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 @@ public class RemoteTransitionCompat implements Parcelable { } 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 @@ public class RemoteTransitionCompat implements Parcelable { 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 @@ public class RemoteTransitionCompat implements Parcelable { 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 @@ public class RemoteTransitionCompat implements Parcelable { mFinishCB = finishCB; mPausingTasks = pausingTasks; mPipTask = pipTask; + mRecentsTask = recentsTask; mLeashMap = leashMap; mTransition = transition; } @@ -329,6 +336,9 @@ public class RemoteTransitionCompat implements Parcelable { 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 7c8c23eba73b..000000000000 --- 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 35952f55ec1e..000000000000 --- 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 ffd8a08905f0..000000000000 --- 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 4a0f89b7dc7d..000000000000 --- 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 89c60f1d3f06..000000000000 --- 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 73dc60dbc7da..000000000000 --- 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 1f194eca816f..000000000000 --- 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 f6fe1ede9ce0..a50d852e9b36 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.Sensor 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 @@ internal class HingeSensorAngleProvider(private val sensorManager: SensorManager 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 848b8ab8ff84..1ede76fb1fa4 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.hardware.display.DisplayManager; 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 @@ public class KeyguardDisplayManager { @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 @@ public class KeyguardDisplayManager { @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 122f3d7f23f1..295d77d55b56 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java @@ -24,9 +24,9 @@ import androidx.annotation.Nullable; 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 @@ public interface KeyguardViewController { // 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 4ad51835687f..370686a1e682 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.FalsingManager; 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 @@ import javax.inject.Inject; * 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 207ac2852f2f..8dbe5e00ab7e 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 java.lang.annotation.Retention; 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 ba0642f57a88..f498ef3466ef 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 java.lang.annotation.Retention; 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 880822aa7343..aeae8e3d4b27 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 java.lang.annotation.Retention; 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 cc166c210078..5bd620e873b0 100644 --- a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java @@ -23,7 +23,7 @@ import androidx.annotation.Nullable; 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 @@ import dagger.Lazy; /** * 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 ec11065682ff..3a6165c03e24 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.DumpableContainer; 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 @@ public class SystemUIApplication extends Application implements // 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 881e6a917a45..bd8e44ceab80 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.dagger.SysUISingleton; 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 @@ public class SystemActions extends CoreStartable { 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 @@ public class SystemActions extends CoreStartable { @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 @@ public class SystemActions extends CoreStartable { // NotificationShadeWindowController.registerCallback() only keeps weak references. mNotificationShadeCallback = (keyguardShowing, keyguardOccluded, bouncerShowing, mDozing) -> registerOrUnregisterDismissNotificationShadeAction(); - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; } @Override @@ -311,9 +311,10 @@ public class SystemActions extends CoreStartable { // 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 @@ public class SystemActions extends CoreStartable { } 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 @@ public class SystemActions extends CoreStartable { } 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 aedaf968ac7d..dfff00b90ef2 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.PackageManagerWrapper; 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 @@ public final class PhoneStateMonitor { }; 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 @@ public final class PhoneStateMonitor { @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 @@ public final class PhoneStateMonitor { } 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 f82ea790bb64..99f27d7f48e7 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.Command 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 @@ import javax.inject.Provider * 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 @@ class AuthRippleController @Inject constructor( 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 @@ class AuthRippleController @Inject constructor( 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 @@ class AuthRippleController @Inject constructor( } 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 @@ class AuthRippleController @Inject constructor( 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 7204a15233b0..7efdd1a8b949 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 androidx.asynclayoutinflater.view.AsyncLayoutInflater; 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 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { 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 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { 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 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { 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 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { 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 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { 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 24a655c2856d..5ac21ff42f4f 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 @@ package com.android.systemui.biometrics; 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.dump.DumpManager; 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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud 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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud mKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor); mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(this); - mUnlockedScreenOffAnimationController.addCallback(mUnlockedScreenOffCallback); mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener); } @@ -161,7 +175,6 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud if (mLockScreenShadeTransitionController.getUdfpsKeyguardViewController() == this) { mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(null); } - mUnlockedScreenOffAnimationController.removeCallback(mUnlockedScreenOffCallback); mActivityLaunchAnimator.removeListener(mActivityLaunchAnimatorListener); } @@ -179,6 +192,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud pw.println("mUdfpsRequested=" + mUdfpsRequested); pw.println("mView.mUdfpsRequested=" + mView.mUdfpsRequested); pw.println("mLaunchTransitionFadingAway=" + mLaunchTransitionFadingAway); + pw.println("mLastDozeAmount=" + mLastDozeAmount); } /** @@ -239,7 +253,11 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud 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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud 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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud 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 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud } }; - 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 f87fa96dea65..5c1d8c3929cb 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.Context 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.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.settings.SecureSettings import com.android.wm.shell.TaskViewFactory import java.util.Optional import javax.inject.Inject @@ -51,19 +56,41 @@ class ControlActionCoordinatorImpl @Inject constructor( 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 @@ class ControlActionCoordinatorImpl @Inject constructor( }, true /* blockable */ ), - isAuthRequired(cvh) + isAuthRequired(cvh, mAllowTrivialControls) ) } @@ -100,7 +127,7 @@ class ControlActionCoordinatorImpl @Inject constructor( }, blockable ), - isAuthRequired(cvh) + isAuthRequired(cvh, mAllowTrivialControls) ) } @@ -120,7 +147,7 @@ class ControlActionCoordinatorImpl @Inject constructor( { cvh.action(FloatAction(templateId, newValue)) }, false /* blockable */ ), - isAuthRequired(cvh) + isAuthRequired(cvh, mAllowTrivialControls) ) } @@ -139,7 +166,7 @@ class ControlActionCoordinatorImpl @Inject constructor( }, false /* blockable */ ), - isAuthRequired(cvh) + isAuthRequired(cvh, mAllowTrivialControls) ) } @@ -156,7 +183,11 @@ class ControlActionCoordinatorImpl @Inject constructor( 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 b32f8786899a..2f041acb649d 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 @@ package com.android.systemui.dagger; 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 @@ import dagger.Module; */ @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 a4da6b422bde..5d154c3b4f6b 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.CommandQueue; 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 @@ import dagger.Provides; 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 13067bf71165..27993010c917 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.ExpandableNotifica 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 @@ import dagger.Provides; WalletModule.class }, subcomponents = { - StatusBarComponent.class, + CentralSurfacesComponent.class, NotificationRowComponent.class, DozeComponent.class, ExpandableNotificationRowComponent.class, @@ -175,7 +175,7 @@ public abstract class SystemUIModule { 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 2beed4c6a7e7..d89c0be26351 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 @@ public interface DozeHost { boolean isPowerSaveActive(); boolean isPulsingBlocked(); boolean isProvisioned(); - boolean isBlockingDoze(); /** * Makes a current pulse last for twice as long. @@ -80,8 +79,9 @@ public interface DozeHost { */ 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 @@ public interface DozeHost { */ 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 25115200ba19..0a2e69f943c6 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 @@ public class DozeLog implements Dumpable { } /** - * 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 @@ public class DozeLog implements Dumpable { } /** - * 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 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 sreen brightness to logs + * 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 4ba6b51c83c8..f3f6be210fed 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 @@ class DozeLogger @Inject constructor( }) } - 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 @@ class DozeLogger @Inject constructor( }) } - 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 789ad6223e79..ae01f0ad84c7 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 @@ public class DozeMachine { 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 @@ public class DozeMachine { 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 000000000000..31d43b5475e0 --- /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 8bff3ba0b6ba..74044e2c2eb8 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 @@ public class DozeTriggers implements DozeMachine.Part { 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 @@ public class DozeTriggers implements DozeMachine.Part { 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 @@ public class DozeTriggers implements DozeMachine.Part { mDozeLog.tracePulseDropped("pulseOnNotificationsDisabled"); return; } - if (mDozeHost.isDozeSuppressed()) { + if (mDozeHost.isAlwaysOnSuppressed()) { runIfNotNull(onPulseSuppressedListener); mDozeLog.tracePulseDropped("dozeSuppressed"); return; @@ -456,10 +451,9 @@ public class DozeTriggers implements DozeMachine.Part { 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 @@ public class DozeTriggers implements DozeMachine.Part { } } - - 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 @@ public class DozeTriggers implements DozeMachine.Part { 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 @@ public class DozeTriggers implements DozeMachine.Part { 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 class DozeTriggers implements DozeMachine.Part { 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 745010372182..3d3e4a492871 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 @@ package com.android.systemui.dreams; 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 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve // 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 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve @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 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve mHandler = handler; mMaxBurnInOffset = maxBurnInOffset; mBurnInProtectionUpdateInterval = burnInProtectionUpdateInterval; + mMillisUntilFullJitter = millisUntilFullJitter; } @Override @@ -96,6 +105,7 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve @Override protected void onViewAttached() { + mJitterStartTimeMillis = System.currentTimeMillis(); mHandler.postDelayed(this::updateBurnInOffsets, mBurnInProtectionUpdateInterval); } @@ -114,13 +124,24 @@ public class DreamOverlayContainerViewController extends ViewController<DreamOve } 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 2d969206b468..d2ab61149d26 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 @@ public class DreamOverlayStatusBarView extends ConstraintLayout { 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)); + } + + 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); } - /** - * 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); + 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 32b2309ee83b..a25a7423770e 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 @@ import javax.inject.Inject; */ @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 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve @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() { + updateNotificationsStatusIcon(); + mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback); + updateWifiUnavailableStatusIcon(); + + mNextAlarmController.addCallback(mNextAlarmCallback); + updateAlarmStatusIcon(); + + mSensorPrivacyController.addCallback(mSensorCallback); + updateMicCameraBlockedStatusIcon(); + + mZenModeController.addCallback(mZenModeCallback); + updatePriorityModeStatusIcon(); - NetworkCapabilities capabilities = - mConnectivityManager.getNetworkCapabilities( - mConnectivityManager.getActiveNetwork()); - onWifiAvailabilityChanged( - capabilities != null - && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)); 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 23343b17232f..cc2e57128204 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.DreamPreviewCompli 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 @@ public class DreamPreviewComplication implements Complication { 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 63676d629cb9..4fe1622d73a5 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 abstract class DreamOverlayModule { 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 @@ public abstract class DreamOverlayModule { 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 d16c8c8c59d6..e140f6b0faa2 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_ 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 android.view.VelocityTracker; 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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { 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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { 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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { // 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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @Inject public BouncerSwipeTouchHandler( + DisplayMetrics displayMetrics, StatusBarKeyguardViewManager statusBarKeyguardViewManager, - StatusBar statusBar, + CentralSurfaces centralSurfaces, NotificationShadeWindowController notificationShadeWindowController, ValueAnimatorCreator valueAnimatorCreator, VelocityTrackerFactory velocityTrackerFactory, @@ -165,7 +139,8 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } @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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { 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 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { if (expansion == KeyguardBouncer.EXPANSION_HIDDEN) { mStatusBarKeyguardViewManager.reset(false); } - mTouchSession.pop(); break; default: mVelocityTracker.addMovement(motionEvent); @@ -255,7 +246,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } 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 3e5efb2115a0..695b59ac45ad 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.android.systemui.shared.system.InputChannelCompat; 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 @@ public class DreamOverlayTouchMonitor { }); } + 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 @@ public class DreamOverlayTouchMonitor { return mTouchMonitor.pop(this); } + @Override + public int getActiveSessionCount() { + return mTouchMonitor.getSessionCount(); + } + /** * Returns the active listeners to receive touch events. */ @@ -229,12 +240,39 @@ public class DreamOverlayTouchMonitor { 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 c73ff733854d..20008d5b02c8 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 @@ public interface DreamTouchHandler { * 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 677990437f3d..0c5f7ebb6e16 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 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { // 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 e746cafb5ea0..74d5bd577cf4 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.Inject; 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 e3886cd80a42..7a278f786a67 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.plugins.GlobalActionsPanelPlugin; 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene RingerModeTracker ringerModeTracker, @Main Handler handler, PackageManager packageManager, - Optional<StatusBar> statusBarOptional, + Optional<CentralSurfaces> centralSurfacesOptional, KeyguardUpdateMonitor keyguardUpdateMonitor, DialogLaunchAnimator dialogLaunchAnimator) { mContext = context; @@ -374,7 +374,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mRingerModeTracker = ringerModeTracker; mMainHandler = handler; mSmallestScreenWidthDp = resources.getConfiguration().smallestScreenWidthDp; - mStatusBarOptional = statusBarOptional; + mCentralSurfacesOptional = centralSurfacesOptional; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDialogLaunchAnimator = dialogLaunchAnimator; @@ -426,8 +426,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene return mUiEventLogger; } - protected Optional<StatusBar> getStatusBar() { - return mStatusBarOptional; + protected Optional<CentralSurfaces> getCentralSurfaces() { + return mCentralSurfacesOptional; } protected KeyguardUpdateMonitor getKeyguardUpdateMonitor() { @@ -675,7 +675,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mIActivityManager.requestInteractiveBugReport(); } // Close shade so user sees the activity - mStatusBarOptional.ifPresent(StatusBar::collapseShade); + mCentralSurfacesOptional.ifPresent(CentralSurfaces::collapseShade); } catch (RemoteException e) { } } @@ -1018,7 +1018,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mOnRefreshCallback = onRefreshCallback; mKeyguardShowing = keyguardShowing; mUiEventLogger = uiEventLogger; - mStatusBarOptional = statusBarOptional; + mCentralSurfacesOptional = centralSurfacesOptional; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mGestureDetector = new GestureDetector(mContext, mGestureListener); @@ -2262,14 +2263,14 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene 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 32b58c2d1bca..822b1cfdf877 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 @@ package com.android.systemui.keyguard; 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 @@ public class KeyguardLifecyclesDispatcher { 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 @@ public class KeyguardLifecyclesDispatcher { 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 @@ public class KeyguardLifecyclesDispatcher { } } }); + 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 ae7147ecae03..07dfa33620a0 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.DozeParameters; 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 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable, } /** - * 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 195ef1a84c43..c69f947f5f3f 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.plugins.statusbar.StatusBarStateController; 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.Module; 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 7b850504421d..fab06c288ce1 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -550,12 +550,12 @@ class MediaDataManager( // 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_ALBUM_ART) + artworkBitmap = metadata?.getBitmap(MediaMetadata.METADATA_KEY_ART) } - if (artworkBitmap == null && metadata != null) { - artworkBitmap = loadBitmapFromUri(metadata) + if (artworkBitmap == null) { + artworkBitmap = metadata?.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART) } val artWorkIcon = if (artworkBitmap == null) { notif.getLargeIcon() diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index eee39552bcc8..c6f716ca7ac4 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 @@ class MediaHierarchyManager @Inject constructor( * @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 } /** @@ -795,6 +799,9 @@ class MediaHierarchyManager @Inject constructor( @TransformationType fun calculateTransformationType(): Int { if (isTransitioningToFullShade) { + if (inSplitShade) { + return TRANSFORMATION_TYPE_TRANSITION + } return TRANSFORMATION_TYPE_FADE } if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS || @@ -961,6 +968,7 @@ class MediaHierarchyManager @Inject constructor( (qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS qsExpansion > 0.4f && onLockscreen -> LOCATION_QS !hasActiveMedia -> LOCATION_QS + onLockscreen && isSplitShadeExpanding() -> LOCATION_QS onLockscreen && isTransformingToFullShadeAndInQQS() -> LOCATION_QQS onLockscreen && allowedOnLockscreen -> LOCATION_LOCKSCREEN else -> LOCATION_QQS @@ -986,6 +994,10 @@ class MediaHierarchyManager @Inject constructor( return location } + private fun isSplitShadeExpanding(): Boolean { + return inSplitShade && isTransitioningToFullShade + } + /** * Are we currently transforming to the full shade and already in QQS */ @@ -993,6 +1005,10 @@ class MediaHierarchyManager @Inject constructor( if (!isTransitioningToFullShade) { return false } + if (inSplitShade) { + // Split shade doesn't use QQS. + return false + } return fullShadeTransitionProgress > 0.5f } @@ -1000,6 +1016,10 @@ class MediaHierarchyManager @Inject constructor( * Is the current transformationType fading */ private fun isCurrentlyFading(): Boolean { + if (isSplitShadeExpanding()) { + // Split shade always uses transition instead of fade. + return false + } if (isTransitioningToFullShade) { return true } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java index e2716e992c48..77873e829be3 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.TextPaint; 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 @@ public class MediaProjectionPermissionActivity extends Activity private int mUid; private IMediaProjectionManager mService; - private AlertDialog mDialog; + private SystemUIDialog mDialog; @Override public void onCreate(Bundle icicle) { @@ -143,25 +141,18 @@ public class MediaProjectionPermissionActivity extends Activity 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 6ec2b6e89cb0..15b8f13ee0f8 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.content.Context 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.R 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 @@ import com.android.systemui.util.concurrency.DelayableExecutor 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 @@ abstract class MediaTttChipControllerCommon<T : MediaTttChipState>( // 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 @@ abstract class MediaTttChipControllerCommon<T : MediaTttChipState>( 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 b6f1aea9a384..3d43ebe81742 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.media.taptotransfer.common.MediaTttChipControllerCom 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 @@ class MediaTttChipControllerReceiver @Inject constructor( 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 fef17fdcbbdc..180e4ee9726c 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.media.taptotransfer.common.MediaTttChipControllerCom 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 @@ class MediaTttChipControllerSender @Inject constructor( 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 5e9edb7c906e..a1a319814269 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.dump.DumpManager; 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 @@ public final class NavBarHelper implements 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 @@ public final class NavBarHelper implements 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 @@ public final class NavBarHelper implements mContentResolver = mContext.getContentResolver(); mAccessibilityManager = accessibilityManager; mAssistManagerLazy = assistManagerLazy; - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mUserTracker = userTracker; mSystemActions = systemActions; accessibilityManager.addAccessibilityServicesStateChangeListener( @@ -295,8 +294,8 @@ public final class NavBarHelper implements * {@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 a242df38b62f..3ab1216777e9 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_OPAQUE; 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.StatusBarState; 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mMetricsLogger = metricsLogger; mAssistManagerLazy = assistManagerLazy; mSysUiFlagsContainer = sysUiFlagsContainer; - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mShadeController = shadeController; mNotificationRemoteInputManager = notificationRemoteInputManager; mOverviewProxyService = overviewProxyService; @@ -522,7 +518,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; mPipOptional = pipOptional; - mSplitScreenOptional = splitScreenOptional; mRecentsOptional = recentsOptional; mBackAnimation = backAnimation; mHandler = mainHandler; @@ -616,7 +611,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater); - mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener); mPipOptional.ifPresent(mNavigationBarView::addPipExclusionBoundsChangeListener); mBackAnimation.ifPresent(mNavigationBarView::registerBackAnimation); @@ -788,10 +782,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, // 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, LatencyTracker.getInstance(mContext).onActionStart( LatencyTracker.ACTION_TOGGLE_RECENTS); } - mStatusBarOptionalLazy.get().ifPresent(StatusBar::awakenDreams); + mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::awakenDreams); mCommandQueue.toggleRecentApps(); } @@ -1326,7 +1318,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, return true; } else if (v.getId() == btnId2) { return btnId2 == R.id.recent_apps - ? onLongPressRecents() + ? false : onHomeLongClick( mNavigationBarView.getHomeButton().getCurrentView()); } @@ -1351,24 +1343,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 class NavigationBar implements View.OnAttachStateChangeListener, */ 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; mPipOptional = pipOptional; - mSplitScreenOptional = splitScreenOptional; mRecentsOptional = recentsOptional; - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mShadeController = shadeController; mNotificationRemoteInputManager = notificationRemoteInputManager; mNotificationShadeDepthController = notificationShadeDepthController; @@ -1740,7 +1712,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, 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 80a7a4ae2f6a..017bbdffdc4f 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.CommandQueue; 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 @@ public class NavigationBarView extends FrameLayout implements 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 @@ public class NavigationBarView extends FrameLayout implements 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 642af593c211..a7ed871b9fbb 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.R; 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 @@ public class PowerUI extends CoreStartable implements CommandQueue.Callbacks { 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 @@ public class PowerUI extends CoreStartable implements CommandQueue.Callbacks { 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 89735c3a547d..5d9361d201c1 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 @@ class FgsManagerController @Inject constructor( 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 217210a5dafc..27da6f3d2d2c 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.ViewController 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 @@ internal class FooterActionsController @Inject constructor( 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 @@ internal class FooterActionsController @Inject constructor( 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 @@ internal class FooterActionsController @Inject constructor( 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 @@ internal class FooterActionsController @Inject constructor( @VisibleForTesting public override fun onViewAttached() { + globalActionsDialog = globalActionsDialogProvider.get() if (showPMLiteButton) { powerMenuLite.visibility = View.VISIBLE powerMenuLite.setOnClickListener(onClickListener) @@ -215,6 +219,8 @@ internal class FooterActionsController @Inject constructor( } 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 8afb7933aacc..95b4b725e4c6 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 @@ class HeaderPrivacyIconsController @Inject constructor( // 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 @@ class HeaderPrivacyIconsController @Inject constructor( 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/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 3c7933f0d218..3ef72202a591 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -513,7 +513,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mContainer.setExpansion(expansion); final float translationScaleY = (mInSplitShade ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); - boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard; + boolean onKeyguard = isKeyguardState(); + boolean onKeyguardAndExpanded = onKeyguard && !mShowCollapsedOnKeyguard; if (!mHeaderAnimating && !headerWillBeAnimating()) { getView().setTranslationY( onKeyguardAndExpanded @@ -547,6 +548,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mHeader.updateResources(); } } + mQSPanelController.setIsOnKeyguard(onKeyguard); mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mQSFooterActionController.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mQSPanelController.setRevealExpansion(expansion); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 5126fcb4c34d..b04d75273831 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -110,6 +110,8 @@ public class QSPanel extends LinearLayout implements Tunable { private final ArrayMap<View, Integer> mChildrenLayoutTop = new ArrayMap<>(); private final Rect mClippingRect = new Rect(); private boolean mUseNewFooter = false; + private ViewGroup mMediaHostView; + private boolean mShouldMoveMediaOnExpansion = true; public QSPanel(Context context, AttributeSet attrs) { super(context, attrs); @@ -289,9 +291,15 @@ public class QSPanel extends LinearLayout implements Tunable { for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); if (move) { + int topOffset; + if (child == mMediaHostView && !mShouldMoveMediaOnExpansion) { + topOffset = 0; + } else { + topOffset = tileHeightOffset; + } int top = Objects.requireNonNull(mChildrenLayoutTop.get(child)); - child.setLeftTopRightBottom(child.getLeft(), top + tileHeightOffset, - child.getRight(), top + tileHeightOffset + child.getHeight()); + child.setLeftTopRightBottom(child.getLeft(), top + topOffset, + child.getRight(), top + topOffset + child.getHeight()); } if (child == mTileLayout) { move = true; @@ -463,6 +471,7 @@ public class QSPanel extends LinearLayout implements Tunable { if (!mUsingMediaPlayer) { return; } + mMediaHostView = hostView; ViewGroup newParent = horizontal ? mHorizontalLinearLayout : this; ViewGroup currentParent = (ViewGroup) hostView.getParent(); if (currentParent != newParent) { @@ -656,6 +665,19 @@ public class QSPanel extends LinearLayout implements Tunable { updatePadding(); } + /** + * Sets whether the media container should move during the expansion of the QS Panel. + * + * As the QS Panel expands and the QS unsquish, the views below the QS tiles move to adapt to + * the new height of the QS tiles. + * + * In some cases this might not be wanted for media. One example is when there is a transition + * animation of the media container happening on split shade lock screen. + */ + public void setShouldMoveMediaOnExpansion(boolean shouldMoveMediaOnExpansion) { + mShouldMoveMediaOnExpansion = shouldMoveMediaOnExpansion; + } + private class H extends Handler { private static final int ANNOUNCE_FOR_ACCESSIBILITY = 1; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 983412968e7d..00142799c541 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.internal.logging.nano.MetricsProto.MetricsEvent; 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 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { 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 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { 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 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { mFalsingManager = falsingManager; mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView); + mMediaFlags = mediaFlags; mView.setBrightnessView(mBrightnessSliderController.getRootView()); mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController); @@ -133,7 +138,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { } 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/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 3172aa9592dd..6572daa91269 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -419,6 +419,16 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr return mView.getBrightnessView(); } + /** Sets whether we are currently on lock screen. */ + public void setIsOnKeyguard(boolean isOnKeyguard) { + boolean isOnSplitShadeLockscreen = mShouldUseSplitNotificationShade && isOnKeyguard; + // When the split shade is expanding on lockscreen, the media container transitions from the + // lockscreen to QS. + // We have to prevent the media container position from moving during the transition to have + // a smooth translation animation without stuttering. + mView.setShouldMoveMediaOnExpansion(!isOnSplitShadeLockscreen); + } + /** */ public static final class TileRecord { public TileRecord(QSTile tile, com.android.systemui.plugins.qs.QSTileView tileView) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index c69307548b6e..47af7de9118d 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.qs.logging.QSLogger; 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 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D 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 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D Provider<AutoTileManager> autoTiles, DumpManager dumpManager, BroadcastDispatcher broadcastDispatcher, - Optional<StatusBar> statusBarOptional, + Optional<CentralSurfaces> centralSurfacesOptional, QSLogger qsLogger, UiEventLogger uiEventLogger, UserTracker userTracker, @@ -143,7 +143,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D 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 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D @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 597f7b7053a2..f389df097d7d 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 android.util.Log; 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 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { 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 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject - public OverviewProxyRecentsImpl(Lazy<Optional<StatusBar>> statusBarOptionalLazy) { - mStatusBarOptionalLazy = statusBarOptionalLazy; + public OverviewProxyRecentsImpl(Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy) { + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; } @Override @@ -109,9 +109,10 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { } }; // 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 6b251b070036..a3dea1c68b14 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.shared.system.QuickStepContract; 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 @@ public class OverviewProxyService extends CurrentUserTracker implements 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 @@ public class OverviewProxyService extends CurrentUserTracker implements @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 class OverviewProxyService extends CurrentUserTracker implements 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 @@ public class OverviewProxyService extends CurrentUserTracker implements mInputFocusTransferStarted = true; mInputFocusTransferStartY = event.getY(); mInputFocusTransferStartMillis = event.getEventTime(); - statusBar.onInputFocusTransfer( + centralSurfaces.onInputFocusTransfer( mInputFocusTransferStarted, false /* cancel */, 0 /* velocity */); } @@ -227,7 +225,7 @@ public class OverviewProxyService extends CurrentUserTracker implements mInputFocusTransferStarted = false; float velocity = (event.getY() - mInputFocusTransferStartY) / (event.getEventTime() - mInputFocusTransferStartMillis); - statusBar.onInputFocusTransfer(mInputFocusTransferStarted, + centralSurfaces.onInputFocusTransfer(mInputFocusTransferStarted, action == ACTION_CANCEL, velocity); } @@ -298,14 +296,8 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public Rect getNonMinimizedSplitScreenSecondaryBounds() { - return verifyCallerAndClearCallingIdentity( - "getNonMinimizedSplitScreenSecondaryBounds", - () -> mLegacySplitScreenOptional.map(splitScreen -> - splitScreen - .getDividerView() - .getNonMinimizedSplitScreenSecondaryBounds()) - .orElse(null) - ); + // Deprecated + return null; } @Override @@ -362,8 +354,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void setSplitScreenMinimized(boolean minimized) { - mLegacySplitScreenOptional.ifPresent( - splitScreen -> splitScreen.setMinimized(minimized)); + // Deprecated } @Override @@ -410,7 +401,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void toggleNotificationPanel() { verifyCallerAndClearCallingIdentityPostMain("toggleNotificationPanel", () -> - mStatusBarOptionalLazy.get().ifPresent(StatusBar::togglePanel)); + mCentralSurfacesOptionalLazy.get().ifPresent(CentralSurfaces::togglePanel)); } @@ -564,11 +555,10 @@ public class OverviewProxyService extends CurrentUserTracker implements @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 @@ public class OverviewProxyService extends CurrentUserTracker implements super(broadcastDispatcher); mContext = context; mPipOptional = pipOptional; - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mHandler = new Handler(); mNavBarControllerLazy = navBarControllerLazy; mStatusBarWinController = statusBarWinController; @@ -634,9 +624,6 @@ public class OverviewProxyService extends CurrentUserTracker implements mCommandQueue = commandQueue; mSplitScreenOptional = splitScreenOptional; - legacySplitScreenOptional.ifPresent(splitScreen -> - splitScreen.registerBoundsChangeListener(mSplitScreenBoundsChangeListener)); - mLegacySplitScreenOptional = legacySplitScreenOptional; // Listen for user setup startTracking(); @@ -678,7 +665,7 @@ public class OverviewProxyService extends CurrentUserTracker implements 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 class OverviewProxyService extends CurrentUserTracker implements 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 7f130cb203c0..15ad7798b3a3 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.NavigationBarView; 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 @@ public class ScreenPinningRequest implements View.OnClickListener, 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 @@ public class ScreenPinningRequest implements View.OnClickListener, 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 @@ public class ScreenPinningRequest implements View.OnClickListener, .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 f14044682b61..daaa897374cb 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_ACTION_ 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.RemoteAnimationAdapter; 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 @@ import javax.inject.Inject; 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 @@ public class ActionProxyReceiver extends BroadcastReceiver { }; - 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 991a68fb056a..7801c68586f1 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 com.android.systemui.statusbar.policy.BrightnessMirrorController; 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 10aa12bc97ac..6abf339685e4 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.IWindowManager; 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 @@ public class ShortcutKeyDispatcher extends CoreStartable 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 @@ public class ShortcutKeyDispatcher extends CoreStartable 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 @@ public class ShortcutKeyDispatcher extends CoreStartable } 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 645c5accb541..8a02e5952659 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.inputmethodservice.InputMethodService.IME_INVISIBLE; 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 8366bddaab9f..17f42b1a3a43 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.KeyguardBypassController 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 @@ class LockscreenShadeTransitionController @Inject constructor( 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 @@ class LockscreenShadeTransitionController @Inject constructor( // 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 @@ class LockscreenShadeTransitionController @Inject constructor( if (nsslController.isInLockedDownShade()) { logger.logDraggedDownLockDownShade(startingChild) statusBarStateController.setLeaveOpenOnKeyguardHide(true) - statusbar.dismissKeyguardThenExecute(OnDismissAction { + centralSurfaces.dismissKeyguardThenExecute(OnDismissAction { nextHideKeyguardNeedsNoAnimation = true false }, cancelRunnable, false /* afterKeyguardGone */) @@ -342,9 +342,7 @@ class LockscreenShadeTransitionController @Inject constructor( qS.setTransitionToFullShadeAmount(field, qSDragProgress) notificationPanelController.setTransitionToFullShadeAmount(field, false /* animate */, 0 /* delay */) - // TODO: appear media also in split shade - val mediaAmount = if (useSplitShade) 0f else field - mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount) + mediaHierarchyManager.setTransitionToFullShadeAmount(field) transitionToShadeAmountCommon(field) } } @@ -363,7 +361,7 @@ class LockscreenShadeTransitionController @Inject constructor( notificationPanelController.setKeyguardOnlyContentAlpha(1.0f - scrimProgress) depthController.transitionToFullShadeProgress = scrimProgress udfpsKeyguardViewController?.setTransitionToFullShadeProgress(scrimProgress) - statusbar.setTransitionToFullShadeProgress(scrimProgress) + centralSurfaces.setTransitionToFullShadeProgress(scrimProgress) } private fun setDragDownAmountAnimated( @@ -463,7 +461,7 @@ class LockscreenShadeTransitionController @Inject constructor( animationHandler: ((Long) -> Unit)? = null, cancelAction: Runnable? = null ) { - if (statusbar.isShadeDisabled) { + if (centralSurfaces.isShadeDisabled) { cancelAction?.run() logger.logShadeDisabledOnGoToLockedShade() return @@ -505,7 +503,7 @@ class LockscreenShadeTransitionController @Inject constructor( 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 01bdb401e00c..68d35f9679ed 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 android.util.Log; 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 @@ import javax.inject.Inject; @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 @@ public class NotificationListener extends NotificationListenerWithPlugins { 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 3730d123021b..052c57e768fe 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.MediaData; 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.Di 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 @@ public class NotificationMediaManager implements Dumpable { 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 @@ public class NotificationMediaManager implements Dumpable { }; /** - * 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 @@ public class NotificationMediaManager implements Dumpable { 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 @@ public class NotificationMediaManager implements Dumpable { * 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 @@ public class NotificationMediaManager implements Dumpable { 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 17bf346fa22b..3b3b5a2d05f9 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.ActivatableNotificationVi 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 2b5453a56434..94a6d3e99842 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.R; 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.NotificationEntry. 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 @@ public class NotificationRemoteInputManager implements Dumpable { 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 @@ public class NotificationRemoteInputManager implements Dumpable { @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 @@ public class NotificationRemoteInputManager implements Dumpable { }; /** - * Injected constructor. See {@link StatusBarDependenciesModule}. + * Injected constructor. See {@link CentralSurfacesDependenciesModule}. */ public NotificationRemoteInputManager( Context context, @@ -263,7 +263,7 @@ public class NotificationRemoteInputManager implements Dumpable { 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 @@ public class NotificationRemoteInputManager implements Dumpable { 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 4f70fdb0d978..3b1fa1779c17 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 @@ package com.android.systemui.statusbar; 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.NotificationStackScroll 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 @@ public class NotificationShelfController { 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 092e86daddb8..054543c7d2b1 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.R; 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.legacy.VisualStabi 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 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle 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 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle private boolean mIsHandleDynamicPrivacyChangeScheduled; /** - * Injected constructor. See {@link StatusBarModule}. + * Injected constructor. See {@link CentralSurfacesModule}. */ public NotificationViewHierarchyManager( Context context, @@ -129,7 +127,6 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle KeyguardBypassController bypassController, Optional<Bubbles> bubblesOptional, DynamicPrivacyController privacyController, - ForegroundServiceSectionController fgsSectionController, DynamicChildBindController dynamicChildBindController, LowPriorityInflationHelper lowPriorityInflationHelper, AssistantFeedbackController assistantFeedbackController, @@ -145,7 +142,6 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle mVisualStabilityManager = visualStabilityManager; mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController; mEntryManager = notificationEntryManager; - mFgsSectionController = fgsSectionController; mNotifPipelineFlags = notifPipelineFlags; Resources res = context.getResources(); mAlwaysExpandNonGroupedNotification = @@ -417,8 +413,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle && 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 2e1762a26b7e..78077386179a 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 android.view.View; 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 c15679709c3d..33e224579bef 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 android.view.View; 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 @@ import javax.inject.Inject; 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 4ad01aab98a7..058edda20971 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.IStatusBarService; 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 @@ public class SmartReplyController implements Dumpable { 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 02870a382056..2763bd711338 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 @@ public class StatusBarStateControllerImpl implements * 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 f0b2c2d54dbe..2b3190159ecd 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.Appearance; 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 @@ public interface SysuiStatusBarStateController extends StatusBarStateController * 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 @@ public interface SysuiStatusBarStateController extends StatusBarStateController 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 @@ public interface SysuiStatusBarStateController extends StatusBarStateController 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 48717e29d06a..5df593b64c24 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 @@ class WiredChargingRippleController @Inject constructor( 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 fe5a69996eb7..41d2b655d805 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 @@ public class MobileSignalController extends SignalController<MobileState, Mobile } } - /** 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 d65fa3acfa37..a62a152ab7f4 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.fragments.FragmentHostManager 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 @@ class StatusBarInitializer @Inject constructor( * 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 @@ class StatusBarInitializer @Inject constructor( }).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 index c687e8282c7c..83290af24f2a 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.Notificatio 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.Module; 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 @@ public interface StatusBarDependenciesModule { NotificationVisibilityProvider visibilityProvider, NotificationEntryManager notificationEntryManager, RemoteInputNotificationRebuilder rebuilder, - Lazy<Optional<StatusBar>> statusBarOptionalLazy, + Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, StatusBarStateController statusBarStateController, Handler mainHandler, RemoteInputUriController remoteInputUriController, @@ -120,7 +120,7 @@ public interface StatusBarDependenciesModule { visibilityProvider, notificationEntryManager, rebuilder, - statusBarOptionalLazy, + centralSurfacesOptionalLazy, statusBarStateController, mainHandler, remoteInputUriController, @@ -134,7 +134,7 @@ public interface StatusBarDependenciesModule { @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 @@ public interface StatusBarDependenciesModule { DumpManager dumpManager) { return new NotificationMediaManager( context, - statusBarOptionalLazy, + centralSurfacesOptionalLazy, notificationShadeWindowController, visibilityProvider, notificationEntryManager, @@ -198,7 +198,6 @@ public interface StatusBarDependenciesModule { KeyguardBypassController bypassController, Optional<Bubbles> bubblesOptional, DynamicPrivacyController privacyController, - ForegroundServiceSectionController fgsSectionController, DynamicChildBindController dynamicChildBindController, LowPriorityInflationHelper lowPriorityInflationHelper, AssistantFeedbackController assistantFeedbackController, @@ -217,7 +216,6 @@ public interface StatusBarDependenciesModule { bypassController, bubblesOptional, privacyController, - fgsSectionController, dynamicChildBindController, lowPriorityInflationHelper, assistantFeedbackController, @@ -261,6 +259,7 @@ public interface StatusBarDependenciesModule { @Provides @SysUISingleton static OngoingCallController provideOngoingCallController( + Context context, CommonNotifCollection notifCollection, SystemClock systemClock, ActivityStarter activityStarter, @@ -284,6 +283,7 @@ public interface StatusBarDependenciesModule { : 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 index ad5ef2043ccd..99d4b2e525d1 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 com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; 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 index 46c1abb859b3..fe55dea7333a 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 76766b0d0ef0..3a4731a5a6aa 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.os.Looper 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 @@ abstract class GenericGestureDetector( * 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 @@ abstract class GenericGestureDetector( /** 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 fcb285a50ae7..6115819b967a 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 @@ open class SwipeStatusBarAwayGestureHandler @Inject constructor( ) { 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 4107ce2593f1..7ffb07aa77d0 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 @@ class TapGestureDetector @Inject constructor( ) : 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 314051c8ce6c..000000000000 --- 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 82b56cdd652d..5b7d90bfca44 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 @@ package com.android.systemui.statusbar.notification; 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.dagger.qualifiers.UiBackground; 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 @@ public class InstantAppNotifier extends CoreStartable 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 @@ public class InstantAppNotifier extends CoreStartable 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 @@ public class InstantAppNotifier extends CoreStartable 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 da706215863e..392145ad306a 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 android.view.View; 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 @@ public final class NotificationClicker implements View.OnClickListener { 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 @@ public final class NotificationClicker implements View.OnClickListener { 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 @@ public final class NotificationClicker implements View.OnClickListener { 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 @@ public final class NotificationClicker implements View.OnClickListener { /** 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 f97b936605f6..ac5beece880e 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 @@ public class NotificationEntryManager implements 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 @@ public class NotificationEntryManager implements Lazy<NotificationRowBinder> notificationRowBinderLazy, Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy, LeakDetector leakDetector, - ForegroundServiceDismissalFeatureController fgsFeatureController, IStatusBarService statusBarService, NotifLiveDataStoreImpl notifLiveDataStore, DumpManager dumpManager @@ -170,7 +168,6 @@ public class NotificationEntryManager implements mNotificationRowBinderLazy = notificationRowBinderLazy; mRemoteInputManagerLazy = notificationRemoteInputManagerLazy; mLeakDetector = leakDetector; - mFgsFeatureController = fgsFeatureController; mStatusBarService = statusBarService; mNotifLiveDataStore = notifLiveDataStore; mDumpManager = dumpManager; @@ -958,7 +955,7 @@ public class NotificationEntryManager implements 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 9da7d21886ab..2c1296f34a42 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.row.ExpandableNotificationRow 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 5dc0dcc4d717..c71eade79cdf 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 android.util.Log 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 @@ class TargetSdkResolver @Inject constructor( } 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 4ee08ed4899f..bdbb0eb48e8a 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 920d3c4cbe55..470737e3b772 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 @@ package com.android.systemui.statusbar.notification.collection.render 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 @@ object StatusBarNotifPanelEventSourceModule { @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 NotifPanelEventSourceManagerImpl 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 e3ebef99f45f..51bbf1c80478 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.settings.UserContextProvider; 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.NotificationSectionsMan 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 com.android.systemui.wmshell.BubblesManager; 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 @@ public interface NotificationsModule { Lazy<NotificationRowBinder> notificationRowBinderLazy, Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy, LeakDetector leakDetector, - ForegroundServiceDismissalFeatureController fgsFeatureController, IStatusBarService statusBarService, NotifLiveDataStoreImpl notifLiveDataStore, DumpManager dumpManager) { @@ -139,7 +139,6 @@ public interface NotificationsModule { notificationRowBinderLazy, notificationRemoteInputManagerLazy, leakDetector, - fgsFeatureController, statusBarService, notifLiveDataStore, dumpManager); @@ -150,7 +149,7 @@ public interface NotificationsModule { @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 @@ public interface NotificationsModule { DumpManager dumpManager) { return new NotificationGutsManager( context, - statusBarOptionalLazy, + centralSurfacesOptionalLazy, mainHandler, bgHandler, accessibilityManager, @@ -279,8 +278,8 @@ public interface NotificationsModule { @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 a59d4211e68a..18abfcaab0e0 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.NotificationActivityStarter 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 @@ import java.util.Optional */ 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 48f2dafedcbb..98f45fa070c9 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.interruption.HeadsUpViewBinde 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 @@ import javax.inject.Inject */ @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 @@ class NotificationsControllerImpl @Inject constructor( 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 @@ class NotificationsControllerImpl @Inject constructor( 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 1c9af11b7816..66701d1e37f1 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.NotificationActivityStarter 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 @@ class NotificationsControllerStub @Inject constructor( ) : NotificationsController { override fun initialize( - statusBar: StatusBar, - bubblesOptional: Optional<Bubbles>, presenter: NotificationPresenter, listContainer: NotificationListContainer, stackController: NotifStackController, @@ -75,4 +70,4 @@ class NotificationsControllerStub @Inject constructor( 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 dc3941332f0b..9fbd5c39dedd 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 @@ public class NotificationLogger implements StateListener { } /** - * 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 dbfa27f1f68e..000000000000 --- 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 1f7d93012e39..c237e1deeae3 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.NotificationChildrenCon 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 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } 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 17396ad31ba2..000000000000 --- 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 1530e5238c67..4c693045bc88 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.ConversationNotificationProce 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 @@ public class NotificationContentInflater implements NotificationRowContentBinder 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 6d13024e5489..ebe6f03c44e1 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.collection.render.NotifGutsVi 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx @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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx * 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx ShadeController shadeController, DumpManager dumpManager) { mContext = context; - mStatusBarOptionalLazy = statusBarOptionalLazy; + mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mMainHandler = mainHandler; mBgHandler = bgHandler; mAccessibilityManager = accessibilityManager; @@ -342,7 +342,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx // 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx // 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx // 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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx .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 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx 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 a12d0073ef57..1a7417a78186 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.ActivatableNotificationVi 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 @@ public interface ExpandableNotificationRowComponent { // 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 4555b839a3f2..fa14123df11f 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 java.lang.annotation.Retention; 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 75ca3377fa89..000000000000 --- 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 2c4db7745fd4..efe559a64cc4 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.ActivatableNotificationVi 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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } }; 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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable 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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable 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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mAmbientState.setExpansionChanging(false); if (!mIsExpanded) { resetScrollPosition(); - mStatusBar.resetUserExpandedStates(); + mCentralSurfaces.resetUserExpandedStates(); clearTemporaryViews(); clearUserLockedViews(); if (mSwipeHelper.isSwiping()) { @@ -4601,8 +4591,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } @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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable 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 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable // 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 d1c63e3ade70..df6b8f59fc36 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.StatusBarState; 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.logging.NotificationLogger; 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.HeadsUpTouchHelper; 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 @@ import kotlin.Unit; /** * 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 @@ public class NotificationStackScrollLayoutController { 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 @@ public class NotificationStackScrollLayoutController { 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 @@ public class NotificationStackScrollLayoutController { mView.updateSensitiveness(mStatusBarStateController.goingToFullShade(), mLockscreenUserManager.isAnyProfilePublicMode()); mView.onStatePostChange(mStatusBarStateController.fromShadeLocked()); - mNotificationEntryManager.updateNotifications("StatusBar state changed"); + mNotificationEntryManager.updateNotifications("CentralSurfaces state changed"); } }; @@ -435,7 +431,7 @@ public class NotificationStackScrollLayoutController { @Override public void onSnooze(StatusBarNotification sbn, NotificationSwipeActionHelper.SnoozeOption snoozeOption) { - mStatusBar.setNotificationSnoozed(sbn, snoozeOption); + mCentralSurfaces.setNotificationSnoozed(sbn, snoozeOption); } @Override @@ -488,7 +484,7 @@ public class NotificationStackScrollLayoutController { mView.addSwipedOutView(view); mFalsingCollector.onNotificationDismissed(); if (mFalsingCollector.shouldEnforceBouncer()) { - mStatusBar.executeRunnableDismissingKeyguard( + mCentralSurfaces.executeRunnableDismissingKeyguard( null, null /* cancelAction */, false /* dismissShade */, @@ -561,7 +557,7 @@ public class NotificationStackScrollLayoutController { @Override public float getFalsingThresholdFactor() { - return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f; + return mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f; } @Override @@ -648,7 +644,7 @@ public class NotificationStackScrollLayoutController { FalsingManager falsingManager, @Main Resources resources, NotificationSwipeHelper.Builder notificationSwipeHelperBuilder, - StatusBar statusBar, + CentralSurfaces centralSurfaces, ScrimController scrimController, NotificationGroupManagerLegacy legacyGroupManager, GroupExpansionManager groupManager, @@ -660,8 +656,6 @@ public class NotificationStackScrollLayoutController { LockscreenShadeTransitionController lockscreenShadeTransitionController, IStatusBarService iStatusBarService, UiEventLogger uiEventLogger, - ForegroundServiceDismissalFeatureController fgFeatureController, - ForegroundServiceSectionController fgServicesSectionController, LayoutInflater layoutInflater, NotificationRemoteInputManager remoteInputManager, VisualStabilityManager visualStabilityManager, @@ -691,7 +685,7 @@ public class NotificationStackScrollLayoutController { mFalsingManager = falsingManager; mResources = resources; mNotificationSwipeHelperBuilder = notificationSwipeHelperBuilder; - mStatusBar = statusBar; + mCentralSurfaces = centralSurfaces; mScrimController = scrimController; mJankMonitor = jankMonitor; groupManager.registerGroupExpansionChangeListener( @@ -699,7 +693,7 @@ public class NotificationStackScrollLayoutController { legacyGroupManager.registerGroupChangeListener(new OnGroupChangeListener() { @Override public void onGroupsChanged() { - mStatusBar.requestNotificationUpdate("onGroupsChanged"); + mCentralSurfaces.requestNotificationUpdate("onGroupsChanged"); } }); mNotifPipelineFlags = notifPipelineFlags; @@ -709,8 +703,6 @@ public class NotificationStackScrollLayoutController { mNotificationEntryManager = notificationEntryManager; mIStatusBarService = iStatusBarService; mUiEventLogger = uiEventLogger; - mFgFeatureController = fgFeatureController; - mFgServicesSectionController = fgServicesSectionController; mLayoutInflater = layoutInflater; mRemoteInputManager = remoteInputManager; mVisualStabilityManager = visualStabilityManager; @@ -724,7 +716,7 @@ public class NotificationStackScrollLayoutController { 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 @@ public class NotificationStackScrollLayoutController { mNotificationRoundnessManager.setShouldRoundPulsingViews( !mKeyguardBypassController.getBypassEnabled()); - if (mFgFeatureController.isForegroundServiceDismissalEnabled()) { - mView.initializeForegroundServiceSection( - (ForegroundServiceDungeonView) mFgServicesSectionController.createView( - mLayoutInflater)); - } - mSwipeHelper = mNotificationSwipeHelperBuilder .setSwipeDirection(SwipeHelper.X) .setNotificationCallback(mNotificationCallback) @@ -1420,7 +1406,7 @@ public class NotificationStackScrollLayoutController { 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 000000000000..3dcaae28e181 --- /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 244103cf419e..ccb37aeb18a9 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 @@ public class AutoTileManager implements UserAwareController { private UserHandle mCurrentUser; private boolean mInitialized; + private final String mSafetySpec; protected final Context mContext; protected final QSTileHost mHost; @@ -113,6 +114,13 @@ public class AutoTileManager implements UserAwareController { 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 @@ public class AutoTileManager implements UserAwareController { 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 @@ public class AutoTileManager implements UserAwareController { } } + 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 d5d1ceada88a..fe637c14ee33 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 class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp 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 index cffdc290c041..5642744d3390 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.row.NotificationGutsManager; 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.util.concurrency.MessageRouter; 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 javax.inject.Named; 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 @@ public class StatusBar extends CoreStartable implements "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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 class StatusBar extends CoreStartable implements /** - * 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mStartingSurfaceOptional = startingSurfaceOptional; mNotifPipelineFlags = notifPipelineFlags; - lockscreenShadeTransitionController.setStatusbar(this); + lockscreenShadeTransitionController.setCentralSurfaces(this); statusBarWindowStateController.addListener(this::onStatusBarWindowStateChanged); mScreenOffAnimationController = screenOffAnimationController; @@ -1115,7 +1119,7 @@ public class StatusBar extends CoreStartable implements } private void onFoldedStateChanged(boolean isFolded, boolean willGoToSleep) { - Trace.beginSection("StatusBar#onFoldedStateChanged"); + Trace.beginSection("CentralSurfaces#onFoldedStateChanged"); onFoldedStateChangedInternal(isFolded, willGoToSleep); Trace.endSection(); } @@ -1159,19 +1163,14 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements setBouncerShowingForStatusBarComponents(mBouncerShowing); checkBarModes(); }); - initializer.initializeStatusBar(mStatusBarComponent); + initializer.initializeStatusBar(mCentralSurfacesComponent); mStatusBarTouchableRegionManager.setup(this, mNotificationShadeWindowView); mHeadsUpManager.addListener(mNotificationPanelViewController.getOnHeadsUpChangedListener()); @@ -1446,65 +1445,19 @@ public class StatusBar extends CoreStartable implements mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener); mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider( mNotificationShadeWindowViewController, - mStackScrollerController.getNotificationListContainer(), - mHeadsUpManager, - mJankMonitor - ); - - // TODO: inject this. - mPresenter = new StatusBarNotificationPresenter( - mContext, - mNotificationPanelViewController, + mNotifListContainer, 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 @@ public class StatusBar extends CoreStartable implements } 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements @Override public void notifyBiometricAuthModeChanged() { - StatusBar.this.notifyBiometricAuthModeChanged(); + CentralSurfaces.this.notifyBiometricAuthModeChanged(); } private void setWakeAndUnlocking(boolean wakeAndUnlocking) { @@ -1634,7 +1592,7 @@ public class StatusBar extends CoreStartable implements } } }); - mStatusBarKeyguardViewManager.registerStatusBar( + mStatusBarKeyguardViewManager.registerCentralSurfaces( /* statusBar= */ this, mNotificationPanelViewController, mPanelExpansionStateManager, @@ -1673,35 +1631,6 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements getDelegate().onIntentStarted(willAnimate); if (willAnimate) { - StatusBar.this.mIsLaunchingActivityOverLockscreen = true; + CentralSurfaces.this.mIsLaunchingActivityOverLockscreen = true; } } @@ -1802,7 +1731,7 @@ public class StatusBar extends CoreStartable implements // 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 @@ public class StatusBar extends CoreStartable implements // 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 @@ public class StatusBar extends CoreStartable implements // 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements // 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 class StatusBar extends CoreStartable implements } 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 class StatusBar extends CoreStartable implements */ 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 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements @Override public void onStartedGoingToSleep() { - String tag = "StatusBar#onStartedGoingToSleep"; + String tag = "CentralSurfaces#onStartedGoingToSleep"; DejankUtils.startDetectingBlockingIpcs(tag); updateRevealEffect(false /* wakingUp */); updateNotificationPanelTouchState(); @@ -3599,7 +3531,7 @@ public class StatusBar extends CoreStartable implements @Override public void onStartedWakingUp() { - String tag = "StatusBar#onStartedWakingUp"; + String tag = "CentralSurfaces#onStartedWakingUp"; DejankUtils.startDetectingBlockingIpcs(tag); mNotificationShadeWindowController.batchApplyWindowLayoutParams(()-> { mDeviceInteractive = true; @@ -3674,7 +3606,7 @@ public class StatusBar extends CoreStartable implements @Override public void onScreenTurnedOff() { - Trace.beginSection("StatusBar#onScreenTurnedOff"); + Trace.beginSection("CentralSurfaces#onScreenTurnedOff"); mFalsingCollector.onScreenOff(); mScrimController.onScreenTurnedOff(); if (mCloseQsBeforeScreenOff) { @@ -3765,6 +3697,10 @@ public class StatusBar extends CoreStartable implements == WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP; } + boolean isWaking() { + return mWakefulnessLifecycle.getWakefulness() == WakefulnessLifecycle.WAKEFULNESS_WAKING; + } + public void notifyBiometricAuthModeChanged() { mDozeServiceHost.updateDozing(); updateScrimController(); @@ -3781,7 +3717,7 @@ public class StatusBar extends CoreStartable implements @VisibleForTesting public void updateScrimController() { - Trace.beginSection("StatusBar#updateScrimController"); + Trace.beginSection("CentralSurfaces#updateScrimController"); boolean unlocking = mKeyguardStateController.isShowing() && ( mBiometricUnlockController.isWakeAndUnlock() @@ -4347,7 +4283,7 @@ public class StatusBar extends CoreStartable implements 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 @@ public class StatusBar extends CoreStartable implements mDozeServiceHost.updateDozing(); updateTheme(); mNavigationBarController.touchAutoDim(mDisplayId); - Trace.beginSection("StatusBar#updateKeyguardState"); + Trace.beginSection("CentralSurfaces#updateKeyguardState"); if (mState == StatusBarState.KEYGUARD) { mNotificationPanelViewController.cancelPendingPanelCollapse(); } @@ -4428,7 +4364,7 @@ public class StatusBar extends CoreStartable implements @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 index 40819623c212..536be1c1a866 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.DisableFlagsLogger; 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @Override public void clickTile(ComponentName tile) { - QSPanelController qsPanelController = mStatusBar.getQSPanelController(); + QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController(); if (qsPanelController != null) { qsPanelController.clickTile(tile); } @@ -211,9 +207,9 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { } 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { */ @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { // 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { // 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { 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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { @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 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { // 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 05fba5498ea7..55b310ff986d 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 @@ public final class DozeServiceHost implements DozeHost { 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 @@ public final class DozeServiceHost implements DozeHost { * 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 @@ public final class DozeServiceHost implements DozeHost { mDozingRequested = true; updateDozing(); mDozeLog.traceDozing(mStatusBarStateController.isDozing()); - mStatusBar.updateIsKeyguard(); + mCentralSurfaces.updateIsKeyguard(); } } @@ -247,13 +247,13 @@ public final class DozeServiceHost implements DozeHost { && 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 final class DozeServiceHost implements DozeHost { public void onPulseFinished() { mPulsing = false; callback.onPulseFinished(); - mStatusBar.updateNotificationPanelTouchState(); + mCentralSurfaces.updateNotificationPanelTouchState(); mScrimController.setWakeLockScreenSensorActive(false); setPulsing(false); } @@ -274,14 +274,14 @@ public final class DozeServiceHost implements DozeHost { 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 @@ public final class DozeServiceHost implements DozeHost { } @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 @@ public final class DozeServiceHost implements DozeHost { 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 @@ public final class DozeServiceHost implements DozeHost { 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 84103c0bb377..541aeab22a80 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 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL 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 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL 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 class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL }; 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 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL 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 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } 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 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL @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 9bdefcd98422..2c4fc6c6f734 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 a0f8d05ebd0e..61760fb8c78c 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.row.ExpandableView; 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 java.util.function.Consumer; import javax.inject.Inject; import javax.inject.Provider; -@StatusBarComponent.StatusBarScope +@CentralSurfacesComponent.CentralSurfacesScope public class NotificationPanelViewController extends PanelViewController implements NotifPanelEventSource { @@ -665,6 +666,8 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController InteractionJankMonitor interactionJankMonitor, QsFrameTranslateController qsFrameTranslateController, SysUiState sysUiState, - KeyguardUnlockAnimationController keyguardUnlockAnimationController) { + KeyguardUnlockAnimationController keyguardUnlockAnimationController, + NotificationListContainer notificationListContainer) { super(view, falsingManager, dozeLog, @@ -823,6 +827,7 @@ public class NotificationPanelViewController extends PanelViewController mMediaHierarchyManager = mediaHierarchyManager; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mNotificationsQSContainerController = notificationsQSContainerController; + mNotificationListContainer = notificationListContainer; mNotificationsQSContainerController.init(); mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; mGroupManager = groupManager; @@ -1127,10 +1132,10 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController updateKeyguardStatusViewAlignment(/* animate= */false); mKeyguardMediaController.refreshMediaPosition(); + + if (splitNotificationShadeChanged) { + updateClockAppearance(); + } } private static void ensureAllViewsHaveIds(ViewGroup parentView) { @@ -1311,7 +1325,7 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController @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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController } 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 @@ public class NotificationPanelViewController extends PanelViewController // 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 @@ public class NotificationPanelViewController extends PanelViewController updateQsState(); requestPanelHeightUpdate(); mFalsingCollector.setQsExpanded(expanded); - mStatusBar.setQsExpanded(expanded); + mCentralSurfaces.setQsExpanded(expanded); mNotificationsQSContainerController.setQsExpanded(expanded); mPulseExpansionHandler.setQsExpanded(expanded); mKeyguardBypassController.setQSExpanded(expanded); @@ -2417,7 +2431,7 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController @Override protected void onClosingFinished() { - mStatusBar.onClosingFinished(); + mCentralSurfaces.onClosingFinished(); setClosingWithAlphaFadeout(false); mMediaHierarchyManager.closeGuts(); } @@ -3631,7 +3645,7 @@ public class NotificationPanelViewController extends PanelViewController } public void clearNotificationEffects() { - mStatusBar.clearNotificationEffects(); + mCentralSurfaces.clearNotificationEffects(); } @Override @@ -3693,7 +3707,7 @@ public class NotificationPanelViewController extends PanelViewController * 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 class NotificationPanelViewController extends PanelViewController } public boolean hasPulsingNotifications() { - return mNotificationStackScrollLayoutController - .getNotificationListContainer().hasPulsingNotifications(); + return mNotificationListContainer.hasPulsingNotifications(); } public ActivatableNotificationView getActivatedChild() { @@ -4073,10 +4086,10 @@ public class NotificationPanelViewController extends PanelViewController * @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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController // 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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController : !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 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController } mFalsingCollector.onCameraOn(); if (mFalsingCollector.shouldEnforceBouncer()) { - mStatusBar.executeRunnableDismissingKeyguard( + mCentralSurfaces.executeRunnableDismissingKeyguard( () -> mKeyguardBottomArea.launchCamera(mLastCameraLaunchSource), null, true /* dismissShade */, false /* afterKeyguardGone */, true /* deferred */); @@ -4514,7 +4527,7 @@ public class NotificationPanelViewController extends PanelViewController mKeyguardBottomArea.launchCamera(mLastCameraLaunchSource); } } - mStatusBar.startLaunchTransitionTimeout(); + mCentralSurfaces.startLaunchTransitionTimeout(); mBlockTouches = true; } @@ -4526,7 +4539,7 @@ public class NotificationPanelViewController extends PanelViewController mLaunchAnimationEndRunnable.run(); mLaunchAnimationEndRunnable = null; } - mStatusBar.readyForKeyguardDone(); + mCentralSurfaces.readyForKeyguardDone(); } @Override @@ -4563,18 +4576,18 @@ public class NotificationPanelViewController extends PanelViewController 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 @@ public class NotificationPanelViewController extends PanelViewController @Override public float getAffordanceFalsingFactor() { - return mStatusBar.isWakeUpComingFromTouch() ? 1.5f : 1.0f; + return mCentralSurfaces.isWakeUpComingFromTouch() ? 1.5f : 1.0f; } @Override @@ -5121,7 +5134,7 @@ public class NotificationPanelViewController extends PanelViewController 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 5caf4f604fcd..0ff010aedfff 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 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW 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 fb0e306b2e8b..1e3a02b0606b 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 @@ import com.android.systemui.R; */ 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 396703b11a42..101c86f6dac1 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.NotificationShadeWindowController; 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 @@ import javax.inject.Inject; /** * Controller for {@link NotificationShadeWindowView}. */ +@CentralSurfacesComponent.CentralSurfacesScope public class NotificationShadeWindowViewController { private static final String TAG = "NotifShadeWindowVC"; private final FalsingCollector mFalsingCollector; @@ -77,8 +79,8 @@ public class NotificationShadeWindowViewController { 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 @@ public class NotificationShadeWindowViewController { 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 @@ public class NotificationShadeWindowViewController { 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 @@ public class NotificationShadeWindowViewController { 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 249f9886253c..45dc943de2f8 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 abstract class PanelView extends FrameLayout { 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 85e804233ed9..7c1775ed2a5e 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 @@ public abstract class PanelViewController { 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 @@ public abstract class PanelViewController { //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 @@ public abstract class PanelViewController { } 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 @@ public abstract class PanelViewController { if (mUpdateFlingOnLayout) { mUpdateFlingVelocity = vel; } - } else if (!mStatusBar.isBouncerShowing() + } else if (!mCentralSurfaces.isBouncerShowing() && !mStatusBarKeyguardViewManager.isShowingAlternateAuthOrAnimating() && !mKeyguardStateController.isKeyguardGoingAway()) { boolean expands = onEmptySpaceClick(mInitialTouchX); @@ -469,7 +470,7 @@ public abstract class PanelViewController { } 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 @@ public abstract class PanelViewController { 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 @@ public abstract class PanelViewController { */ 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 @@ public abstract class PanelViewController { mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); return; } - if (mStatusBar.getNotificationShadeWindowView().isVisibleToUser()) { + if (mCentralSurfaces.getNotificationShadeWindowView().isVisibleToUser()) { mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); if (mAnimateAfterExpanding) { notifyExpandingStarted(); @@ -976,11 +977,11 @@ public abstract class PanelViewController { } protected void onUnlockHintFinished() { - mStatusBar.onHintFinished(); + mCentralSurfaces.onHintFinished(); } protected void onUnlockHintStarted() { - mStatusBar.onUnlockHintStarted(); + mCentralSurfaces.onUnlockHintStarted(); } public boolean isUnlockHintRunning() { @@ -1018,7 +1019,7 @@ public abstract class PanelViewController { View[] viewsToAnimate = { mKeyguardBottomArea.getIndicationArea(), - mStatusBar.getAmbientIndicationContainer()}; + mCentralSurfaces.getAmbientIndicationContainer()}; for (View v : viewsToAnimate) { if (v == null) { continue; @@ -1210,7 +1211,7 @@ public abstract class PanelViewController { 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 @@ public abstract class PanelViewController { 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 224b2e45bfe5..9da2ef734be8 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.UNFOLD_STATUS_BAR 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 @@ class PhoneStatusBarViewController private constructor( @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 @@ class PhoneStatusBarViewController private constructor( * 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 @@ class PhoneStatusBarViewController private constructor( @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 @@ class PhoneStatusBarViewController private constructor( 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 ea61a8b94e7e..c8174669cc65 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 @@ class ScreenOffAnimationController @Inject constructor( 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 @@ class ScreenOffAnimationController @Inject constructor( 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 @@ class ScreenOffAnimationController @Inject constructor( } 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 8d64041ab76b..a3c795f36d5d 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 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } 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 class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump 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 bfd625bbd288..902887027667 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 @@ public enum ScrimState { 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 24bb7f25f2eb..83ee125f84c2 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 @@ import com.android.systemui.statusbar.StatusBarState; /** * {@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 @@ public interface ShadeController { /** * 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 53ef97dc317c..cee8b335f380 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 @@ public class ShadeControllerImpl implements ShadeController { 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 @@ public class ShadeControllerImpl implements ShadeController { NotificationShadeWindowController notificationShadeWindowController, StatusBarKeyguardViewManager statusBarKeyguardViewManager, WindowManager windowManager, - Lazy<Optional<StatusBar>> statusBarOptionalLazy, + Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, Lazy<AssistManager> assistManagerLazy ) { mCommandQueue = commandQueue; @@ -67,15 +67,15 @@ public class ShadeControllerImpl implements ShadeController { 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 @@ public class ShadeControllerImpl implements ShadeController { } if (SPEW) { Log.d(TAG, "animateCollapse():" - + " mExpandedVisible=" + getStatusBar().isExpandedVisible() + + " mExpandedVisible=" + getCentralSurfaces().isExpandedVisible() + " flags=" + flags); } @@ -124,7 +124,7 @@ public class ShadeControllerImpl implements ShadeController { // 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 @@ public class ShadeControllerImpl implements ShadeController { 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 @@ public class ShadeControllerImpl implements ShadeController { 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 @@ public class ShadeControllerImpl implements ShadeController { // 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 @@ public class ShadeControllerImpl implements ShadeController { 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 a1be5acdac13..7555356af163 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.flags.Flags 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 java.io.PrintWriter 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 6eeae7f29839..50f21691b044 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.NotificationShadeWindowController; 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 81fb903a87b2..31d9266057da 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.StatusIconDisplayable; 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 @@ public interface StatusBarIconController { 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 @@ public interface StatusBarIconController { 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 @@ public interface StatusBarIconController { mDemoable = demoable; } + void setController(StatusBarIconController controller) { + mController = controller; + } + public void setBlockList(@Nullable List<String> blockList) { + Assert.isMainThread(); mBlockList.clear(); - if (blockList == null || blockList.isEmpty()) { - return; - } - 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 c5d3937173e7..623ec5e2b762 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 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } } + group.setController(this); mIconGroups.add(group); List<Slot> allSlots = getSlots(); for (int i = 0; i < allSlots.size(); i++) { @@ -115,6 +116,12 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } } + @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 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu /** * 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 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu /** * 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 a96ba56be58d..c160c22203a5 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb protected LockPatternUtils mLockPatternUtils; protected ViewMediatorCallback mViewMediatorCallback; - protected StatusBar mStatusBar; + protected CentralSurfaces mCentralSurfaces; private NotificationPanelViewController mNotificationPanelViewController; private BiometricUnlockController mBiometricUnlockController; @@ -277,16 +277,16 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } @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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } /** - * If {@link StatusBar} is pulsing. + * If {@link CentralSurfaces} is pulsing. */ public void setPulsing(boolean pulsing) { if (mPulsing != pulsing) { @@ -649,13 +651,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return; } - if (mStatusBar.isLaunchingActivityOverLockscreen()) { + if (mCentralSurfaces.isLaunchingActivityOverLockscreen()) { setOccludedAndUpdateStates(true); // When isLaunchingActivityOverLockscreen() is true, we know for sure that the post @@ -695,7 +697,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb reset(isOccluding /* hideBouncerWhenShowing*/); } if (animate && !occluded && mShowing && !mBouncer.isShowing()) { - mStatusBar.animateKeyguardUnoccluding(); + mCentralSurfaces.animateKeyguardUnoccluding(); } } @@ -712,7 +714,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb }, 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mNotificationContainer, fadeoutDuration, () -> { - mStatusBar.hideKeyguard(); + mCentralSurfaces.hideKeyguard(); onKeyguardFadedAway(); }); } else { - mStatusBar.fadeKeyguardWhilePulsing(); + mCentralSurfaces.fadeKeyguardWhilePulsing(); } wakeAndUnlockDejank(); } else { @@ -810,20 +812,20 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void dismissAndCollapse() { - mStatusBar.executeRunnableDismissingKeyguard(null, null, true, false, true); + mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, true, false, true); } /** @@ -922,7 +924,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb */ 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) { mNotificationShadeWindowController.setBouncerShowing(bouncerShowing); - mStatusBar.setBouncerShowing(bouncerShowing); + mCentralSurfaces.setBouncerShowing(bouncerShowing); } if (occluded != mLastOccluded || mFirstUpdate) { @@ -1040,11 +1042,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * 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 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } else { mNotificationContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable); - mStatusBar.getNotificationShadeWindowView().getWindowInsetsController() + mCentralSurfaces.getNotificationShadeWindowView().getWindowInsetsController() .hide(navigationBars()); } } @@ -1120,7 +1122,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public boolean shouldDisableWindowAnimationsForUnlock() { - return mStatusBar.isInLaunchTransition(); + return mCentralSurfaces.isInLaunchTransition(); } @Override @@ -1139,7 +1141,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @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 09fca100749c..56b6dfc42ee3 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 @@ import com.android.systemui.animation.LaunchAnimator */ 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 @@ class StatusBarLaunchAnimatorController( 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 ff86d74a86eb..edbddbb3c3e7 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 @@ package com.android.systemui.statusbar.phone; 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.ActivityIntentHelper; 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.interruption.NotificationInte 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 @@ import dagger.Lazy; /** * 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit private boolean mIsCollapsingToShowActivityOverLockscreen; - private StatusBarNotificationActivityStarter( + @Inject + StatusBarNotificationActivityStarter( Context context, CommandQueue commandQueue, Handler mainThreadHandler, @@ -162,7 +162,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit MetricsLogger metricsLogger, StatusBarNotificationActivityStarterLogger logger, OnUserInteractionCallback onUserInteractionCallback, - StatusBar statusBar, + CentralSurfaces centralSurfaces, NotificationPresenter presenter, NotificationPanelViewController panel, ActivityLaunchAnimator activityLaunchAnimator, @@ -199,7 +199,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit mOnUserInteractionCallback = onUserInteractionCallback; // TODO: use KeyguardStateController#isOccluded to remove this dependency - mStatusBar = statusBar; + mCentralSurfaces = centralSurfaces; mPresenter = presenter; mNotificationPanel = panel; mActivityLaunchAnimator = activityLaunchAnimator; @@ -259,7 +259,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit && 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit try { ActivityLaunchAnimator.Controller animationController = new StatusBarLaunchAnimatorController( - mNotificationAnimationProvider.getAnimatorController(row), mStatusBar, + mNotificationAnimationProvider.getAnimatorController(row), + mCentralSurfaces, isActivityIntent); mActivityLaunchAnimator.startPendingIntentWithAnimation(animationController, @@ -483,11 +484,11 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit @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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit @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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit ); 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit 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/shared/src/com/android/systemui/shared/system/ConfigurationCompat.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterModule.java index d1c77a6e7c5a..caa149e61921 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ConfigurationCompat.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterModule.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -13,16 +13,17 @@ * 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; +package com.android.systemui.statusbar.phone; -/** - * Wraps the Configuration to access the window configuration. - */ -public class ConfigurationCompat { +import com.android.systemui.statusbar.notification.NotificationActivityStarter; + +import dagger.Binds; +import dagger.Module; - public static int getWindowConfigurationRotation(Configuration c) { - return c.windowConfiguration.getRotation(); - } +@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 c8e1cdc75242..aa061d74f6c6 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.ExpandableNotificationRow 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, DynamicPrivacyController dynamicPrivacyController, KeyguardStateController keyguardStateController, KeyguardIndicationController keyguardIndicationController, - StatusBar statusBar, + CentralSurfaces centralSurfaces, ShadeController shadeController, LockscreenShadeTransitionController shadeTransitionController, CommandQueue commandQueue, @@ -144,14 +152,17 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, } } 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, updateNotificationViews("user switched"); } mMediaManager.clearCurrentMediaNotification(); - mStatusBar.setLockscreenUser(newUserId); + mCentralSurfaces.setLockscreenUser(newUserId); updateMediaMetaData(true, false); } @@ -395,7 +406,8 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, @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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, // 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 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, @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 000000000000..26c483ce18fa --- /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 b0206f073011..ee242a4b1b75 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 java.util.Objects; 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 @@ public class StatusBarSignalPolicy implements SignalCallback, } /** - * 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 b742394b18a5..95667cc0b972 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 @@ public final class StatusBarTouchableRegionManager implements Dumpable { 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 @@ public final class StatusBarTouchableRegionManager implements Dumpable { } 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 @@ public final class StatusBarTouchableRegionManager implements Dumpable { 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 26ba31c6f526..582afb1a23ea 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 static com.android.systemui.classifier.FalsingModule.DOUBLE_TAP_TIMEOUT_M 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 @@ import javax.inject.Named; /** * 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 0abe8e489638..c11d450e47b2 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( override fun onAnimationCancel(animation: Animator?) { lightRevealScrim.revealAmount = 1f lightRevealAnimationPlaying = false - sendUnlockedScreenOffProgressUpdate(0f, 0f) interactionJankMonitor.cancel(CUJ_SCREEN_OFF) } @@ -105,7 +100,8 @@ class UnlockedScreenOffAnimationController @Inject constructor( } override fun onAnimationStart(animation: Animator?) { - interactionJankMonitor.begin(statusBar.notificationShadeWindowView, CUJ_SCREEN_OFF) + interactionJankMonitor.begin( + mCentralSurfaces.notificationShadeWindowView, CUJ_SCREEN_OFF) } }) } @@ -117,11 +113,11 @@ class UnlockedScreenOffAnimationController @Inject constructor( } 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( // 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( // 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( // 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( // 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 @@ class UnlockedScreenOffAnimationController @Inject constructor( 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 index ad8e79e36661..59c9d0baea3f 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 static java.lang.annotation.RetentionPolicy.RUNTIME; 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 @@ import dagger.Subcomponent; /** * 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 @@ import dagger.Subcomponent; * 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 @@ public interface StatusBarComponent { /** * 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 c6b5b1d33198..c024c7245c45 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.PhoneStatusBarPolicy; 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.util.concurrency.MessageRouter; 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.Module; 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 @@ public interface StatusBarPhoneModule { 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 @@ public interface StatusBarPhoneModule { DeviceStateManager deviceStateManager, DreamOverlayStateController dreamOverlayStateController, WiredChargingRippleController wiredChargingRippleController) { - return new StatusBar( + return new CentralSurfaces( context, notificationsController, fragmentService, @@ -298,8 +293,6 @@ public interface StatusBarPhoneModule { 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 ebd58fb8ebed..79fe700191f7 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.BatteryController; 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 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static NotificationShadeWindowView providesNotificationShadeWindowView( LayoutInflater layoutInflater) { NotificationShadeWindowView notificationShadeWindowView = (NotificationShadeWindowView) @@ -92,7 +95,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static NotificationStackScrollLayout providesNotificationStackScrollLayout( NotificationShadeWindowView notificationShadeWindowView) { return notificationShadeWindowView.findViewById(R.id.notification_stack_scroller); @@ -100,7 +103,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static NotificationShelf providesNotificationShelf(LayoutInflater layoutInflater, NotificationStackScrollLayout notificationStackScrollLayout) { NotificationShelf view = (NotificationShelf) layoutInflater.inflate( @@ -115,7 +118,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static NotificationShelfController providesStatusBarWindowView( NotificationShelfComponent.Builder notificationShelfComponentBuilder, NotificationShelf notificationShelf) { @@ -131,7 +134,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static NotificationPanelView getNotificationPanelView( NotificationShadeWindowView notificationShadeWindowView) { return notificationShadeWindowView.getNotificationPanelView(); @@ -139,7 +142,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static LockIconView getLockIconView( NotificationShadeWindowView notificationShadeWindowView) { return notificationShadeWindowView.findViewById(R.id.lock_icon_view); @@ -147,7 +150,7 @@ public abstract class StatusBarViewModule { /** */ @Provides - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope @Nullable public static AuthRippleView getAuthRippleView( NotificationShadeWindowView notificationShadeWindowView) { @@ -157,7 +160,7 @@ public abstract class StatusBarViewModule { /** */ @Provides @Named(SPLIT_SHADE_HEADER) - @StatusBarComponent.StatusBarScope + @CentralSurfacesComponent.CentralSurfacesScope public static View getSplitShadeStatusBarView( NotificationShadeWindowView notificationShadeWindowView, FeatureFlags featureFlags) { @@ -172,7 +175,7 @@ public abstract class StatusBarViewModule { /** */ @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 @@ public abstract class StatusBarViewModule { /** */ @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 @@ public abstract class StatusBarViewModule { /** */ @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 @@ public abstract class StatusBarViewModule { * 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 @@ public abstract class StatusBarViewModule { 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 @@ public abstract class StatusBarViewModule { 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 2af077255869..2c84219dbfd0 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.NonNull; 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.ViewGroup; 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.ongoingcall.OngoingCallListener; 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mCommandQueue = commandQueue; mCollapsedStatusBarFragmentLogger = collapsedStatusBarFragmentLogger; mOperatorNameViewControllerFactory = operatorNameViewControllerFactory; + mSecureSettings = secureSettings; + mMainExecutor = mainExecutor; } @Override @@ -187,10 +200,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue 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 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mCommandQueue.removeCallback(this); mStatusBarStateController.removeCallback(this); mOngoingCallController.removeCallback(mOngoingCallListener); + mSecureSettings.unregisterContentObserver(mVolumeSettingObserver); } @Override @@ -584,6 +618,13 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue 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 22b7f649775e..2eba325ff63d 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 @@ package com.android.systemui.statusbar.phone.fragment.dagger; 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 @@ import dagger.Subcomponent; * * 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 6e7231ef5ca3..de05eb1e42ca 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.IActivityManager 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 @@ import javax.inject.Inject */ @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 @@ class OngoingCallController @Inject constructor( 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 @@ class OngoingCallController @Inject constructor( 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 @@ class OngoingCallController @Inject constructor( 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 f4e53e22b02c..d1c9b3f1c2c5 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.plugins.FalsingManager; 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 @@ public class UserSwitcherController implements Dumpable { 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 @@ public class UserSwitcherController implements Dumpable { InteractionJankMonitor interactionJankMonitor, LatencyTracker latencyTracker, DumpManager dumpManager, - Lazy<ShadeController> shadeController, DialogLaunchAnimator dialogLaunchAnimator) { mContext = context; mActivityManager = activityManager; @@ -207,7 +202,6 @@ public class UserSwitcherController implements Dumpable { mActivityStarter = activityStarter; mUserManager = userManager; mDialogLaunchAnimator = dialogLaunchAnimator; - mShadeController = shadeController; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_ADDED); @@ -1206,8 +1200,12 @@ public class UserSwitcherController implements Dumpable { 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 6f587fde4436..c53d5107afcc 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 @@ public class StatusBarWindowController { 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 @@ public class StatusBarWindowController { mContentInsetsProvider.addCallback(this::calculateStatusBarLocationsForAllRotations); calculateStatusBarLocationsForAllRotations(); + mIsAttached = true; + apply(mCurrentState); } /** Adds the given view to the status bar window view. */ @@ -282,6 +285,9 @@ public class StatusBarWindowController { } 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 3a1491400f38..60f6df66cb5a 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 android.util.Log 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 @@ class StatusBarWindowStateController @Inject constructor( } 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 e2374ada15d5..d6dfceac7a63 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.dagger.qualifiers.Main 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 @@ constructor( 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 @@ constructor( 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 @@ constructor( 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 @@ constructor( override fun onStartedWakingUp() { if (isAnimationPlaying) { handler.removeCallbacks(startAnimationRunnable) - statusBar.notificationPanelViewController.cancelFoldToAodAnimation() + mCentralSurfaces.notificationPanelViewController.cancelFoldToAodAnimation() } setAnimationState(playing = false) @@ -131,12 +131,14 @@ constructor( // 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 000000000000..613a797f020c --- /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 b2a79b01fb74..c3c3f90539fd 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.ShellCommandHandler; 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 @@ public final class WMShell extends CoreStartable // 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 @@ public final class WMShell extends CoreStartable private final Executor mSysUiMainExecutor; private boolean mIsSysUiStateValid; - private KeyguardUpdateMonitorCallback mLegacySplitScreenKeyguardCallback; private KeyguardUpdateMonitorCallback mSplitScreenKeyguardCallback; private KeyguardUpdateMonitorCallback mPipKeyguardCallback; private KeyguardUpdateMonitorCallback mOneHandedKeyguardCallback; @@ -138,7 +135,6 @@ public final class WMShell extends CoreStartable @Inject public WMShell(Context context, Optional<Pip> pipOptional, - Optional<LegacySplitScreen> legacySplitScreenOptional, Optional<SplitScreen> splitScreenOptional, Optional<OneHanded> oneHandedOptional, Optional<HideDisplayCutout> hideDisplayCutoutOptional, @@ -163,7 +159,6 @@ public final class WMShell extends CoreStartable mScreenLifecycle = screenLifecycle; mSysUiState = sysUiState; mPipOptional = pipOptional; - mLegacySplitScreenOptional = legacySplitScreenOptional; mSplitScreenOptional = splitScreenOptional; mOneHandedOptional = oneHandedOptional; mHideDisplayCutoutOptional = hideDisplayCutoutOptional; @@ -183,7 +178,6 @@ public final class WMShell extends CoreStartable 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 @@ public final class WMShell extends CoreStartable } @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 5128ccc15d9d..ec2c1de49b4c 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.NotificationShadeWindowController 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 @@ class AuthRippleControllerTest : SysuiTestCase() { 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 @@ class AuthRippleControllerTest : SysuiTestCase() { `when`(udfpsControllerProvider.get()).thenReturn(udfpsController) controller = AuthRippleController( - statusBar, + mCentralSurfaces, context, authController, configurationController, @@ -105,7 +105,7 @@ class AuthRippleControllerTest : SysuiTestCase() { 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 35e838bfca9a..1856fda14e1b 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.plugins.statusbar.StatusBarStateController; 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 @@ public class UdfpsControllerTest extends SysuiTestCase { @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 e9a4e15b9773..7fb42b6ea11e 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 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { mController.onViewAttached(); verify(mView, atLeast(1)).setPauseAuth(true); - verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount); + verify(mView).onDozeAmountChanged(dozeAmount, dozeAmount, true); } @Test @@ -193,7 +193,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase { 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 9908d44507cd..da25c6202b21 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 @@ import java.util.Optional @SmallTest @RunWith(AndroidTestingRunner::class) class ControlActionCoordinatorImplTest : SysuiTestCase() { - @Mock private lateinit var vibratorHelper: VibratorHelper @Mock @@ -61,6 +67,10 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() { 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 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() { 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 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() { 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 56844292ce4a..3340f2fd5749 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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 @@ public class DozeMachineTest extends SysuiTestCase { } @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 000000000000..aa0a909622bb --- /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 8ce10b808f32..d0e10fba11c5 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 @@ package com.android.systemui.dreams; 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 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase { 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 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase { 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 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase { } @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 ad8d44d62a5c..a32ff801e824 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 @@ import org.mockito.MockitoAnnotations; @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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { 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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { } @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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { } @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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { 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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { 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 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { 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 cad98f4dc713..6e01541c75e0 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 @@ package com.android.systemui.dreams.touch; 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.verify; 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.Mock; 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 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Mock - StatusBar mStatusBar; + CentralSurfaces mCentralSurfaces; @Mock NotificationShadeWindowController mNotificationShadeWindowController; @@ -89,38 +88,51 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @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 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { 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 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { 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 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { 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 74b217b2fdbf..29f56e0d8bf0 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 com.google.common.truth.Truth.assertThat; 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 @@ public class DreamOverlayTouchMonitorTest extends SysuiTestCase { } @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 953be7d6f002..6fead9efa767 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.plugins.GlobalActions; 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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mRingerModeTracker, mHandler, mPackageManager, - Optional.of(mStatusBar), + Optional.of(mCentralSurfaces), mKeyguardUpdateMonitor, mDialogLaunchAnimator); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); @@ -227,7 +227,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { 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 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { 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/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt index e606be179cc6..b359ae5317b1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt @@ -33,10 +33,11 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.phone.KeyguardBypassController -import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.UniqueObjectHostView -import junit.framework.Assert +import com.android.systemui.util.mockito.any +import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Rule @@ -44,16 +45,16 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyLong import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.`when` -import org.mockito.Mockito.any -import org.mockito.Mockito.anyBoolean -import org.mockito.Mockito.anyLong import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit +import org.mockito.Mockito.`when` as whenever @SmallTest @RunWith(AndroidTestingRunner::class) @@ -83,8 +84,6 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Mock private lateinit var keyguardViewController: KeyguardViewController @Mock - private lateinit var configurationController: ConfigurationController - @Mock private lateinit var uniqueObjectHostView: UniqueObjectHostView @Mock private lateinit var dreamOverlayStateController: DreamOverlayStateController @@ -97,6 +96,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { val mockito = MockitoJUnit.rule() private lateinit var mediaHiearchyManager: MediaHierarchyManager private lateinit var mediaFrame: ViewGroup + private val configurationController = FakeConfigurationController() @Before fun setup() { @@ -176,12 +176,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Test fun testGoingToFullShade() { - // Let's set it onto Lock screen - `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( - true) - statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) - clearInvocations(mediaCarouselController) + goToLockscreen() // Let's transition all the way to full shade mediaHiearchyManager.setTransitionToFullShadeAmount(100000f) @@ -204,41 +199,48 @@ class MediaHierarchyManagerTest : SysuiTestCase() { // Let's make sure alpha is set mediaHiearchyManager.setTransitionToFullShadeAmount(2.0f) - Assert.assertTrue("alpha should not be 1.0f when cross fading", mediaFrame.alpha != 1.0f) + assertThat(mediaFrame.alpha).isNotEqualTo(1.0f) } @Test fun testTransformationOnLockScreenIsFading() { - // Let's set it onto Lock screen - `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( - true) - statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) - clearInvocations(mediaCarouselController) + goToLockscreen() + expandQS() + + val transformType = mediaHiearchyManager.calculateTransformationType() + assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) + } + + @Test + fun calculateTransformationType_onLockShade_inSplitShade_goingToFullShade_returnsTransition() { + enableSplitShade() + goToLockscreen() + expandQS() + mediaHiearchyManager.setTransitionToFullShadeAmount(10000f) + + val transformType = mediaHiearchyManager.calculateTransformationType() + assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_TRANSITION) + } + + @Test + fun calculateTransformationType_onLockShade_inSplitShade_notExpanding_returnsFade() { + enableSplitShade() + goToLockscreen() + goToLockedShade() + expandQS() + mediaHiearchyManager.setTransitionToFullShadeAmount(0f) - // Let's transition from lockscreen to qs - mediaHiearchyManager.qsExpansion = 1.0f val transformType = mediaHiearchyManager.calculateTransformationType() - Assert.assertTrue("media isn't transforming to qs with a fade", - transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) + assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) } @Test fun testTransformationOnLockScreenToQQSisFading() { - // Let's set it onto Lock screen - `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( - true) - statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) - clearInvocations(mediaCarouselController) + goToLockscreen() + goToLockedShade() - // Let's transition from lockscreen to qs - `when`(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED) - statusBarCallback.value.onStatePreChange(StatusBarState.KEYGUARD, - StatusBarState.SHADE_LOCKED) val transformType = mediaHiearchyManager.calculateTransformationType() - Assert.assertTrue("media isn't transforming to qqswith a fade", - transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) + assertThat(transformType).isEqualTo(MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) } @Test @@ -254,4 +256,32 @@ class MediaHierarchyManagerTest : SysuiTestCase() { verify(mediaCarouselController).closeGuts() } -}
\ No newline at end of file + + private fun enableSplitShade() { + context.getOrCreateTestableResources().addOverride( + R.bool.config_use_split_notification_shade, true + ) + configurationController.notifyConfigurationChanged() + } + + private fun goToLockscreen() { + whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) + whenever(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( + true + ) + statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) + clearInvocations(mediaCarouselController) + } + + private fun goToLockedShade() { + whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED) + statusBarCallback.value.onStatePreChange( + StatusBarState.KEYGUARD, + StatusBarState.SHADE_LOCKED + ) + } + + private fun expandQS() { + mediaHiearchyManager.qsExpansion = 1.0f + } +} 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 28de17664df1..809b8901f867 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 @@ package com.android.systemui.media.taptotransfer.common 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.statusbar.gesture.TapGestureDetector 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.Mock 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 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() { @Mock private lateinit var windowManager: WindowManager @Mock + private lateinit var viewUtil: ViewUtil + @Mock private lateinit var tapGestureDetector: TapGestureDetector @Before @@ -62,7 +69,7 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() { fakeExecutor = FakeExecutor(fakeClock) controllerCommon = TestControllerCommon( - context, windowManager, fakeExecutor, tapGestureDetector + context, windowManager, viewUtil, fakeExecutor, tapGestureDetector ) } @@ -169,6 +176,40 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() { .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 @@ class MediaTttChipControllerCommonTest : SysuiTestCase() { 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 e5f4df6c622a..86d4c1b05ed3 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.concurrency.FakeExecutor 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 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { @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 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { 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 e5ba3f3d87bf..88888f0da0f7 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.concurrency.FakeExecutor 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 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { @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 @@ class MediaTttChipControllerSenderTest : SysuiTestCase() { 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 3a95ed3da84d..634d9e4642b3 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.assist.AssistManager; 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 @@ public class NavBarHelperTest extends SysuiTestCase { 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 48d38571cf3c..eb1e1a2e3d04 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 android.view.WindowInsets.Type.ime; 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.AutoHideController; 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 @@ public class NavigationBarTest extends SysuiTestCase { @Mock private AssistManager mAssistManager; @Mock - private StatusBar mStatusBar; + private CentralSurfaces mCentralSurfaces; @Rule public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck(); @@ -190,7 +189,7 @@ public class NavigationBarTest extends SysuiTestCase { 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 @@ public class NavigationBarTest extends SysuiTestCase { 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 @@ public class NavigationBarTest extends SysuiTestCase { @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 @@ public class NavigationBarTest extends SysuiTestCase { // 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 @@ public class NavigationBarTest extends SysuiTestCase { 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 721809c83cd8..373770ec976b 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.SysuiTestCase; 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 @@ public class PowerUITest extends SysuiTestCase { 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 @@ public class PowerUITest extends SysuiTestCase { 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 f736f26e5c46..7b17c36aaf16 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.any 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 @@ class FooterActionsControllerTest : LeakCheckedTest() { @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 @@ class FooterActionsControllerTest : LeakCheckedTest() { 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 @@ class FooterActionsControllerTest : LeakCheckedTest() { 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 4ab39261e825..534c7e7f2029 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.shared.plugins.PluginManager; 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 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { 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 000000000000..ac1e86f58f86 --- /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 8872e28647a7..e67d37ac3c72 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.qs.tileimpl.QSTileImpl; 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 @@ public class QSTileHostTest extends SysuiTestCase { @Mock private QSTile.State mMockState; @Mock - private StatusBar mStatusBar; + private CentralSurfaces mCentralSurfaces; @Mock private QSLogger mQSLogger; @Mock @@ -152,7 +152,7 @@ public class QSTileHostTest extends SysuiTestCase { 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 @@ public class QSTileHostTest extends SysuiTestCase { 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 e39d6a1bfc01..19a9863f6f5e 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.qs.tileimpl.QSFactoryImpl; 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 @@ public class TileServicesTest extends SysuiTestCase { @Mock private DumpManager mDumpManager; @Mock - private StatusBar mStatusBar; + private CentralSurfaces mCentralSurfaces; @Mock private QSLogger mQSLogger; @Mock @@ -132,7 +132,7 @@ public class TileServicesTest extends SysuiTestCase { () -> 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 bfe875ccd60d..7ab49584f0e3 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 @@ package com.android.systemui.screenshot; 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 androidx.test.filters.SmallTest; 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 @@ import java.util.concurrent.TimeoutException; public class ActionProxyReceiverTest extends SysuiTestCase { @Mock - private StatusBar mMockStatusBar; + private CentralSurfaces mMockCentralSurfaces; @Mock private ActivityManagerWrapper mMockActivityManagerWrapper; @Mock @@ -83,7 +83,7 @@ public class ActionProxyReceiverTest extends SysuiTestCase { 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 @@ public class ActionProxyReceiverTest extends SysuiTestCase { 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 @@ public class ActionProxyReceiverTest extends SysuiTestCase { 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 9076e1607be5..25a5b900f15a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -22,8 +22,8 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController 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.policy.ConfigurationController +import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.policy.FakeConfigurationController import org.junit.After import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull @@ -66,17 +66,18 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Mock lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock lateinit var mediaHierarchyManager: MediaHierarchyManager @Mock lateinit var scrimController: ScrimController - @Mock lateinit var configurationController: ConfigurationController @Mock lateinit var falsingManager: FalsingManager @Mock lateinit var notificationPanelController: NotificationPanelViewController @Mock lateinit var nsslController: NotificationStackScrollLayoutController @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() + private val configurationController = FakeConfigurationController() + @Before fun setup() { val helper = NotificationTestHelper( @@ -105,7 +106,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { 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) @@ -117,7 +118,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { whenever(lockScreenUserManager.isLockscreenPublicMode(anyInt())).thenReturn(true) whenever(falsingCollector.shouldEnforceBouncer()).thenReturn(false) whenever(keyguardBypassController.bypassEnabled).thenReturn(false) - clearInvocations(statusbar) + clearInvocations(mCentralSurfaces) } @After @@ -174,7 +175,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Test fun testDontGoWhenShadeDisabled() { - whenever(statusbar.isShadeDisabled).thenReturn(true) + whenever(mCentralSurfaces.isShadeDisabled).thenReturn(true) transitionController.goToLockedShade(null) verify(statusbarStateController, never()).setState(anyInt()) } @@ -193,7 +194,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { transitionController.goToLockedShade(null) verify(statusbarStateController, never()).setState(anyInt()) verify(statusbarStateController).setLeaveOpenOnKeyguardHide(true) - verify(statusbar).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject()) + verify(mCentralSurfaces).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject()) } @Test @@ -202,7 +203,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { transitionController.goToLockedShade(null) verify(statusbarStateController, never()).setState(anyInt()) verify(statusbarStateController).setLeaveOpenOnKeyguardHide(true) - verify(statusbar).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject()) + verify(mCentralSurfaces).showBouncerWithDimissAndCancelIfKeyguard(anyObject(), anyObject()) } @Test @@ -244,4 +245,27 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { verify(qS).setTransitionToFullShadeAmount(anyFloat(), anyFloat()) verify(depthController).transitionToFullShadeProgress = anyFloat() } + + @Test + fun setDragDownAmount_setsValueOnMediaHierarchyManager() { + transitionController.dragDownAmount = 10f + + verify(mediaHierarchyManager).setTransitionToFullShadeAmount(10f) + } + + @Test + fun setDragDownAmount_inSplitShade_setsValueOnMediaHierarchyManager() { + enableSplitShade() + + transitionController.dragDownAmount = 10f + + verify(mediaHierarchyManager).setTransitionToFullShadeAmount(10f) + } + + private fun enableSplitShade() { + context.getOrCreateTestableResources().addOverride( + R.bool.config_use_split_notification_shade, true + ) + configurationController.notifyConfigurationChanged() + } } 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 4213b070d0c2..a4ce9cd12f73 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 @@ import org.mockito.MockitoAnnotations; /** * 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 bd9f91f45e25..2691ff98f4ee 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.NotificationEntry; 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 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { 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 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { NotificationVisibilityProvider visibilityProvider, NotificationEntryManager notificationEntryManager, RemoteInputNotificationRebuilder rebuilder, - Lazy<Optional<StatusBar>> statusBarOptionalLazy, + Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, StatusBarStateController statusBarStateController, Handler mainHandler, RemoteInputUriController remoteInputUriController, @@ -211,7 +211,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { 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 7fafb24317b7..407044b5378a 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.logging.NotificationLogger; 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 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { 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 e0689f3da081..3500e4d5f701 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.NotificationEntryManager; 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 @@ public class SmartReplyControllerTest extends SysuiTestCase { 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 c0389034b4f2..ea066471a802 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 @@ class GenericGestureDetectorTest : SysuiTestCase() { 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 f2b7bf515c45..0fff5f5b47e5 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 @@ public class NotificationEntryManagerTest extends SysuiTestCase { () -> 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 52189e417017..7fc5ece670d4 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.NotificationRemoteInputManager; 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 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase { () -> 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 7d8e0d26464c..e9d8f5830131 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.collection.provider.HighPrior 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 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @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 @@ public class NotificationGutsManagerTest extends SysuiTestCase { 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 c4f954fee1f6..1561b5a5d22e 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.NotificationRemoteInputManager; 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.legacy.VisualStabi 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 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @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 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @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 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { when(mNotificationSwipeHelperBuilder.build()).thenReturn(mNotificationSwipeHelper); when(mNotifPipelineFlags.isNewPipelineEnabled()).thenReturn(false); - when(mFgServicesSectionController.createView(mLayoutInflater)) - .thenReturn(mForegroundServiceDungeonView); mController = new NotificationStackScrollLayoutController( true, @@ -175,7 +168,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { new FalsingManagerFake(), mResources, mNotificationSwipeHelperBuilder, - mStatusBar, + mCentralSurfaces, mScrimController, mLegacyGroupManager, mLegacyGroupManager, @@ -187,8 +180,6 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mLockscreenShadeTransitionController, mIStatusBarService, mUiEventLogger, - mFgFeatureController, - mFgServicesSectionController, mLayoutInflater, mRemoteInputManager, mVisualStabilityManager, @@ -399,22 +390,6 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { } @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 4f731ed5f72c..eafcc354fac4 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.GroupExpans 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 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { 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 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { 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 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { 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 22899367afce..0e12c2adc09a 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.AutoAddTracker; 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 @@ public class AutoTileManagerTest extends SysuiTestCase { 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 @@ public class AutoTileManagerTest extends SysuiTestCase { ); 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 @@ public class AutoTileManagerTest extends SysuiTestCase { } @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 index aabf9235c822..9bfb2c4ce00c 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.notification.stack.NotificationStackScroll 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 @@ import java.util.Optional; @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 @@ public class StatusBarCommandQueueCallbacksTest extends SysuiTestCase { @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 @@ public class StatusBarCommandQueueCallbacksTest extends SysuiTestCase { @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 @@ public class StatusBarCommandQueueCallbacksTest extends SysuiTestCase { @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 @@ public class StatusBarCommandQueueCallbacksTest extends SysuiTestCase { @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 index 86109367d504..953a330d2e65 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.row.NotificationGutsManager; 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.util.time.FakeSystemClock; 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 @@ import dagger.Lazy; @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 @@ public class StatusBarTest extends SysuiTestCase { @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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { mCommandQueue, mStatusBarComponentFactory, mPluginManager, - Optional.of(mLegacySplitScreen), - mStatusBarNotificationActivityStarterBuilder, mShadeController, mStatusBarKeyguardViewManager, mViewMediatorCallback, @@ -483,8 +475,8 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { @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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { @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 @@ public class StatusBarTest extends SysuiTestCase { // 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 class StatusBarTest extends SysuiTestCase { 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 @@ public class StatusBarTest extends SysuiTestCase { @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 6ce3b4b7b6f9..26ac70c70e7f 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 @@ public class DozeServiceHostTest extends SysuiTestCase { @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 @@ public class DozeServiceHostTest extends SysuiTestCase { mAuthController, mNotificationIconAreaController); mDozeServiceHost.initialize( - mStatusBar, + mCentralSurfaces, mStatusBarKeyguardViewManager, mNotificationShadeWindowViewController, mNotificationPanel, @@ -119,7 +119,7 @@ public class DozeServiceHostTest extends SysuiTestCase { mDozeServiceHost.startDozing(); verify(mStatusBarStateController).setIsDozing(eq(true)); - verify(mStatusBar).updateIsKeyguard(); + verify(mCentralSurfaces).updateIsKeyguard(); mDozeServiceHost.stopDozing(); verify(mStatusBarStateController).setIsDozing(eq(false)); @@ -128,8 +128,8 @@ public class DozeServiceHostTest extends SysuiTestCase { @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 @@ public class DozeServiceHostTest extends SysuiTestCase { 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 421d8f6a1889..db5741c90ebc 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 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @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 3257a84f14d6..31465f45af42 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 @@ import java.util.concurrent.Executor class KeyguardBottomAreaTest : SysuiTestCase() { @Mock - private lateinit var mStatusBar: StatusBar + private lateinit var mCentralSurfaces: CentralSurfaces private lateinit var mKeyguardBottomArea: KeyguardBottomAreaView @Before @@ -42,7 +42,7 @@ class KeyguardBottomAreaTest : SysuiTestCase() { 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 479c27192c55..38412fd1fa9b 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.NotificationEntryManager; 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 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { 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 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { 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 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mInteractionJankMonitor, mQsFrameTranslateController, mSysUiState, - mKeyguardUnlockAnimationController); + mKeyguardUnlockAnimationController, + mNotificationListContainer); mNotificationPanelViewController.initDependencies( - mStatusBar, + mCentralSurfaces, () -> {}, mNotificationShelfController); mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); @@ -904,6 +908,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { public void testSwitchesToCorrectClockInSplitShade() { mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); + clearInvocations(mKeyguardStatusViewController); when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0); triggerPositionClockAndNotifications(); @@ -918,11 +923,56 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { } @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 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { 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 class NotificationPanelViewControllerTest extends SysuiTestCase { 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 34a5d4b03dbb..093f92646115 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 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { @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 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() { 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 6c33113ae58b..62a1bcdc0184 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 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { @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 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { 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 589116184710..9ab88dc2d764 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.statusbar.policy.ConfigurationController 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 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { 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 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { 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 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { 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 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { 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 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { } } } - -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 8b93de571cc9..f4f55ccefd09 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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private KeyguardStateController mKeyguardStateController; @Mock - private StatusBar mStatusBar; + private CentralSurfaces mCentralSurfaces; @Mock private ViewGroup mContainer; @Mock @@ -118,7 +118,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { 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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { Optional.of(mSysUiUnfoldComponent), () -> mShadeController, mLatencyTracker); - mStatusBarKeyguardViewManager.registerStatusBar( - mStatusBar, + mStatusBarKeyguardViewManager.registerCentralSurfaces( + mCentralSurfaces, mNotificationPanelView, new PanelExpansionStateManager(), mBiometricUnlockController, @@ -261,7 +261,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @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 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @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 743311f99ca2..ace7415f2c17 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 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock - private StatusBar mStatusBar; + private CentralSurfaces mCentralSurfaces; @Mock private KeyguardStateController mKeyguardStateController; @Mock @@ -203,7 +203,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { mJankMonitor); mNotificationActivityStarter = - new StatusBarNotificationActivityStarter.Builder( + new StatusBarNotificationActivityStarter( getContext(), mock(CommandQueue.class), mHandler, @@ -229,18 +229,16 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { 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 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { 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 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { // 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 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { // 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 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { 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 7d9e6b4c1620..1a3dd3a7a2a5 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.keyguard.KeyguardUpdateMonitor; 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 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { 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 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { 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 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { 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 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { .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 71b32c0bd106..050563a5707c 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 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() { @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 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() { 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 586161716829..509509401d13 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 @@ package com.android.systemui.statusbar.phone.fragment; 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.Fragment; 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.fragment.dagger.StatusBarFragmentCom 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 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { 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 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { 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 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { mOperatorNameViewControllerFactory = mock(OperatorNameViewController.Factory.class); when(mOperatorNameViewControllerFactory.create(any())) .thenReturn(mOperatorNameViewController); + mSecureSettings = mock(SecureSettings.class); setUpNotificationIconAreaController(); return new CollapsedStatusBarFragment( @@ -334,7 +377,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { 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 807664d093da..ada0453acd86 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 @@ class OngoingCallControllerTest : SysuiTestCase() { val notificationCollection = mock(CommonNotifCollection::class.java) controller = OngoingCallController( + context, notificationCollection, mockOngoingCallFlags, clock, @@ -238,6 +239,18 @@ class OngoingCallControllerTest : SysuiTestCase() { 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/FakeConfigurationController.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt new file mode 100644 index 000000000000..3a5d9ee16b0a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt @@ -0,0 +1,31 @@ +package com.android.systemui.statusbar.policy + +import android.content.res.Configuration + +/** Fake implementation of [ConfigurationController] for tests. */ +class FakeConfigurationController : ConfigurationController { + + private var listener: ConfigurationController.ConfigurationListener? = null + + override fun addCallback(listener: ConfigurationController.ConfigurationListener) { + this.listener = listener + } + + override fun removeCallback(listener: ConfigurationController.ConfigurationListener) { + this.listener = null + } + + override fun onConfigurationChanged(newConfiguration: Configuration?) { + listener?.onConfigChanged(newConfiguration) + } + + override fun notifyThemeChanged() { + listener?.onThemeChanged() + } + + fun notifyConfigurationChanged() { + onConfigurationChanged(newConfiguration = null) + } + + override fun isLayoutRtl(): Boolean = false +} 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 07e0279e0c52..896dab6c060d 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.QSUserSwitcherEvent 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 @@ class UserSwitcherControllerTest : SysuiTestCase() { @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 @@ class UserSwitcherControllerTest : SysuiTestCase() { 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 000000000000..dead1592992d --- /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 8ad6271bfc7e..2be67edfc946 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 @@ public class FakeStatusBarIconController extends BaseLeakChecker<IconManager> } @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 593b97e55739..82880febc7f0 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 @@ public class BubblesTest extends SysuiTestCase { 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 6593823183f8..7726938db3b0 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.common.ShellExecutor; 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 @@ public class WMShellTest extends SysuiTestCase { @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 class WMShellTest extends SysuiTestCase { 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 @@ public class WMShellTest extends SysuiTestCase { } @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 2e4405f35cd6..dfc88f1e359b 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -88,7 +88,6 @@ filegroup { ":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 2b7b97737e0f..bf8b18ce3157 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.Handler; 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 @@ class AssociationRequestsProcessor { // 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 bc1f28d1c373..b991ba87eef4 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.NonNull; 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 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @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 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController * @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 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController 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 c0a904fe3d9a..dbb48aea94ff 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 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub 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 561009fe2a71..a2b289c6e8b9 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -103,7 +103,6 @@ java_library_static { ":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/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index efbc4deaf9f5..40ab0c07d166 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -651,100 +651,102 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } private void onMultiSimConfigChanged() { - 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); - - // 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; - } + synchronized (mRecords) { + int oldNumPhones = mNumPhones; + mNumPhones = getTelephonyManager().getActiveModemCount(); + if (oldNumPhones == 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])); + 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; + } + + // 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 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { + " 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 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { if (!checkNotifyPermission("notifyCarrierPrivilegesChanged")) { return; } - if (!validatePhoneId(phoneId)) return; if (VDBG) { log( "notifyCarrierPrivilegesChanged: phoneId=" + phoneId @@ -2859,6 +2860,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { + ", 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 64bba79949e9..20a850943577 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 @@ public class ActivityManagerService extends IActivityManager.Stub } 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 @@ public class ActivityManagerService extends IActivityManager.Stub dumpNormalPriority, dumpAppId, false /* dumpProxies */); } } + if (dumpAll) { + dumpAppRestrictionController(pw); + } } Binder.restoreCallingIdentity(origId); } @@ -14330,7 +14337,8 @@ public class ActivityManagerService extends IActivityManager.Stub 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 655e30982091..7579d2bc78fd 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 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> 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 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> } } 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 2ffd48739e47..561c10b93e34 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; 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 @@ public final class AppRestrictionController { // 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 @@ public final class AppRestrictionController { * 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { } @Override + @GuardedBy("mSettingsLock") public String toString() { final StringBuilder sb = new StringBuilder(128); sb.append("RestrictionLevel{"); @@ -313,6 +398,7 @@ public final class AppRestrictionController { return sb.toString(); } + @GuardedBy("mSettingsLock") void dump(PrintWriter pw, @ElapsedRealtimeLong long nowElapsed) { pw.print(toString()); if (mLastRestrictionLevel != RESTRICTION_LEVEL_UNKNOWN) { @@ -344,18 +430,22 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { return mLastNotificationShownTimeElapsed[notificationType]; } + @GuardedBy("mSettingsLock") void setLastNotificationTime(@NotificationHelper.NotificationType int notificationType, @ElapsedRealtimeLong long timestamp) { if (mLastNotificationShownTimeElapsed == null) { @@ -373,6 +464,7 @@ public final class AppRestrictionController { mLastNotificationShownTimeElapsed[notificationType] = timestamp; } + @GuardedBy("mSettingsLock") int getNotificationId(@NotificationHelper.NotificationType int notificationType) { if (mNotificationId == null) { return 0; @@ -380,6 +472,7 @@ public final class AppRestrictionController { return mNotificationId[notificationType]; } + @GuardedBy("mSettingsLock") void setNotificationId(@NotificationHelper.NotificationType int notificationType, int notificationId) { if (mNotificationId == null) { @@ -396,7 +489,7 @@ public final class AppRestrictionController { */ @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 @@ public final class AppRestrictionController { * @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 @@ public final class AppRestrictionController { } @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 @@ public final class AppRestrictionController { } @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 @@ public final class AppRestrictionController { } 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 @@ public final class AppRestrictionController { } } - @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 @@ public final class AppRestrictionController { } 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 @@ public final class AppRestrictionController { void onSystemReady() { DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, - ActivityThread.currentApplication().getMainExecutor(), mConstantsObserver); + mBgExecutor, mConstantsObserver); mConstantsObserver.start(); initBgRestrictionExemptioFromSysConfig(); initRestrictionStates(); @@ -826,10 +919,19 @@ public final class AppRestrictionController { @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 @@ public final class AppRestrictionController { } } + 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { || 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 @@ public final class AppRestrictionController { && 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { } }; - @GuardedBy("mLock") + @GuardedBy("mSettingsLock") private int mNotificationIDStepper = SUMMARY_NOTIFICATION_ID + 1; NotificationHelper(AppRestrictionController controller) { @@ -1462,6 +1575,7 @@ public final class AppRestrictionController { mInjector = controller.mInjector; mNotificationManager = mInjector.getNotificationManager(); mLock = controller.mLock; + mSettingsLock = controller.mSettingsLock; mContext = mInjector.getContext(); } @@ -1540,7 +1654,7 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { } 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 @@ public final class AppRestrictionController { } 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 @@ public final class AppRestrictionController { 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 @@ public final class AppRestrictionController { } 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 @@ public final class AppRestrictionController { } 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 8d77edabe3bf..6a211d31aa49 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 @@ public class OomAdjuster { 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 5a6c6a51bd97..f3a73f043c29 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 a7b49f1e51b0..9bfdd687644b 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2463,7 +2463,7 @@ public final class DisplayManagerService extends SystemService { 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 2e80efb957d4..7a0cf4b592e7 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 @@ final class LocalDisplayAdapter extends DisplayAdapter { 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 fb36dc792a67..d04b5a27cf43 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 @@ public class DisplayWhiteBalanceController implements 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 c42770555bab..176c08c8da29 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 @@ public class LocaleManagerService extends SystemService { 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 @@ public class LocaleManagerService extends SystemService { * <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 @@ public class LocaleManagerService extends SystemService { 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 @@ public class LocaleManagerService extends SystemService { } @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 b459be768b9f..32080ef356ae 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 @@ import com.android.internal.content.PackageMonitor; * * <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 @@ final class LocaleManagerServicePackageMonitor extends PackageMonitor { 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 000000000000..d13b1f4d2845 --- /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 45d9822205ec..fac510651878 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 @@ public class LocationManagerService extends ILocationManager.Stub implements if (provider != null && !provider.equals(manager.getName())) { continue; } - CallerIdentity identity = manager.getIdentity(); + CallerIdentity identity = manager.getProviderIdentity(); if (identity == null) { continue; } @@ -1149,7 +1149,7 @@ public class LocationManagerService extends ILocationManager.Stub implements return Collections.emptyList(); } - CallerIdentity identity = manager.getIdentity(); + CallerIdentity identity = manager.getProviderIdentity(); if (identity == null) { return Collections.emptyList(); } @@ -1536,7 +1536,7 @@ public class LocationManagerService extends ILocationManager.Stub implements 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 @@ public class LocationManagerService extends ILocationManager.Stub implements if (provider != null && !provider.equals(manager.getName())) { continue; } - if (identity.equals(manager.getIdentity())) { + if (identity.equals(manager.getProviderIdentity())) { return true; } } @@ -1665,7 +1665,7 @@ public class LocationManagerService extends ILocationManager.Stub implements 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 0b8f94c574c6..acbee11f3b72 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 @@ public class LocationProviderManager extends return mProvider.getState(); } - public @Nullable CallerIdentity getIdentity() { + public @Nullable CallerIdentity getProviderIdentity() { return mProvider.getState().identity; } @@ -1607,7 +1607,7 @@ public class LocationProviderManager extends 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 @@ public class LocationProviderManager extends 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 @@ public class LocationProviderManager extends 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/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index db0b0c58b046..54c201945be6 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 @@ final class InstallPackageHelper { + 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 000000000000..3543e9319a88 --- /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 243efb5e58ce..863f2d1a762d 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 @@ import com.android.server.SystemService; 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 @@ public class AttestationVerificationManagerService extends SystemService { 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 @@ public class AttestationVerificationManagerService extends SystemService { 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 000000000000..0f8be5a77944 --- /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 a8e2d439eb78..2f68f56a7de0 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 @@ public final class SensorPrivacyService extends SystemService { */ @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 1dea3d7943d8..fa243c023a87 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 @@ public class TrustAgentWrapper { 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 @@ public class TrustAgentWrapper { 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 b4c54f9beeb7..bd4b8d15f453 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { @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 @@ public class TrustManagerService extends SystemService { private final boolean mIsAutomotive; private final ContentResolver mContentResolver; - private boolean mTrustAgentsExtendUnlock; + private boolean mTrustAgentsNonrenewableTrust; private boolean mLockWhenTrustLost; /** @@ -295,11 +309,11 @@ public class TrustManagerService extends SystemService { @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 @@ public class TrustManagerService extends SystemService { } } - boolean getTrustAgentsExtendUnlock() { - return mTrustAgentsExtendUnlock; + boolean getTrustAgentsNonrenewableTrust() { + return mTrustAgentsNonrenewableTrust; } boolean getLockWhenTrustLost() { @@ -339,36 +353,53 @@ public class TrustManagerService extends SystemService { // 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; + int trustableTimeout = isTrustableTimeout ? 1 : 0; + mHandler.obtainMessage(MSG_SCHEDULE_TRUST_TIMEOUT, shouldOverride, + trustableTimeout).sendToTarget(); + } + + 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); } - mHandler.obtainMessage(MSG_SCHEDULE_TRUST_TIMEOUT, userId, shouldOverride).sendToTarget(); } - private void handleScheduleTrustTimeout(int userId, int 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { if (!trusted) { maybeLockScreen(userId); } else { - scheduleTrustTimeout(userId, false /* override */); + scheduleTrustTimeout(false /* override */, false /* isTrustableTimeout*/); } } } @@ -522,7 +606,12 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { // 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 @@ public class TrustManagerService extends SystemService { 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 @@ public class TrustManagerService extends SystemService { } } - 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 @@ public class TrustManagerService extends SystemService { @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 @@ public class TrustManagerService extends SystemService { maybeLockScreen(mUserId); } + protected abstract void handleAlarm(); + + public boolean isQueued() { + return mIsQueued; + } + public void setQueued(boolean isQueued) { mIsQueued = isQueued; } + } - public boolean isQueued() { - return mIsQueued; + 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 8f703c5c7761..57f77d5b7b94 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 @@ final class AccessibilityController { 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 @@ final class AccessibilityController { 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 @@ final class AccessibilityController { 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 c0fb83ba294c..43317adca04a 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 android.window.WindowInfosListener; 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { @Override public void onWindowInfosChanged(InputWindowHandle[] windowHandles, DisplayInfo[] displayInfos) { + 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(); - for (InputWindowHandle window : windowHandles) { - if (window.visible && window.getWindow() != null) { - mVisibleWindows.add(window); - } - } + 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); + 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); } - populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked(); } + + return windowsTransformMatrixMap; } } @@ -171,14 +211,43 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { } 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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; + } - final Matrix tempMatrix = new Matrix(); - tempMatrix.setValues(sTempFloats); + @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; + } + } + } - final Matrix inverseMatrix = new Matrix(); - final boolean result = tempMatrix.invert(inverseMatrix); + @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(); + transformMagnificationSpecToMatrix(spec, tempMatrix); + + 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 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener { 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 d7725865f609..26815b4c4fde 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 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } 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 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // 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 2a26050a24db..c9b850181669 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 @@ public class ActivityStartController { } 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 47bec3081dc3..fd2afd47bec4 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 @@ class ActivityStarter { 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 @@ class ActivityStarter { 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 @@ class ActivityStarter { 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 fe4eae915422..062e73d72d1d 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 9893f68c535b..487aff63b555 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 @@ class BackNavigationController { 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 @@ class BackNavigationController { + "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 @@ class BackNavigationController { 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 @@ class BackNavigationController { 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 83ff2f07a06f..195d4258c0d9 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @IntDef(flag = false, prefix = { "IME_TARGET_" }, value = { IME_TARGET_LAYERING, - IME_TARGET_INPUT, IME_TARGET_CONTROL, }) @Retention(RetentionPolicy.SOURCE) @@ -1642,18 +1641,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } private boolean isImeControlledByApp() { - return mImeInputTarget != null && !mImeInputTarget.inMultiWindowMode(); + return mImeInputTarget != null && mImeInputTarget.shouldControlIme(); } boolean shouldImeAttachedToApp() { @@ -3940,19 +3933,21 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * * @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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } @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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } // 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp 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 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // 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 2ab08e6da478..dcc16ebd88f5 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.IBinder; 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 @@ class EmbeddedWindowController { 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 @@ class EmbeddedWindowController { 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 @@ class EmbeddedWindowController { if (ew.mClient.asBinder() == client.asBinder()) { mWindows.removeAt(i).onRemoved(); mWindowsByFocusToken.remove(ew.getFocusGrantToken()); + mWindowsByWindowToken.remove(ew.getWindowToken()); return; } } @@ -127,6 +135,7 @@ class EmbeddedWindowController { if (ew.mHostWindowState == host) { mWindows.removeAt(i).onRemoved(); mWindowsByFocusToken.remove(ew.getFocusGrantToken()); + mWindowsByWindowToken.remove(ew.getWindowToken()); } } } @@ -139,6 +148,10 @@ class EmbeddedWindowController { 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 @@ class EmbeddedWindowController { } @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 @@ class EmbeddedWindowController { 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 f24e429ca09c..199517c441ad 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 android.view.InsetsState.ITYPE_IME; 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 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider } 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 44818a8c9ee4..31ae864fc090 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 class InputMonitor { 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 5166b8adcecc..b5ab62b6e03f 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 @@ interface InputTarget { /* Owning pid of the target. */ int getPid(); + int getUid(); /** * Indicates whether a target should receive focus from server side @@ -45,7 +47,25 @@ interface InputTarget { */ 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 3b8631ab3a8e..073bbbb8edf8 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 @@ package com.android.server.wm; 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 @@ class PendingRemoteAnimationRegistry { /** * 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 @@ class PendingRemoteAnimationRegistry { } else { options.setRemoteAnimationAdapter(entry.adapter); } + IBinder launchCookie = entry.launchCookie; + if (launchCookie != null) { + options.setLaunchCookie(launchCookie); + } mEntries.remove(callingPackage); return options; } @@ -69,10 +75,13 @@ class PendingRemoteAnimationRegistry { 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 bf33f86ac672..0f5828c7efb0 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 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe */ 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 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe } /** 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 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe && 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 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // 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 c13ae95217b5..b0532c2a1552 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 @@ class TransitionController { 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 @@ class TransitionController { /** * 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 bbc8462cae67..d306082c3e29 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 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< + " 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 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< 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 709f885db776..6445d1e657da 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.LockGuard.installLock; 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 @@ public class WindowManagerService extends IWindowManager.Stub } } - private WindowState getFocusedWindowLocked() { + WindowState getFocusedWindowLocked() { // Return the focused window in the focused display. return mRoot.getTopFocusedDisplayContent().mCurrentFocus; } @@ -5069,6 +5068,15 @@ public class WindowManagerService extends IWindowManager.Stub 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 @@ public class WindowManagerService extends IWindowManager.Stub 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 @@ public class WindowManagerService extends IWindowManager.Stub + " 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 @@ public class WindowManagerService extends IWindowManager.Stub } 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 @@ public class WindowManagerService extends IWindowManager.Stub 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 @@ public class WindowManagerService extends IWindowManager.Stub @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 4c7891b9fc51..c70a40c3b5fc 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 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 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub 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 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } } + 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 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub 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 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub 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 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub 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 26acf43cf9ed..517837c3732a 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_ENTER; 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } @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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mSession.mPid; } + @Override + public int getUid() { + return mSession.mUid; + } + Task getTask() { return mActivityRecord != null ? mActivityRecord.getTask() : null; } @@ -2348,7 +2352,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP * @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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP 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 97ef490184d9..ef61fbfa53ac 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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { * (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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { * 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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { 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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { 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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { 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 5098abe4bb55..a14e14b22684 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -415,10 +415,12 @@ public final class SystemServer implements Dumpable { 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 @@ public final class SystemServer implements Dumpable { 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 bcdbc5dd9657..ca67bcb7f38c 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.os.UserHandle; 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 @@ public class MidiService extends IMidiManager.Stub { 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 @@ public class MidiService extends IMidiManager.Stub { 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 @@ public class MidiService extends IMidiManager.Stub { 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 @@ public class MidiService extends IMidiManager.Stub { } } - // 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/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java index e6bb0ce318fe..053551309661 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 @@ public final class BackgroundRestrictionTest { @After public void tearDown() { + mBgRestrictionController.tearDown(); mBgRestrictionController.getBackgroundHandlerThread().quitSafely(); } @@ -561,6 +562,7 @@ public final class BackgroundRestrictionTest { DeviceConfigSession<Float> bgCurrentDrainRestrictedBucketThreshold = null; DeviceConfigSession<Float> bgCurrentDrainBgRestrictedThreshold = null; DeviceConfigSession<Boolean> bgPromptFgsWithNotiToBgRestricted = null; + DeviceConfigSession<Long> bgNotificationMinInterval = null; mBgRestrictionController.addAppBackgroundRestrictionListener(listener); @@ -615,6 +617,13 @@ public final class BackgroundRestrictionTest { 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 @@ public final class BackgroundRestrictionTest { // 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 @@ public final class BackgroundRestrictionTest { mAppFGSTracker.onForegroundServiceNotificationUpdated( testPkgName, testUid, -notificationId); clearInvocations(mInjector.getAppStandbyInternal()); + clearInvocations(mInjector.getNotificationManager()); clearInvocations(mBgRestrictionController); runTestBgCurrentDrainMonitorOnce(listener, stats, uids, @@ -832,6 +843,7 @@ public final class BackgroundRestrictionTest { // 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 @@ public final class BackgroundRestrictionTest { closeIfNotNull(bgCurrentDrainRestrictedBucketThreshold); closeIfNotNull(bgCurrentDrainBgRestrictedThreshold); closeIfNotNull(bgPromptFgsWithNotiToBgRestricted); + closeIfNotNull(bgNotificationMinInterval); } } @@ -1921,6 +1934,7 @@ public final class BackgroundRestrictionTest { .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 a0ac50634a7b..9a4f8e261124 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 @@ public class QuotaControllerTest { } 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 @@ public class QuotaControllerTest { } } - 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { // 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { // 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 @@ public class QuotaControllerTest { // 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 @@ public class QuotaControllerTest { 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 4e4854c6688d..d8f409dfce66 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 class LocationProviderManagerTest { 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 @@ public class LocationProviderManagerTest { 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 a6c81a08b962..152f3b3abd13 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -25,7 +25,6 @@ android_test { "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 3160272ef9b1..f0c907d49a46 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 com.google.common.truth.Truth.assertThat; 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 @@ public class VirtualAudioControllerTest { /* 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 0287510041be..bd35be4d0f3e 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 @@ public class LocaleManagerBackupRestoreTest { private PackageManager mMockPackageManager; @Mock private LocaleManagerService mMockLocaleManagerService; + BroadcastReceiver mUserMonitor; PackageMonitor mPackageMonitor; @@ -131,6 +132,7 @@ public class LocaleManagerBackupRestoreTest { 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 @@ public class LocaleManagerBackupRestoreTest { 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 000000000000..5185e15a8557 --- /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/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 9f7130e45483..c08387024818 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.same; 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 @@ public class DisplayContentTests extends WindowTestsBase { app.removeImmediately(); - assertNull(dc.getImeTarget(IME_TARGET_INPUT)); + assertNull(dc.getImeInputTarget()); assertNull(dc.computeImeControlTarget()); } @@ -1126,19 +1125,19 @@ public class DisplayContentTests extends WindowTestsBase { 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 @@ public class DisplayContentTests extends WindowTestsBase { 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 @@ public class DisplayContentTests extends WindowTestsBase { 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 e3876150bf99..90a6918644fa 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 android.view.WindowManager.LayoutParams.TYPE_APPLICATION; 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 @@ public class InsetsStateControllerTest extends WindowTestsBase { // 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 f0071499a2f9..972567b10da7 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.assertNotNull; 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 @@ import org.mockito.MockitoAnnotations; 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 @@ public class PendingRemoteAnimationRegistryTest { @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 @@ public class PendingRemoteAnimationRegistryTest { @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 @@ public class PendingRemoteAnimationRegistryTest { @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 d74e1be88e0b..29289a404791 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 @@ public class TransitionTests extends WindowTestsBase { 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 a442de5a32c8..5743922d0428 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 @@ public class WindowContainerTests extends WindowTestsBase { } @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 8d9252019538..7129a27c3cd6 100644 --- a/telephony/java/android/service/euicc/EuiccService.java +++ b/telephony/java/android/service/euicc/EuiccService.java @@ -29,7 +29,6 @@ import android.content.Intent; 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 abstract class EuiccService extends Service { 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 0394a546388d..1eb391d60e4d 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -48,6 +48,7 @@ import android.compat.annotation.EnabledAfter; 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.Locale; 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 @@ public class TelephonyManager { @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 @@ public class TelephonyManager { 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 @@ public class TelephonyManager { 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 @@ public class TelephonyManager { (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 @@ public class TelephonyManager { }) @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 @@ public class TelephonyManager { * 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 @@ public class TelephonyManager { 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 class TelephonyManager { */ 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 @@ public class TelephonyManager { * 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 a4741eedaac0..b98f8cb0c21d 100644 --- a/tests/AttestationVerificationTest/Android.bp +++ b/tests/AttestationVerificationTest/Android.bp @@ -40,5 +40,6 @@ android_test { "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 c42bde9dca3a..37321ad80b0f 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 000000000000..e29ff487806e --- /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 000000000000..3d6410af042a --- /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 000000000000..6d261fae47cf --- /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 000000000000..c51851fe3da5 --- /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 000000000000..282771000bf7 --- /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 000000000000..32c2230e4880 --- /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 62902929fcd5..169effaa45ca 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.Test 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 @@ class SystemAttestationVerificationTest { @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 @@ class SystemAttestationVerificationTest { @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 @@ class SystemAttestationVerificationTest { @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 000000000000..0d15fe72920a --- /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 000000000000..45f2e5c6fdf7 --- /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" + } +} |