diff options
326 files changed, 8742 insertions, 2988 deletions
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index 6c3951da3883..de4e7bd42cbc 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -11,3 +11,5 @@ checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPL api_lint_hook = ${REPO_ROOT}/frameworks/base/tools/apilint/apilint_sha.sh ${PREUPLOAD_COMMIT} strings_lint_hook = ${REPO_ROOT}/frameworks/base/tools/stringslint/stringslint_sha.sh ${PREUPLOAD_COMMIT} + +hidden_api_txt_hook = ${REPO_ROOT}/frameworks/base/tools/hiddenapi/checksorted_sha.sh ${PREUPLOAD_COMMIT} ${REPO_ROOT} diff --git a/api/removed.txt b/api/removed.txt index 833d8ecbeb03..f35348ec8bfd 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -321,14 +321,6 @@ package android.net { public static abstract class NetworkBadging.Badging implements java.lang.annotation.Annotation { } - public class NetworkRequest implements android.os.Parcelable { - method public boolean hasUnwantedCapability(int); - } - - public static class NetworkRequest.Builder { - method public android.net.NetworkRequest.Builder addUnwantedCapability(int); - } - public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory { method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache); } diff --git a/api/test-current.txt b/api/test-current.txt index f7bfeaeb02b0..5cffd0e1b3b7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -917,6 +917,7 @@ package android.telephony { public class TelephonyManager { method public int getCarrierIdListVersion(); + method public void refreshUiccProfile(); method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String); field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff } diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index 5612ba2b1204..622847334292 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -1,44 +1,38 @@ Landroid/accounts/AccountManager;->mContext:Landroid/content/Context; +Landroid/accounts/IAccountAuthenticator$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/accounts/IAccountAuthenticator$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/accounts/IAccountAuthenticator$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticator; +Landroid/accounts/IAccountAuthenticator;->addAccount(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)V +Landroid/accounts/IAccountAuthenticator;->confirmCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)V +Landroid/accounts/IAccountAuthenticator;->editProperties(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V +Landroid/accounts/IAccountAuthenticator;->getAccountRemovalAllowed(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;)V +Landroid/accounts/IAccountAuthenticator;->getAuthToken(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V +Landroid/accounts/IAccountAuthenticator;->getAuthTokenLabel(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V +Landroid/accounts/IAccountAuthenticator;->hasFeatures(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)V +Landroid/accounts/IAccountAuthenticator;->updateCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V +Landroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/accounts/IAccountAuthenticatorResponse$Stub;-><init>()V -Landroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager; +Landroid/accounts/IAccountAuthenticatorResponse$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticatorResponse; Landroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Landroid/animation/LayoutTransition;->cancel(I)V +Landroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager; +Landroid/accounts/IAccountManagerResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/accounts/IAccountManagerResponse$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/accounts/IAccountManagerResponse$Stub;-><init>()V +Landroid/accounts/IAccountManagerResponse$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManagerResponse; +Landroid/accounts/IAccountManagerResponse;->onError(ILjava/lang/String;)V +Landroid/accounts/IAccountManagerResponse;->onResult(Landroid/os/Bundle;)V Landroid/animation/LayoutTransition;->cancel()V +Landroid/animation/LayoutTransition;->cancel(I)V Landroid/animation/ValueAnimator;->animateValue(F)V Landroid/animation/ValueAnimator;->sDurationScale:F +Landroid/app/ActionBar;->setShowHideAnimationEnabled(Z)V Landroid/app/Activity;->getActivityOptions()Landroid/app/ActivityOptions; Landroid/app/Activity;->getActivityToken()Landroid/os/IBinder; -Landroid/app/ActivityGroup;->mLocalActivityManager:Landroid/app/LocalActivityManager; Landroid/app/Activity;->mActivityInfo:Landroid/content/pm/ActivityInfo; -Landroid/app/ActivityManager;->clearApplicationUserData(Ljava/lang/String;Landroid/content/pm/IPackageDataObserver;)Z -Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I -Landroid/app/ActivityManager;->getService()Landroid/app/IActivityManager; -Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton; -Landroid/app/ActivityManager;->isHighEndGfx()Z -Landroid/app/ActivityManager;->isLowRamDeviceStatic()Z -Landroid/app/ActivityManager;->isUserRunning(I)Z -Landroid/app/ActivityManager;->mContext:Landroid/content/Context; -Landroid/app/ActivityManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityManager; -Landroid/app/ActivityManagerNative;->getDefault()Landroid/app/IActivityManager; -Landroid/app/ActivityManager;->PROCESS_STATE_IMPORTANT_BACKGROUND:I -Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I -Landroid/app/ActivityManager$RecentTaskInfo;->firstActiveTime:J -Landroid/app/ActivityManager$RecentTaskInfo;->lastActiveTime:J -Landroid/app/ActivityManager$RecentTaskInfo;->resizeMode:I -Landroid/app/ActivityManager$RecentTaskInfo;->supportsSplitScreenMultiWindow:Z -Landroid/app/ActivityManager$RecentTaskInfo;->userId:I -Landroid/app/ActivityManager$RunningAppProcessInfo;->flags:I -Landroid/app/ActivityManager$RunningAppProcessInfo;->processState:I -Landroid/app/ActivityManager;->setPersistentVrThread(I)V -Landroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I -Landroid/app/ActivityManager$TaskDescription;->getInMemoryIcon()Landroid/graphics/Bitmap; -Landroid/app/ActivityManager$TaskSnapshot;->getContentInsets()Landroid/graphics/Rect; -Landroid/app/ActivityManager$TaskSnapshot;->getOrientation()I -Landroid/app/ActivityManager$TaskSnapshot;->getScale()F -Landroid/app/ActivityManager$TaskSnapshot;->isRealSnapshot()Z -Landroid/app/ActivityManager$TaskSnapshot;->isReducedResolution()Z Landroid/app/Activity;->mApplication:Landroid/app/Application; Landroid/app/Activity;->mComponent:Landroid/content/ComponentName; +Landroid/app/Activity;->mFinished:Z Landroid/app/Activity;->mFragments:Landroid/app/FragmentController; Landroid/app/Activity;->mHandler:Landroid/os/Handler; Landroid/app/Activity;->mInstrumentation:Landroid/app/Instrumentation; @@ -50,11 +44,39 @@ Landroid/app/Activity;->mResumed:Z Landroid/app/Activity;->mToken:Landroid/os/IBinder; Landroid/app/Activity;->mWindow:Landroid/view/Window; Landroid/app/Activity;->mWindowManager:Landroid/view/WindowManager; -Landroid/app/ActivityOptions;->makeMultiThumbFutureAspectScaleAnimation(Landroid/content/Context;Landroid/os/Handler;Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/app/ActivityOptions$OnAnimationStartedListener;Z)Landroid/app/ActivityOptions; Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V Landroid/app/Activity;->setPersistent(Z)V -Landroid/app/ActivityThread$ActivityClientRecord;->activityInfo:Landroid/content/pm/ActivityInfo; +Landroid/app/ActivityGroup;->mLocalActivityManager:Landroid/app/LocalActivityManager; +Landroid/app/ActivityManager$RecentTaskInfo;->firstActiveTime:J +Landroid/app/ActivityManager$RecentTaskInfo;->lastActiveTime:J +Landroid/app/ActivityManager$RecentTaskInfo;->resizeMode:I +Landroid/app/ActivityManager$RecentTaskInfo;->supportsSplitScreenMultiWindow:Z +Landroid/app/ActivityManager$RecentTaskInfo;->userId:I +Landroid/app/ActivityManager$RunningAppProcessInfo;->flags:I +Landroid/app/ActivityManager$RunningAppProcessInfo;->processState:I +Landroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I +Landroid/app/ActivityManager$TaskDescription;->getInMemoryIcon()Landroid/graphics/Bitmap; +Landroid/app/ActivityManager$TaskSnapshot;->getContentInsets()Landroid/graphics/Rect; +Landroid/app/ActivityManager$TaskSnapshot;->getOrientation()I +Landroid/app/ActivityManager$TaskSnapshot;->getScale()F +Landroid/app/ActivityManager$TaskSnapshot;->isRealSnapshot()Z +Landroid/app/ActivityManager$TaskSnapshot;->isReducedResolution()Z +Landroid/app/ActivityManager;->clearApplicationUserData(Ljava/lang/String;Landroid/content/pm/IPackageDataObserver;)Z +Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I +Landroid/app/ActivityManager;->getService()Landroid/app/IActivityManager; +Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton; +Landroid/app/ActivityManager;->isHighEndGfx()Z +Landroid/app/ActivityManager;->isLowRamDeviceStatic()Z +Landroid/app/ActivityManager;->isUserRunning(I)Z +Landroid/app/ActivityManager;->mContext:Landroid/content/Context; +Landroid/app/ActivityManager;->PROCESS_STATE_IMPORTANT_BACKGROUND:I +Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I +Landroid/app/ActivityManager;->setPersistentVrThread(I)V +Landroid/app/ActivityManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityManager; +Landroid/app/ActivityManagerNative;->getDefault()Landroid/app/IActivityManager; +Landroid/app/ActivityOptions;->makeMultiThumbFutureAspectScaleAnimation(Landroid/content/Context;Landroid/os/Handler;Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/app/ActivityOptions$OnAnimationStartedListener;Z)Landroid/app/ActivityOptions; Landroid/app/ActivityThread$ActivityClientRecord;->activity:Landroid/app/Activity; +Landroid/app/ActivityThread$ActivityClientRecord;->activityInfo:Landroid/content/pm/ActivityInfo; Landroid/app/ActivityThread$ActivityClientRecord;->compatInfo:Landroid/content/res/CompatibilityInfo; Landroid/app/ActivityThread$ActivityClientRecord;->intent:Landroid/content/Intent; Landroid/app/ActivityThread$ActivityClientRecord;->mPreserveWindow:Z @@ -71,10 +93,32 @@ Landroid/app/ActivityThread$AppBindData;->providers:Ljava/util/List; Landroid/app/ActivityThread$AppBindData;->restrictedBackupMode:Z Landroid/app/ActivityThread$BindServiceData;->intent:Landroid/content/Intent; Landroid/app/ActivityThread$BindServiceData;->token:Landroid/os/IBinder; +Landroid/app/ActivityThread$CreateServiceData;-><init>()V Landroid/app/ActivityThread$CreateServiceData;->compatInfo:Landroid/content/res/CompatibilityInfo; Landroid/app/ActivityThread$CreateServiceData;->info:Landroid/content/pm/ServiceInfo; Landroid/app/ActivityThread$CreateServiceData;->intent:Landroid/content/Intent; Landroid/app/ActivityThread$CreateServiceData;->token:Landroid/os/IBinder; +Landroid/app/ActivityThread$H;->BIND_SERVICE:I +Landroid/app/ActivityThread$H;->CREATE_SERVICE:I +Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I +Landroid/app/ActivityThread$H;->ENTER_ANIMATION_COMPLETE:I +Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I +Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I +Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I +Landroid/app/ActivityThread$H;->RECEIVER:I +Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I +Landroid/app/ActivityThread$H;->SCHEDULE_CRASH:I +Landroid/app/ActivityThread$H;->SERVICE_ARGS:I +Landroid/app/ActivityThread$H;->STOP_SERVICE:I +Landroid/app/ActivityThread$H;->UNBIND_SERVICE:I +Landroid/app/ActivityThread$ProviderClientRecord;->mHolder:Landroid/app/ContentProviderHolder; +Landroid/app/ActivityThread$ProviderClientRecord;->mLocalProvider:Landroid/content/ContentProvider; +Landroid/app/ActivityThread$ProviderClientRecord;->mProvider:Landroid/content/IContentProvider; +Landroid/app/ActivityThread$ReceiverData;->compatInfo:Landroid/content/res/CompatibilityInfo; +Landroid/app/ActivityThread$ReceiverData;->info:Landroid/content/pm/ActivityInfo; +Landroid/app/ActivityThread$ReceiverData;->intent:Landroid/content/Intent; +Landroid/app/ActivityThread$ServiceArgsData;->args:Landroid/content/Intent; +Landroid/app/ActivityThread$ServiceArgsData;->token:Landroid/os/IBinder; Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; Landroid/app/ActivityThread;->currentApplication()Landroid/app/Application; Landroid/app/ActivityThread;->currentPackageName()Ljava/lang/String; @@ -90,31 +134,19 @@ Landroid/app/ActivityThread;->getPackageManager()Landroid/content/pm/IPackageMan Landroid/app/ActivityThread;->getProcessName()Ljava/lang/String; Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl; Landroid/app/ActivityThread;->handleBindApplication(Landroid/app/ActivityThread$AppBindData;)V -Landroid/app/ActivityThread$H;->BIND_SERVICE:I -Landroid/app/ActivityThread$H;->CREATE_SERVICE:I -Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I -Landroid/app/ActivityThread$H;->ENTER_ANIMATION_COMPLETE:I -Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I -Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I -Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I -Landroid/app/ActivityThread$H;->RECEIVER:I -Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I -Landroid/app/ActivityThread$H;->SCHEDULE_CRASH:I -Landroid/app/ActivityThread$H;->SERVICE_ARGS:I -Landroid/app/ActivityThread$H;->STOP_SERVICE:I -Landroid/app/ActivityThread$H;->UNBIND_SERVICE:I Landroid/app/ActivityThread;->installContentProviders(Landroid/content/Context;Ljava/util/List;)V Landroid/app/ActivityThread;->installProvider(Landroid/content/Context;Landroid/app/ContentProviderHolder;Landroid/content/pm/ProviderInfo;ZZZ)Landroid/app/ContentProviderHolder; Landroid/app/ActivityThread;->mActivities:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mAllApplications:Ljava/util/ArrayList; Landroid/app/ActivityThread;->mBoundApplication:Landroid/app/ActivityThread$AppBindData; Landroid/app/ActivityThread;->mConfiguration:Landroid/content/res/Configuration; +Landroid/app/ActivityThread;->mCurDefaultDisplayDpi:I Landroid/app/ActivityThread;->mDensityCompatMode:Z Landroid/app/ActivityThread;->mH:Landroid/app/ActivityThread$H; Landroid/app/ActivityThread;->mInitialApplication:Landroid/app/Application; Landroid/app/ActivityThread;->mInstrumentation:Landroid/app/Instrumentation; -Landroid/app/ActivityThread;->mLocalProvidersByName:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mLocalProviders:Landroid/util/ArrayMap; +Landroid/app/ActivityThread;->mLocalProvidersByName:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mNumVisibleActivities:I Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mPendingConfiguration:Landroid/content/res/Configuration; @@ -124,30 +156,22 @@ Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager; Landroid/app/ActivityThread;->mServices:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->performNewIntents(Landroid/os/IBinder;Ljava/util/List;Z)V Landroid/app/ActivityThread;->performStopActivity(Landroid/os/IBinder;ZLjava/lang/String;)V -Landroid/app/ActivityThread$ProviderClientRecord;->mHolder:Landroid/app/ContentProviderHolder; -Landroid/app/ActivityThread$ProviderClientRecord;->mLocalProvider:Landroid/content/ContentProvider; -Landroid/app/ActivityThread$ProviderClientRecord;->mProvider:Landroid/content/IContentProvider; -Landroid/app/ActivityThread$ReceiverData;->compatInfo:Landroid/content/res/CompatibilityInfo; -Landroid/app/ActivityThread$ReceiverData;->info:Landroid/content/pm/ActivityInfo; -Landroid/app/ActivityThread$ReceiverData;->intent:Landroid/content/Intent; Landroid/app/ActivityThread;->sCurrentActivityThread:Landroid/app/ActivityThread; Landroid/app/ActivityThread;->sendActivityResult(Landroid/os/IBinder;Ljava/lang/String;IILandroid/content/Intent;)V -Landroid/app/ActivityThread$ServiceArgsData;->args:Landroid/content/Intent; -Landroid/app/ActivityThread$ServiceArgsData;->token:Landroid/os/IBinder; Landroid/app/ActivityThread;->sPackageManager:Landroid/content/pm/IPackageManager; Landroid/app/ActivityThread;->startActivityNow(Landroid/app/Activity;Ljava/lang/String;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/Activity$NonConfigurationInstances;)Landroid/app/Activity; Landroid/app/admin/DevicePolicyManager;->getMandatoryBackupTransport()Landroid/content/ComponentName; Landroid/app/admin/DevicePolicyManager;->getProfileOwnerAsUser(I)Landroid/content/ComponentName; Landroid/app/admin/DevicePolicyManager;->getTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;I)Ljava/util/List; Landroid/app/admin/DevicePolicyManager;->packageHasActiveAdmins(Ljava/lang/String;I)Z -Landroid/app/admin/DevicePolicyManager;->setActiveAdmin(Landroid/content/ComponentName;ZI)V Landroid/app/admin/DevicePolicyManager;->setActiveAdmin(Landroid/content/ComponentName;Z)V +Landroid/app/admin/DevicePolicyManager;->setActiveAdmin(Landroid/content/ComponentName;ZI)V Landroid/app/admin/DevicePolicyManager;->setDefaultSmsApplication(Landroid/content/ComponentName;Ljava/lang/String;)V Landroid/app/admin/DevicePolicyManager;->throwIfParentInstance(Ljava/lang/String;)V +Landroid/app/admin/IDevicePolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/admin/IDevicePolicyManager; Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_packageHasActiveAdmins:I Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_removeActiveAdmin:I Landroid/app/admin/SecurityLog$SecurityEvent;-><init>([B)V -Landroid/app/ActionBar;->setShowHideAnimationEnabled(Z)V Landroid/app/AlarmManager;->FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED:I Landroid/app/AlarmManager;->FLAG_IDLE_UNTIL:I Landroid/app/AlarmManager;->FLAG_STANDALONE:I @@ -171,17 +195,19 @@ Landroid/app/Application;->dispatchActivityResumed(Landroid/app/Activity;)V Landroid/app/Application;->dispatchActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V Landroid/app/Application;->dispatchActivityStarted(Landroid/app/Activity;)V Landroid/app/Application;->dispatchActivityStopped(Landroid/app/Activity;)V -Landroid/app/ApplicationLoaders;->getDefault()Landroid/app/ApplicationLoaders; -Landroid/app/ApplicationLoaders;->mLoaders:Landroid/util/ArrayMap; Landroid/app/Application;->mComponentCallbacks:Ljava/util/ArrayList; Landroid/app/Application;->mLoadedApk:Landroid/app/LoadedApk; +Landroid/app/ApplicationLoaders;->getDefault()Landroid/app/ApplicationLoaders; +Landroid/app/ApplicationLoaders;->mLoaders:Landroid/util/ArrayMap; +Landroid/app/ApplicationPackageManager;-><init>(Landroid/app/ContextImpl;Landroid/content/pm/IPackageManager;)V Landroid/app/ApplicationPackageManager;->configurationChanged()V Landroid/app/ApplicationPackageManager;->deletePackage(Ljava/lang/String;Landroid/content/pm/IPackageDeleteObserver;I)V Landroid/app/ApplicationPackageManager;->getPackageCurrentVolume(Landroid/content/pm/ApplicationInfo;)Landroid/os/storage/VolumeInfo; Landroid/app/ApplicationPackageManager;->getPackageSizeInfoAsUser(Ljava/lang/String;ILandroid/content/pm/IPackageStatsObserver;)V -Landroid/app/ApplicationPackageManager;-><init>(Landroid/app/ContextImpl;Landroid/content/pm/IPackageManager;)V Landroid/app/ApplicationPackageManager;->mPM:Landroid/content/pm/IPackageManager; Landroid/app/ApplicationPackageManager;->shouldShowRequestPermissionRationale(Ljava/lang/String;)Z +Landroid/app/AppOpsManager$OpEntry;->getDuration()I +Landroid/app/AppOpsManager$OpEntry;->getRejectTime()J Landroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I Landroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I Landroid/app/AppOpsManager;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List; @@ -190,8 +216,6 @@ Landroid/app/AppOpsManager;->noteOp(I)I Landroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I Landroid/app/AppOpsManager;->OP_AUDIO_NOTIFICATION_VOLUME:I Landroid/app/AppOpsManager;->OP_COARSE_LOCATION:I -Landroid/app/AppOpsManager$OpEntry;->getDuration()I -Landroid/app/AppOpsManager$OpEntry;->getRejectTime()J Landroid/app/AppOpsManager;->OP_FINE_LOCATION:I Landroid/app/AppOpsManager;->OP_GET_USAGE_STATS:I Landroid/app/AppOpsManager;->OP_POST_NOTIFICATION:I @@ -205,6 +229,8 @@ Landroid/app/AppOpsManager;->OP_WIFI_SCAN:I Landroid/app/AppOpsManager;->OP_WRITE_CONTACTS:I Landroid/app/AppOpsManager;->OP_WRITE_SMS:I Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I +Landroid/app/AppOpsManager;->setRestriction(III[Ljava/lang/String;)V +Landroid/app/AppOpsManager;->sOpPerms:[Ljava/lang/String; Landroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I Landroid/app/backup/BackupDataInput$EntityHeader;->dataSize:I Landroid/app/backup/BackupDataInput$EntityHeader;->key:Ljava/lang/String; @@ -215,11 +241,12 @@ Landroid/app/backup/BackupHelperDispatcher$Header;->chunkSize:I Landroid/app/backup/BackupHelperDispatcher$Header;->keyPrefix:Ljava/lang/String; Landroid/app/backup/FileBackupHelperBase;->writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V Landroid/app/backup/FullBackup;->backupToTar(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/backup/FullBackupDataOutput;)I -Landroid/app/backup/FullBackupDataOutput;->addSize(J)V Landroid/app/backup/FullBackupDataOutput;-><init>(Landroid/os/ParcelFileDescriptor;)V +Landroid/app/backup/FullBackupDataOutput;->addSize(J)V Landroid/app/backup/FullBackupDataOutput;->mData:Landroid/app/backup/BackupDataOutput; -Landroid/app/ContentProviderHolder;->info:Landroid/content/pm/ProviderInfo; +Landroid/app/backup/IBackupManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupManager; Landroid/app/ContentProviderHolder;-><init>(Landroid/content/pm/ProviderInfo;)V +Landroid/app/ContentProviderHolder;->info:Landroid/content/pm/ProviderInfo; Landroid/app/ContentProviderHolder;->provider:Landroid/content/IContentProvider; Landroid/app/ContextImpl;->createActivityContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;ILandroid/content/res/Configuration;)Landroid/app/ContextImpl; Landroid/app/ContextImpl;->getActivityToken()Landroid/os/IBinder; @@ -249,13 +276,20 @@ Landroid/app/Dialog;->mDismissMessage:Landroid/os/Message; Landroid/app/Dialog;->mListenersHandler:Landroid/os/Handler; Landroid/app/Dialog;->mOwnerActivity:Landroid/app/Activity; Landroid/app/Dialog;->mShowMessage:Landroid/os/Message; +Landroid/app/DialogFragment;->showAllowingStateLoss(Landroid/app/FragmentManager;Ljava/lang/String;)V Landroid/app/DownloadManager$Request;->mUri:Landroid/net/Uri; Landroid/app/DownloadManager;->setAccessFilename(Z)V +Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl; +Landroid/app/Fragment;->mWho:Ljava/lang/String; Landroid/app/FragmentManagerImpl;->mAdded:Ljava/util/ArrayList; Landroid/app/FragmentManagerImpl;->mStateSaved:Z Landroid/app/FragmentManagerImpl;->noteStateNotSaved()V -Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl; -Landroid/app/Fragment;->mWho:Ljava/lang/String; +Landroid/app/IActivityManager$Stub$Proxy;->getConfiguration()Landroid/content/res/Configuration; +Landroid/app/IActivityManager$Stub$Proxy;->getLaunchedFromUid(Landroid/os/IBinder;)I +Landroid/app/IActivityManager$Stub$Proxy;->getProcessLimit()I +Landroid/app/IActivityManager$Stub$Proxy;->getProcessPss([I)[J +Landroid/app/IActivityManager$Stub$Proxy;->isAppForeground(I)Z +Landroid/app/IActivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/app/IActivityManager;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I Landroid/app/IActivityManager;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I Landroid/app/IActivityManager;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z @@ -266,6 +300,7 @@ Landroid/app/IActivityManager;->getIntentSender(ILjava/lang/String;Landroid/os/I Landroid/app/IActivityManager;->getLaunchedFromPackage(Landroid/os/IBinder;)Ljava/lang/String; Landroid/app/IActivityManager;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String; Landroid/app/IActivityManager;->getTaskForActivity(Landroid/os/IBinder;Z)I +Landroid/app/IActivityManager;->moveActivityTaskToBack(Landroid/os/IBinder;Z)Z Landroid/app/IActivityManager;->moveTaskToFront(IILandroid/os/Bundle;)V Landroid/app/IActivityManager;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V Landroid/app/IActivityManager;->requestBugReport(I)V @@ -274,39 +309,68 @@ Landroid/app/IActivityManager;->setActivityController(Landroid/app/IActivityCont Landroid/app/IActivityManager;->setRequestedOrientation(Landroid/os/IBinder;I)V Landroid/app/IActivityManager;->setTaskResizeable(II)V Landroid/app/IActivityManager;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I -Landroid/app/IActivityManager$Stub$Proxy;->getConfiguration()Landroid/content/res/Configuration; -Landroid/app/IActivityManager$Stub$Proxy;->getLaunchedFromUid(Landroid/os/IBinder;)I -Landroid/app/IActivityManager$Stub$Proxy;->getProcessLimit()I -Landroid/app/IActivityManager$Stub$Proxy;->getProcessPss([I)[J -Landroid/app/IActivityManager$Stub$Proxy;->isAppForeground(I)Z -Landroid/app/IActivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/app/IActivityManager;->unbindService(Landroid/app/IServiceConnection;)Z Landroid/app/IActivityManager;->unstableProviderDied(Landroid/os/IBinder;)V Landroid/app/IAlarmManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager; Landroid/app/IAlarmManager$Stub;->TRANSACTION_remove:I Landroid/app/IAlarmManager$Stub;->TRANSACTION_set:I Landroid/app/IApplicationThread;->scheduleTrimMemory(I)V +Landroid/app/IAppTask;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo; +Landroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager; Landroid/app/INotificationManager;->cancelAllNotifications(Ljava/lang/String;I)V Landroid/app/INotificationManager;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;II)V Landroid/app/INotificationManager;->cancelToast(Ljava/lang/String;Landroid/app/ITransientNotification;)V Landroid/app/INotificationManager;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;I)V -Landroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager; -Landroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/app/Instrumentation;->execStartActivities(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;[Landroid/content/Intent;Landroid/os/Bundle;)V Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/Instrumentation$ActivityResult; Landroid/app/IntentService;->mServiceHandler:Landroid/app/IntentService$ServiceHandler; Landroid/app/IProcessObserver$Stub;-><init>()V -Landroid/app/ISearchManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/ISearchManager; Landroid/app/ISearchManager$Stub$Proxy;->getGlobalSearchActivity()Landroid/content/ComponentName; Landroid/app/ISearchManager$Stub$Proxy;->getWebSearchActivity()Landroid/content/ComponentName; +Landroid/app/ISearchManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/ISearchManager; +Landroid/app/IServiceConnection$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/IServiceConnection$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/app/IServiceConnection$Stub;-><init>()V Landroid/app/IServiceConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IServiceConnection; +Landroid/app/IStopUserCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/IStopUserCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/app/IStopUserCallback$Stub;-><init>()V Landroid/app/IStopUserCallback;->userStopped(I)V Landroid/app/IUiModeManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/app/IWallpaperManager;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor; -Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler; +Landroid/app/job/IJobCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/job/IJobCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/app/job/IJobCallback$Stub;-><init>()V +Landroid/app/job/IJobCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobCallback; +Landroid/app/job/IJobCallback;->acknowledgeStartMessage(IZ)V +Landroid/app/job/IJobCallback;->acknowledgeStopMessage(IZ)V +Landroid/app/job/IJobCallback;->jobFinished(IZ)V Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler; +Landroid/app/job/IJobService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/app/job/IJobService$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/app/job/IJobService$Stub;-><init>()V +Landroid/app/job/IJobService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobService; +Landroid/app/job/IJobService;->startJob(Landroid/app/job/JobParameters;)V +Landroid/app/job/IJobService;->stopJob(Landroid/app/job/JobParameters;)V +Landroid/app/job/JobInfo;->flags:I +Landroid/app/job/JobInfo;->jobId:I +Landroid/app/job/JobInfo;->service:Landroid/content/ComponentName; +Landroid/app/job/JobParameters;->callback:Landroid/os/IBinder; +Landroid/app/job/JobParameters;->jobId:I +Landroid/app/LoadedApk$ReceiverDispatcher;->getIIntentReceiver()Landroid/content/IIntentReceiver; +Landroid/app/LoadedApk$ReceiverDispatcher;->getIntentReceiver()Landroid/content/BroadcastReceiver; +Landroid/app/LoadedApk$ReceiverDispatcher;->mContext:Landroid/content/Context; +Landroid/app/LoadedApk$ReceiverDispatcher;->mReceiver:Landroid/content/BroadcastReceiver; +Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;->mDispatcher:Ljava/lang/ref/WeakReference; +Landroid/app/LoadedApk$ServiceDispatcher;-><init>(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;I)V +Landroid/app/LoadedApk$ServiceDispatcher;->getIServiceConnection()Landroid/app/IServiceConnection; +Landroid/app/LoadedApk$ServiceDispatcher;->mConnection:Landroid/content/ServiceConnection; +Landroid/app/LoadedApk$ServiceDispatcher;->mContext:Landroid/content/Context; Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager; Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader; Landroid/app/LoadedApk;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo; @@ -315,18 +379,19 @@ Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources; Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread; Landroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application; Landroid/app/LoadedApk;->mAppDir:Ljava/lang/String; -Landroid/app/LoadedApk;->mApplicationInfo:Landroid/content/pm/ApplicationInfo; Landroid/app/LoadedApk;->mApplication:Landroid/app/Application; +Landroid/app/LoadedApk;->mApplicationInfo:Landroid/content/pm/ApplicationInfo; Landroid/app/LoadedApk;->mBaseClassLoader:Ljava/lang/ClassLoader; Landroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader; -Landroid/app/LoadedApk;->mDataDirFile:Ljava/io/File; Landroid/app/LoadedApk;->mDataDir:Ljava/lang/String; +Landroid/app/LoadedApk;->mDataDirFile:Ljava/io/File; Landroid/app/LoadedApk;->mDisplayAdjustments:Landroid/view/DisplayAdjustments; Landroid/app/LoadedApk;->mLibDir:Ljava/lang/String; Landroid/app/LoadedApk;->mPackageName:Ljava/lang/String; Landroid/app/LoadedApk;->mReceivers:Landroid/util/ArrayMap; Landroid/app/LoadedApk;->mResDir:Ljava/lang/String; Landroid/app/LoadedApk;->mResources:Landroid/content/res/Resources; +Landroid/app/LoadedApk;->mServices:Landroid/util/ArrayMap; Landroid/app/LoadedApk;->mSplitResDirs:[Ljava/lang/String; Landroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V Landroid/app/LocalActivityManager;->mActivities:Ljava/util/Map; @@ -338,23 +403,25 @@ Landroid/app/NativeActivity;->hideIme(I)V Landroid/app/NativeActivity;->setWindowFlags(II)V Landroid/app/NativeActivity;->setWindowFormat(I)V Landroid/app/NativeActivity;->showIme(I)V +Landroid/app/Notification$Action;->mIcon:Landroid/graphics/drawable/Icon; Landroid/app/Notification$Builder;->mActions:Ljava/util/ArrayList; Landroid/app/Notification$Builder;->makePublicContentView()Landroid/widget/RemoteViews; Landroid/app/Notification$Builder;->setChannel(Ljava/lang/String;)Landroid/app/Notification$Builder; Landroid/app/Notification;-><init>(Landroid/content/Context;ILjava/lang/CharSequence;JLjava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/content/Intent;)V Landroid/app/Notification;->isGroupSummary()Z -Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager; -Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V -Landroid/app/NotificationManager;->sService:Landroid/app/INotificationManager; Landroid/app/Notification;->mChannelId:Ljava/lang/String; Landroid/app/Notification;->mGroupKey:Ljava/lang/String; Landroid/app/Notification;->mLargeIcon:Landroid/graphics/drawable/Icon; Landroid/app/Notification;->mSmallIcon:Landroid/graphics/drawable/Icon; Landroid/app/Notification;->setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V Landroid/app/Notification;->setSmallIcon(Landroid/graphics/drawable/Icon;)V +Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager; +Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V +Landroid/app/NotificationManager;->sService:Landroid/app/INotificationManager; Landroid/app/PendingIntent;->getActivityAsUser(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/PendingIntent; Landroid/app/PendingIntent;->getIntent()Landroid/content/Intent; Landroid/app/PendingIntent;->isActivity()Z +Landroid/app/PictureInPictureParams;->getAspectRatio()F Landroid/app/Presentation;->createPresentationContext(Landroid/content/Context;Landroid/view/Display;I)Landroid/content/Context; Landroid/app/ProgressDialog;->mProgressNumber:Landroid/widget/TextView; Landroid/app/QueuedWork;->addFinisher(Ljava/lang/Runnable;)V @@ -363,8 +430,11 @@ Landroid/app/QueuedWork;->sFinishers:Ljava/util/LinkedList; Landroid/app/ResourcesManager;->appendLibAssetForMainAssetPath(Ljava/lang/String;Ljava/lang/String;)V Landroid/app/ResourcesManager;->getInstance()Landroid/app/ResourcesManager; Landroid/app/ResourcesManager;->mActivityResourceReferences:Ljava/util/WeakHashMap; +Landroid/app/ResourcesManager;->mResConfiguration:Landroid/content/res/Configuration; Landroid/app/ResourcesManager;->mResourceImpls:Landroid/util/ArrayMap; Landroid/app/ResourcesManager;->mResourceReferences:Ljava/util/ArrayList; +Landroid/app/ResultInfo;->mData:Landroid/content/Intent; +Landroid/app/ResultInfo;->mResultWho:Ljava/lang/String; Landroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V Landroid/app/Service;->mActivityManager:Landroid/app/IActivityManager; Landroid/app/Service;->mApplication:Landroid/app/Application; @@ -384,18 +454,18 @@ Landroid/app/slice/SliceManager;->pinSlice(Landroid/net/Uri;Ljava/util/List;)V Landroid/app/StatusBarManager;->collapsePanels()V Landroid/app/StatusBarManager;->disable(I)V Landroid/app/StatusBarManager;->expandNotificationsPanel()V -Landroid/app/StatusBarManager;->expandSettingsPanel(Ljava/lang/String;)V Landroid/app/StatusBarManager;->expandSettingsPanel()V +Landroid/app/StatusBarManager;->expandSettingsPanel(Ljava/lang/String;)V Landroid/app/StatusBarManager;->getService()Lcom/android/internal/statusbar/IStatusBarService; Landroid/app/TaskStackListener;-><init>()V Landroid/app/TimePickerDialog;->mTimePicker:Landroid/widget/TimePicker; Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager; Landroid/app/usage/UsageStats;->mLastEvent:I Landroid/app/usage/UsageStats;->mLaunchCount:I Landroid/app/usage/UsageStats;->mTotalTimeInForeground:J -Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties; +Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager; Landroid/app/Vr2dDisplayProperties$Builder;-><init>()V +Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties; Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder; Landroid/app/Vr2dDisplayProperties;-><init>(III)V Landroid/app/VrManager;->getPersistentVrModeEnabled()Z @@ -410,15 +480,17 @@ Landroid/app/WallpaperManager;->getIWallpaperManager()Landroid/app/IWallpaperMan Landroid/app/WallpaperManager;->openDefaultWallpaper(Landroid/content/Context;I)Ljava/io/InputStream; Landroid/app/WallpaperManager;->setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZII)I Landroid/app/WallpaperManager;->sGlobals:Landroid/app/WallpaperManager$Globals; -Landroid/appwidget/AppWidgetManager;->bindAppWidgetIdIfAllowed(IILandroid/content/ComponentName;Landroid/os/Bundle;)Z -Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V +Landroid/appwidget/AppWidgetHost;->sService:Lcom/android/internal/appwidget/IAppWidgetService; Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;)V +Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V +Landroid/appwidget/AppWidgetManager;->bindAppWidgetIdIfAllowed(IILandroid/content/ComponentName;Landroid/os/Bundle;)Z Landroid/appwidget/AppWidgetManager;->mService:Lcom/android/internal/appwidget/IAppWidgetService; Landroid/appwidget/AppWidgetProviderInfo;->providerInfo:Landroid/content/pm/ActivityInfo; Landroid/bluetooth/BluetoothA2dp;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang/String; Landroid/bluetooth/BluetoothA2dp;->ACTION_CODEC_CONFIG_CHANGED:Ljava/lang/String; Landroid/bluetooth/BluetoothA2dp;->connect(Landroid/bluetooth/BluetoothDevice;)Z Landroid/bluetooth/BluetoothA2dp;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V +Landroid/bluetooth/BluetoothA2dp;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z Landroid/bluetooth/BluetoothA2dp;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V Landroid/bluetooth/BluetoothA2dp;->getActiveDevice()Landroid/bluetooth/BluetoothDevice; Landroid/bluetooth/BluetoothA2dp;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus; @@ -438,9 +510,10 @@ Landroid/bluetooth/BluetoothAdapter;->factoryReset()Z Landroid/bluetooth/BluetoothAdapter;->getDiscoverableTimeout()I Landroid/bluetooth/BluetoothAdapter;->getLeState()I Landroid/bluetooth/BluetoothAdapter;->mService:Landroid/bluetooth/IBluetooth; -Landroid/bluetooth/BluetoothAdapter;->setScanMode(II)Z Landroid/bluetooth/BluetoothAdapter;->setScanMode(I)Z +Landroid/bluetooth/BluetoothAdapter;->setScanMode(II)Z Landroid/bluetooth/BluetoothCodecConfig; +Landroid/bluetooth/BluetoothCodecConfig;-><init>(IIIIIJJJJ)V Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_16:I Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_24:I Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_32:I @@ -460,7 +533,6 @@ Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific3()J Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific4()J Landroid/bluetooth/BluetoothCodecConfig;->getCodecType()I Landroid/bluetooth/BluetoothCodecConfig;->getSampleRate()I -Landroid/bluetooth/BluetoothCodecConfig;-><init>(IIIIIJJJJ)V Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_176400:I Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_192000:I Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_44100:I @@ -470,8 +542,8 @@ Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_96000:I Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_NONE:I Landroid/bluetooth/BluetoothCodecConfig;->setCodecPriority(I)V Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_AAC:I -Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX_HD:I Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX:I +Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX_HD:I Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_INVALID:I Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_LDAC:I Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_MAX:I @@ -484,13 +556,13 @@ Landroid/bluetooth/BluetoothCodecStatus;->getCodecsSelectableCapabilities()[Land Landroid/bluetooth/BluetoothDevice;->createBond(I)Z Landroid/bluetooth/BluetoothDevice;->getAlias()Ljava/lang/String; Landroid/bluetooth/BluetoothDevice;->getAliasName()Ljava/lang/String; +Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I +Landroid/bluetooth/BluetoothGatt;->mClientIf:I +Landroid/bluetooth/BluetoothGatt;->refresh()Z Landroid/bluetooth/BluetoothGattCharacteristic;->mInstance:I Landroid/bluetooth/BluetoothGattCharacteristic;->mService:Landroid/bluetooth/BluetoothGattService; Landroid/bluetooth/BluetoothGattDescriptor;->mCharacteristic:Landroid/bluetooth/BluetoothGattCharacteristic; Landroid/bluetooth/BluetoothGattDescriptor;->mInstance:I -Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I -Landroid/bluetooth/BluetoothGatt;->mClientIf:I -Landroid/bluetooth/BluetoothGatt;->refresh()Z Landroid/bluetooth/BluetoothHeadset;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang/String; Landroid/bluetooth/BluetoothHeadset;->close()V Landroid/bluetooth/BluetoothHeadset;->connectAudio()Z @@ -503,11 +575,11 @@ Landroid/bluetooth/BluetoothHearingAid;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang Landroid/bluetooth/BluetoothHearingAid;->getActiveDevices()Ljava/util/List; Landroid/bluetooth/BluetoothHearingAid;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z Landroid/bluetooth/BluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z +Landroid/bluetooth/BluetoothPan;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V Landroid/bluetooth/BluetoothPan;->close()V Landroid/bluetooth/BluetoothPan;->connect(Landroid/bluetooth/BluetoothDevice;)Z Landroid/bluetooth/BluetoothPan;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z Landroid/bluetooth/BluetoothPan;->doBind()Z -Landroid/bluetooth/BluetoothPan;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V Landroid/bluetooth/BluetoothPan;->isEnabled()Z Landroid/bluetooth/BluetoothPan;->isTetheringOn()Z Landroid/bluetooth/BluetoothPan;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z @@ -516,28 +588,43 @@ Landroid/bluetooth/BluetoothPan;->setBluetoothTethering(Z)V Landroid/bluetooth/BluetoothProfile;->PAN:I Landroid/bluetooth/BluetoothSocket;->mPfd:Landroid/os/ParcelFileDescriptor; Landroid/bluetooth/BluetoothUuid;->RESERVED_UUIDS:[Landroid/os/ParcelUuid; -Landroid/bluetooth/IBluetooth;->getAddress()Ljava/lang/String; -Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth; Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String; Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I +Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth; +Landroid/bluetooth/IBluetooth;->getAddress()Ljava/lang/String; +Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/bluetooth/IBluetoothManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManager; Landroid/bluetooth/le/ScanRecord;->parseFromBytes([B)Landroid/bluetooth/le/ScanRecord; Landroid/content/AsyncTaskLoader;->mExecutor:Ljava/util/concurrent/Executor; Landroid/content/BroadcastReceiver$PendingResult;-><init>(ILjava/lang/String;Landroid/os/Bundle;IZZLandroid/os/IBinder;II)V +Landroid/content/BroadcastReceiver$PendingResult;->mAbortBroadcast:Z +Landroid/content/BroadcastReceiver$PendingResult;->mFinished:Z +Landroid/content/BroadcastReceiver$PendingResult;->mFlags:I +Landroid/content/BroadcastReceiver$PendingResult;->mInitialStickyHint:Z +Landroid/content/BroadcastReceiver$PendingResult;->mOrderedHint:Z +Landroid/content/BroadcastReceiver$PendingResult;->mResultCode:I +Landroid/content/BroadcastReceiver$PendingResult;->mResultData:Ljava/lang/String; +Landroid/content/BroadcastReceiver$PendingResult;->mResultExtras:Landroid/os/Bundle; +Landroid/content/BroadcastReceiver$PendingResult;->mSendingUser:I +Landroid/content/BroadcastReceiver$PendingResult;->mToken:Landroid/os/IBinder; +Landroid/content/BroadcastReceiver$PendingResult;->mType:I +Landroid/content/BroadcastReceiver;->getPendingResult()Landroid/content/BroadcastReceiver$PendingResult; Landroid/content/BroadcastReceiver;->setPendingResult(Landroid/content/BroadcastReceiver$PendingResult;)V -Landroid/content/ContentProviderClient;->mContentProvider:Landroid/content/IContentProvider; -Landroid/content/ContentProviderClient;->mPackageName:Ljava/lang/String; +Landroid/content/ClipData$Item;->mUri:Landroid/net/Uri; Landroid/content/ContentProvider;->coerceToLocalContentProvider(Landroid/content/IContentProvider;)Landroid/content/ContentProvider; Landroid/content/ContentProvider;->mContext:Landroid/content/Context; Landroid/content/ContentProvider;->mPathPermissions:[Landroid/content/pm/PathPermission; Landroid/content/ContentProvider;->mReadPermission:Ljava/lang/String; Landroid/content/ContentProvider;->mWritePermission:Ljava/lang/String; +Landroid/content/ContentProvider;->setAppOps(II)V +Landroid/content/ContentProviderClient;->mContentProvider:Landroid/content/IContentProvider; +Landroid/content/ContentProviderClient;->mPackageName:Ljava/lang/String; Landroid/content/ContentProviderOperation;->mSelection:Ljava/lang/String; Landroid/content/ContentProviderOperation;->mType:I +Landroid/content/ContentProviderOperation;->mUri:Landroid/net/Uri; Landroid/content/ContentProviderOperation;->TYPE_DELETE:I Landroid/content/ContentProviderOperation;->TYPE_INSERT:I Landroid/content/ContentProviderOperation;->TYPE_UPDATE:I -Landroid/content/ContentProvider;->setAppOps(II)V Landroid/content/ContentResolver;->acquireExistingProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider; Landroid/content/ContentResolver;->acquireProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider; Landroid/content/ContentResolver;->acquireProvider(Landroid/net/Uri;)Landroid/content/IContentProvider; @@ -563,19 +650,36 @@ Landroid/content/ContextWrapper;->getDisplay()Landroid/view/Display; Landroid/content/ContextWrapper;->mBase:Landroid/content/Context; Landroid/content/CursorLoader;->mCancellationSignal:Landroid/os/CancellationSignal; Landroid/content/CursorLoader;->mObserver:Landroid/content/Loader$ForceLoadContentObserver; -Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard; Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard; Landroid/content/IContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle; +Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService; Landroid/content/IContentService;->cancelSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)V Landroid/content/IContentService;->getMasterSyncAutomatically()Z Landroid/content/IContentService;->setMasterSyncAutomatically(Z)V -Landroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService; -Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/IIntentReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/IIntentReceiver$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/IIntentReceiver$Stub;-><init>()V +Landroid/content/IIntentReceiver;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V Landroid/content/Intent;->ACTION_ALARM_CHANGED:Ljava/lang/String; -Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList; Landroid/content/Intent;->mExtras:Landroid/os/Bundle; +Landroid/content/Intent;->prepareToLeaveProcess(Landroid/content/Context;)V Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent; +Landroid/content/Intent;->setAllowFds(Z)V Landroid/content/Intent;->toInsecureString()Ljava/lang/String; +Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList; +Landroid/content/IntentSender;-><init>(Landroid/content/IIntentSender;)V +Landroid/content/IntentSender;->mTarget:Landroid/content/IIntentSender; +Landroid/content/IRestrictionsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IRestrictionsManager; +Landroid/content/ISyncAdapter$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/ISyncAdapter$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/ISyncContext$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/ISyncContext$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/ISyncContext$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncContext; +Landroid/content/ISyncStatusObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/ISyncStatusObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/pm/ActivityInfo;->isResizeableMode(I)Z Landroid/content/pm/ActivityInfo;->resizeMode:I Landroid/content/pm/ActivityInfo;->supportsPictureInPicture()Z Landroid/content/pm/ApplicationInfo;->enabledSetting:I @@ -590,9 +694,37 @@ Landroid/content/pm/ApplicationInfo;->secondaryCpuAbi:Ljava/lang/String; Landroid/content/pm/ApplicationInfo;->secondaryNativeLibraryDir:Ljava/lang/String; Landroid/content/pm/ApplicationInfo;->versionCode:I Landroid/content/pm/ComponentInfo;->getComponentName()Landroid/content/ComponentName; +Landroid/content/pm/IPackageDataObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageDataObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/content/pm/IPackageDataObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDataObserver; -Landroid/content/pm/IPackageManager;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z +Landroid/content/pm/IPackageDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V +Landroid/content/pm/IPackageDeleteObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDeleteObserver; +Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/pm/IPackageDeleteObserver2;->onPackageDeleted(Ljava/lang/String;ILjava/lang/String;)V +Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/pm/IPackageInstallerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerCallback; +Landroid/content/pm/IPackageInstallerCallback;->onSessionActiveChanged(IZ)V +Landroid/content/pm/IPackageInstallerCallback;->onSessionBadgingChanged(I)V +Landroid/content/pm/IPackageInstallerCallback;->onSessionCreated(I)V +Landroid/content/pm/IPackageInstallerCallback;->onSessionFinished(IZ)V +Landroid/content/pm/IPackageInstallerCallback;->onSessionProgressChanged(IF)V +Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/pm/IPackageInstallerSession$Stub;-><init>()V +Landroid/content/pm/IPackageInstallerSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerSession; +Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/content/pm/IPackageInstallObserver2$Stub;-><init>()V +Landroid/content/pm/IPackageInstallObserver2;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V +Landroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice; +Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo; +Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String; +Landroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String; +Landroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager; Landroid/content/pm/IPackageManager;->addPermission(Landroid/content/pm/PermissionInfo;)Z +Landroid/content/pm/IPackageManager;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z Landroid/content/pm/IPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I Landroid/content/pm/IPackageManager;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice; Landroid/content/pm/IPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String; @@ -605,26 +737,44 @@ Landroid/content/pm/IPackageManager;->setApplicationEnabledSetting(Ljava/lang/St Landroid/content/pm/IPackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V Landroid/content/pm/IPackageManager;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V Landroid/content/pm/IPackageManager;->setLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/IntentFilter;ILandroid/content/ComponentName;)V -Landroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager; -Landroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice; -Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo; -Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String; -Landroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String; -Landroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver; Landroid/content/pm/IPackageMoveObserver$Stub;-><init>()V +Landroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver; +Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/content/pm/IPackageStatsObserver$Stub;-><init>()V +Landroid/content/pm/IPackageStatsObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageStatsObserver; Landroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IShortcutService; Landroid/content/pm/LauncherActivityInfo;->mActivityInfo:Landroid/content/pm/ActivityInfo; Landroid/content/pm/LauncherApps;->mPm:Landroid/content/pm/PackageManager; Landroid/content/pm/LauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)V Landroid/content/pm/PackageInfo;->INSTALL_LOCATION_UNSPECIFIED:I +Landroid/content/pm/PackageInstaller$SessionInfo;-><init>()V +Landroid/content/pm/PackageInstaller$SessionInfo;->active:Z +Landroid/content/pm/PackageInstaller$SessionInfo;->appIcon:Landroid/graphics/Bitmap; +Landroid/content/pm/PackageInstaller$SessionInfo;->appLabel:Ljava/lang/CharSequence; +Landroid/content/pm/PackageInstaller$SessionInfo;->appPackageName:Ljava/lang/String; +Landroid/content/pm/PackageInstaller$SessionInfo;->installerPackageName:Ljava/lang/String; +Landroid/content/pm/PackageInstaller$SessionInfo;->mode:I +Landroid/content/pm/PackageInstaller$SessionInfo;->progress:F +Landroid/content/pm/PackageInstaller$SessionInfo;->resolvedBaseCodePath:Ljava/lang/String; +Landroid/content/pm/PackageInstaller$SessionInfo;->sealed:Z +Landroid/content/pm/PackageInstaller$SessionInfo;->sessionId:I +Landroid/content/pm/PackageInstaller$SessionInfo;->sizeBytes:J +Landroid/content/pm/PackageInstaller$SessionParams;->appIcon:Landroid/graphics/Bitmap; +Landroid/content/pm/PackageInstaller$SessionParams;->appLabel:Ljava/lang/String; +Landroid/content/pm/PackageInstaller$SessionParams;->appPackageName:Ljava/lang/String; +Landroid/content/pm/PackageInstaller$SessionParams;->installFlags:I +Landroid/content/pm/PackageInstaller$SessionParams;->mode:I +Landroid/content/pm/PackageInstaller$SessionParams;->sizeBytes:J Landroid/content/pm/PackageItemInfo;->setForceSafeLabels(Z)V Landroid/content/pm/PackageManager;->buildRequestPermissionsIntent([Ljava/lang/String;)Landroid/content/Intent; -Landroid/content/pm/PackageManager;->freeStorageAndNotify(JLandroid/content/pm/IPackageDataObserver;)V -Landroid/content/pm/PackageManager;->freeStorageAndNotify(Ljava/lang/String;JLandroid/content/pm/IPackageDataObserver;)V Landroid/content/pm/PackageManager;->freeStorage(JLandroid/content/IntentSender;)V Landroid/content/pm/PackageManager;->freeStorage(Ljava/lang/String;JLandroid/content/IntentSender;)V +Landroid/content/pm/PackageManager;->freeStorageAndNotify(JLandroid/content/pm/IPackageDataObserver;)V +Landroid/content/pm/PackageManager;->freeStorageAndNotify(Ljava/lang/String;JLandroid/content/pm/IPackageDataObserver;)V Landroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo; +Landroid/content/pm/PackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName; Landroid/content/pm/PackageManager;->getPackageCandidateVolumes(Landroid/content/pm/ApplicationInfo;)Ljava/util/List; Landroid/content/pm/PackageManager;->getPackageInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/PackageInfo; Landroid/content/pm/PackageManager;->getPackageSizeInfo(Ljava/lang/String;Landroid/content/pm/IPackageStatsObserver;)V @@ -634,29 +784,27 @@ Landroid/content/pm/PackageManager;->NO_NATIVE_LIBRARIES:I Landroid/content/pm/PackageManager;->queryBroadcastReceivers(Landroid/content/Intent;II)Ljava/util/List; Landroid/content/pm/PackageParser$Activity;->info:Landroid/content/pm/ActivityInfo; Landroid/content/pm/PackageParser$ActivityIntentInfo;->activity:Landroid/content/pm/PackageParser$Activity; -Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V -Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Z)V Landroid/content/pm/PackageParser$Component;->className:Ljava/lang/String; Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName; Landroid/content/pm/PackageParser$Component;->intents:Ljava/util/ArrayList; -Landroid/content/pm/PackageParser;->generateActivityInfo(Landroid/content/pm/PackageParser$Activity;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ActivityInfo; -Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo; -Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo; -Landroid/content/pm/PackageParser;->generateProviderInfo(Landroid/content/pm/PackageParser$Provider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo; -Landroid/content/pm/PackageParser;->generateServiceInfo(Landroid/content/pm/PackageParser$Service;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ServiceInfo; -Landroid/content/pm/PackageParser;-><init>()V +Landroid/content/pm/PackageParser$Component;->metaData:Landroid/os/Bundle; Landroid/content/pm/PackageParser$Instrumentation;->info:Landroid/content/pm/InstrumentationInfo; +Landroid/content/pm/PackageParser$IntentInfo;-><init>()V Landroid/content/pm/PackageParser$IntentInfo;->banner:I Landroid/content/pm/PackageParser$IntentInfo;->hasDefault:Z Landroid/content/pm/PackageParser$IntentInfo;->icon:I -Landroid/content/pm/PackageParser$IntentInfo;-><init>()V Landroid/content/pm/PackageParser$IntentInfo;->labelRes:I Landroid/content/pm/PackageParser$IntentInfo;->logo:I Landroid/content/pm/PackageParser$IntentInfo;->nonLocalizedLabel:Ljava/lang/CharSequence; Landroid/content/pm/PackageParser$Package;->activities:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->applicationInfo:Landroid/content/pm/ApplicationInfo; +Landroid/content/pm/PackageParser$Package;->configPreferences:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->instrumentation:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->mAppMetaData:Landroid/os/Bundle; +Landroid/content/pm/PackageParser$Package;->mKeySetMapping:Landroid/util/ArrayMap; +Landroid/content/pm/PackageParser$Package;->mPreferredOrder:I +Landroid/content/pm/PackageParser$Package;->mSharedUserId:Ljava/lang/String; +Landroid/content/pm/PackageParser$Package;->mSharedUserLabel:I Landroid/content/pm/PackageParser$Package;->mVersionCode:I Landroid/content/pm/PackageParser$Package;->mVersionName:Ljava/lang/String; Landroid/content/pm/PackageParser$Package;->packageName:Ljava/lang/String; @@ -664,29 +812,47 @@ Landroid/content/pm/PackageParser$Package;->permissionGroups:Ljava/util/ArrayLis Landroid/content/pm/PackageParser$Package;->permissions:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->providers:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->receivers:Ljava/util/ArrayList; +Landroid/content/pm/PackageParser$Package;->reqFeatures:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->requestedPermissions:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Package;->services:Ljava/util/ArrayList; -Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package; -Landroid/content/pm/PackageParser;->parseMonolithicPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package; -Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package; -Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package; +Landroid/content/pm/PackageParser$Package;->usesLibraries:Ljava/util/ArrayList; +Landroid/content/pm/PackageParser$Package;->usesOptionalLibraries:Ljava/util/ArrayList; Landroid/content/pm/PackageParser$Provider;->info:Landroid/content/pm/ProviderInfo; Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider; Landroid/content/pm/PackageParser$Service;->info:Landroid/content/pm/ServiceInfo; Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service; +Landroid/content/pm/PackageParser;-><init>()V +Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V +Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Z)V +Landroid/content/pm/PackageParser;->generateActivityInfo(Landroid/content/pm/PackageParser$Activity;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ActivityInfo; +Landroid/content/pm/PackageParser;->generateApplicationInfo(Landroid/content/pm/PackageParser$Package;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo; +Landroid/content/pm/PackageParser;->generateInstrumentationInfo(Landroid/content/pm/PackageParser$Instrumentation;I)Landroid/content/pm/InstrumentationInfo; +Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo; +Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo; +Landroid/content/pm/PackageParser;->generatePermissionGroupInfo(Landroid/content/pm/PackageParser$PermissionGroup;I)Landroid/content/pm/PermissionGroupInfo; +Landroid/content/pm/PackageParser;->generatePermissionInfo(Landroid/content/pm/PackageParser$Permission;I)Landroid/content/pm/PermissionInfo; +Landroid/content/pm/PackageParser;->generateProviderInfo(Landroid/content/pm/PackageParser$Provider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo; +Landroid/content/pm/PackageParser;->generateServiceInfo(Landroid/content/pm/PackageParser$Service;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ServiceInfo; +Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package; +Landroid/content/pm/PackageParser;->parseMonolithicPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package; +Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package; +Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package; Landroid/content/pm/PackageUserState;-><init>()V Landroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V Landroid/content/pm/ResolveInfo;->instantAppAvailable:Z Landroid/content/pm/ShortcutManager;->mService:Landroid/content/pm/IShortcutService; Landroid/content/pm/Signature;->getPublicKey()Ljava/security/PublicKey; +Landroid/content/pm/UserInfo;-><init>(ILjava/lang/String;I)V +Landroid/content/pm/UserInfo;->FLAG_PRIMARY:I Landroid/content/pm/UserInfo;->id:I Landroid/content/pm/UserInfo;->isPrimary()Z Landroid/content/pm/UserInfo;->serialNumber:I Landroid/content/res/AssetFileDescriptor;->mFd:Landroid/os/ParcelFileDescriptor; Landroid/content/res/AssetFileDescriptor;->mLength:J Landroid/content/res/AssetFileDescriptor;->mStartOffset:J -Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I +Landroid/content/res/AssetManager;-><init>()V Landroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I +Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I Landroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V Landroid/content/res/AssetManager;->createTheme()J Landroid/content/res/AssetManager;->getAssignedPackageIdentifiers()Landroid/util/SparseArray; @@ -696,13 +862,12 @@ Landroid/content/res/AssetManager;->getResourceIdentifier(Ljava/lang/String;Ljav Landroid/content/res/AssetManager;->getResourceName(I)Ljava/lang/String; Landroid/content/res/AssetManager;->getResourcePackageName(I)Ljava/lang/String; Landroid/content/res/AssetManager;->getResourceTypeName(I)Ljava/lang/String; -Landroid/content/res/AssetManager;-><init>()V Landroid/content/res/AssetManager;->isUpToDate()Z Landroid/content/res/AssetManager;->mObject:J -Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream; Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;)Ljava/io/InputStream; -Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;I)Ljava/io/InputStream; +Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream; Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;)Ljava/io/InputStream; +Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;I)Ljava/io/InputStream; Landroid/content/res/AssetManager;->resolveAttrs(JII[I[I[I[I)Z Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z Landroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIII)V @@ -713,13 +878,26 @@ Landroid/content/res/ColorStateList;->mDefaultColor:I Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory; Landroid/content/res/ColorStateList;->mStateSpecs:[[I Landroid/content/res/ColorStateList;->onColorsChanged()V +Landroid/content/res/CompatibilityInfo;-><init>(Landroid/content/pm/ApplicationInfo;IIZ)V Landroid/content/res/CompatibilityInfo;->applicationScale:F Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo; -Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; Landroid/content/res/DrawableCache;-><init>()V +Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; Landroid/content/res/ObbInfo;->salt:[B Landroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo; +Landroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser; +Landroid/content/res/Resources;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser; +Landroid/content/res/Resources;->mClassLoader:Ljava/lang/ClassLoader; +Landroid/content/res/Resources;->mDrawableInflater:Landroid/graphics/drawable/DrawableInflater; +Landroid/content/res/Resources;->mResourcesImpl:Landroid/content/res/ResourcesImpl; +Landroid/content/res/Resources;->mSystem:Landroid/content/res/Resources; +Landroid/content/res/Resources;->mTmpValue:Landroid/util/TypedValue; +Landroid/content/res/Resources;->mTypedArrayPool:Landroid/util/Pools$SynchronizedPool; +Landroid/content/res/Resources;->selectDefaultTheme(II)I +Landroid/content/res/Resources;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V +Landroid/content/res/Resources;->updateSystemConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V Landroid/content/res/ResourcesImpl;->getAssets()Landroid/content/res/AssetManager; +Landroid/content/res/ResourcesImpl;->getValue(ILandroid/util/TypedValue;Z)V Landroid/content/res/ResourcesImpl;->mAccessLock:Ljava/lang/Object; Landroid/content/res/ResourcesImpl;->mAnimatorCache:Landroid/content/res/ConfigurationBoundResourceCache; Landroid/content/res/ResourcesImpl;->mAssets:Landroid/content/res/AssetManager; @@ -734,15 +912,6 @@ Landroid/content/res/ResourcesImpl;->sPreloadedDrawables:[Landroid/util/LongSpar Landroid/content/res/ResourcesImpl;->TRACE_FOR_MISS_PRELOAD:Z Landroid/content/res/ResourcesImpl;->TRACE_FOR_PRELOAD:Z Landroid/content/res/ResourcesKey;->mSplitResDirs:[Ljava/lang/String; -Landroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser; -Landroid/content/res/Resources;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser; -Landroid/content/res/Resources;->mResourcesImpl:Landroid/content/res/ResourcesImpl; -Landroid/content/res/Resources;->mSystem:Landroid/content/res/Resources; -Landroid/content/res/Resources;->mTmpValue:Landroid/util/TypedValue; -Landroid/content/res/Resources;->mTypedArrayPool:Landroid/util/Pools$SynchronizedPool; -Landroid/content/res/Resources;->selectDefaultTheme(II)I -Landroid/content/res/Resources;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V -Landroid/content/res/Resources;->updateSystemConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V Landroid/content/res/StringBlock;-><init>(JZ)V Landroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V Landroid/content/res/TypedArray;->extractThemeAttrs()[I @@ -758,13 +927,35 @@ Landroid/content/res/TypedArray;->mResources:Landroid/content/res/Resources; Landroid/content/res/TypedArray;->mTheme:Landroid/content/res/Resources$Theme; Landroid/content/res/TypedArray;->mValue:Landroid/util/TypedValue; Landroid/content/res/TypedArray;->mXml:Landroid/content/res/XmlBlock$Parser; -Landroid/content/res/XmlBlock;-><init>([B)V -Landroid/content/res/XmlBlock;->newParser()Landroid/content/res/XmlResourceParser; Landroid/content/res/XmlBlock$Parser;->mBlock:Landroid/content/res/XmlBlock; Landroid/content/res/XmlBlock$Parser;->mParseState:J +Landroid/content/res/XmlBlock;-><init>([B)V +Landroid/content/res/XmlBlock;->newParser()Landroid/content/res/XmlResourceParser; +Landroid/content/RestrictionsManager;->mService:Landroid/content/IRestrictionsManager; Landroid/content/SearchRecentSuggestionsProvider;->mSuggestionProjection:[Ljava/lang/String; +Landroid/content/SyncAdapterType;->allowParallelSyncs:Z +Landroid/content/SyncAdapterType;->isAlwaysSyncable:Z +Landroid/content/SyncAdapterType;->settingsActivity:Ljava/lang/String; Landroid/content/SyncContext;->setStatusText(Ljava/lang/String;)V +Landroid/content/SyncInfo;-><init>(ILandroid/accounts/Account;Ljava/lang/String;J)V +Landroid/content/SyncRequest;->mAccountToSync:Landroid/accounts/Account; +Landroid/content/SyncRequest;->mAuthority:Ljava/lang/String; +Landroid/content/SyncRequest;->mExtras:Landroid/os/Bundle; +Landroid/content/SyncRequest;->mIsPeriodic:Z +Landroid/content/SyncRequest;->mSyncRunTimeSecs:J +Landroid/content/SyncStatusInfo;-><init>(Landroid/os/Parcel;)V +Landroid/content/SyncStatusInfo;->authorityId:I +Landroid/content/SyncStatusInfo;->CREATOR:Landroid/os/Parcelable$Creator; +Landroid/content/SyncStatusInfo;->ensurePeriodicSyncTimeSize(I)V +Landroid/content/SyncStatusInfo;->initialFailureTime:J +Landroid/content/SyncStatusInfo;->initialize:Z +Landroid/content/SyncStatusInfo;->lastFailureMesg:Ljava/lang/String; +Landroid/content/SyncStatusInfo;->lastFailureSource:I +Landroid/content/SyncStatusInfo;->lastFailureTime:J +Landroid/content/SyncStatusInfo;->lastSuccessSource:I Landroid/content/SyncStatusInfo;->lastSuccessTime:J +Landroid/content/SyncStatusInfo;->pending:Z +Landroid/content/SyncStatusInfo;->periodicSyncTimes:Ljava/util/ArrayList; Landroid/content/UriMatcher;->mChildren:Ljava/util/ArrayList; Landroid/content/UriMatcher;->mText:Ljava/lang/String; Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle; @@ -778,35 +969,37 @@ Landroid/database/CursorWrapper;->mCursor:Landroid/database/Cursor; Landroid/database/sqlite/SQLiteCustomFunction;->dispatchCallback([Ljava/lang/String;)V Landroid/database/sqlite/SQLiteCustomFunction;->name:Ljava/lang/String; Landroid/database/sqlite/SQLiteCustomFunction;->numArgs:I -Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I Landroid/database/sqlite/SQLiteDatabase;->CONFLICT_VALUES:[Ljava/lang/String; Landroid/database/sqlite/SQLiteDatabase;->mConfigurationLocked:Landroid/database/sqlite/SQLiteDatabaseConfiguration; Landroid/database/sqlite/SQLiteDatabase;->mConnectionPoolLocked:Landroid/database/sqlite/SQLiteConnectionPool; Landroid/database/sqlite/SQLiteDatabase;->reopenReadWrite()V +Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I Landroid/database/sqlite/SQLiteDebug$PagerStats;->largestMemAlloc:I Landroid/database/sqlite/SQLiteDebug$PagerStats;->memoryUsed:I Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String; Landroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V Landroid/ddm/DdmHandleAppName;->getAppName()Ljava/lang/String; +Landroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;I)V Landroid/graphics/AvoidXfermode$Mode;->AVOID:Landroid/graphics/AvoidXfermode$Mode; Landroid/graphics/AvoidXfermode$Mode;->TARGET:Landroid/graphics/AvoidXfermode$Mode; Landroid/graphics/BaseCanvas;->mNativeCanvasWrapper:J Landroid/graphics/Bitmap$Config;->nativeInt:I Landroid/graphics/Bitmap$Config;->nativeToConfig(I)Landroid/graphics/Bitmap$Config; +Landroid/graphics/Bitmap;-><init>(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V Landroid/graphics/Bitmap;->createAshmemBitmap()Landroid/graphics/Bitmap; Landroid/graphics/Bitmap;->createAshmemBitmap(Landroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap; -Landroid/graphics/BitmapFactory;->nativeDecodeAsset(JLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; -Landroid/graphics/BitmapFactory;->nativeDecodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; -Landroid/graphics/BitmapFactory;->nativeDecodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; -Landroid/graphics/BitmapFactory;->nativeDecodeStream(Ljava/io/InputStream;[BLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; Landroid/graphics/Bitmap;->getDefaultDensity()I -Landroid/graphics/Bitmap;-><init>(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V Landroid/graphics/Bitmap;->mNativePtr:J Landroid/graphics/Bitmap;->mNinePatchChunk:[B Landroid/graphics/Bitmap;->mNinePatchInsets:Landroid/graphics/NinePatch$InsetStruct; -Landroid/graphics/BitmapRegionDecoder;-><init>(J)V Landroid/graphics/Bitmap;->reinit(IIZ)V +Landroid/graphics/Bitmap;->setDefaultDensity(I)V +Landroid/graphics/BitmapFactory;->nativeDecodeAsset(JLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; +Landroid/graphics/BitmapFactory;->nativeDecodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; +Landroid/graphics/BitmapFactory;->nativeDecodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; +Landroid/graphics/BitmapFactory;->nativeDecodeStream(Ljava/io/InputStream;[BLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap; +Landroid/graphics/BitmapRegionDecoder;-><init>(J)V Landroid/graphics/Camera;->native_instance:J Landroid/graphics/Canvas;-><init>(J)V Landroid/graphics/Canvas;->release()V @@ -824,26 +1017,26 @@ Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/Porte Landroid/graphics/drawable/BitmapDrawable;->mTargetDensity:I Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V Landroid/graphics/drawable/ColorDrawable$ColorState;->mUseColor:I -Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect; -Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mDrawables:[Landroid/graphics/drawable/Drawable; -Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets; -Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState; Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets; Landroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V Landroid/graphics/drawable/Drawable;->mCallback:Ljava/lang/ref/WeakReference; Landroid/graphics/drawable/Drawable;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode; -Landroid/graphics/drawable/GradientDrawable;->getOpticalInsets()Landroid/graphics/Insets; +Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect; +Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mDrawables:[Landroid/graphics/drawable/Drawable; +Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets; +Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState; +Landroid/graphics/drawable/DrawableInflater;->mClassLoader:Ljava/lang/ClassLoader; Landroid/graphics/drawable/GradientDrawable$GradientState;->mAngle:I -Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradientColors:[I Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradient:I +Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradientColors:[I Landroid/graphics/drawable/GradientDrawable$GradientState;->mHeight:I Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadius:I Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadiusRatio:F Landroid/graphics/drawable/GradientDrawable$GradientState;->mOrientation:Landroid/graphics/drawable/GradientDrawable$Orientation; Landroid/graphics/drawable/GradientDrawable$GradientState;->mPadding:Landroid/graphics/Rect; Landroid/graphics/drawable/GradientDrawable$GradientState;->mPositions:[F -Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadiusArray:[F Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadius:F +Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadiusArray:[F Landroid/graphics/drawable/GradientDrawable$GradientState;->mShape:I Landroid/graphics/drawable/GradientDrawable$GradientState;->mSolidColors:Landroid/content/res/ColorStateList; Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeDashGap:F @@ -852,6 +1045,7 @@ Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeWidth:I Landroid/graphics/drawable/GradientDrawable$GradientState;->mThickness:I Landroid/graphics/drawable/GradientDrawable$GradientState;->mThicknessRatio:F Landroid/graphics/drawable/GradientDrawable$GradientState;->mWidth:I +Landroid/graphics/drawable/GradientDrawable;->getOpticalInsets()Landroid/graphics/Insets; Landroid/graphics/drawable/GradientDrawable;->mGradientState:Landroid/graphics/drawable/GradientDrawable$GradientState; Landroid/graphics/drawable/GradientDrawable;->mPadding:Landroid/graphics/Rect; Landroid/graphics/drawable/Icon;->getBitmap()Landroid/graphics/Bitmap; @@ -860,15 +1054,16 @@ Landroid/graphics/drawable/Icon;->getDataLength()I Landroid/graphics/drawable/Icon;->getDataOffset()I Landroid/graphics/drawable/Icon;->getResources()Landroid/content/res/Resources; Landroid/graphics/drawable/Icon;->hasTint()Z +Landroid/graphics/drawable/Icon;->mString1:Ljava/lang/String; Landroid/graphics/drawable/Icon;->mType:I Landroid/graphics/drawable/InsetDrawable;->mState:Landroid/graphics/drawable/InsetDrawable$InsetState; Landroid/graphics/drawable/LayerDrawable$ChildDrawable;->mDrawable:Landroid/graphics/drawable/Drawable; Landroid/graphics/drawable/LayerDrawable$LayerState;->mChildren:[Landroid/graphics/drawable/LayerDrawable$ChildDrawable; Landroid/graphics/drawable/LayerDrawable;->mLayerState:Landroid/graphics/drawable/LayerDrawable$LayerState; -Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState; Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;->mNinePatch:Landroid/graphics/NinePatch; -Landroid/graphics/drawable/RippleDrawable;->mState:Landroid/graphics/drawable/RippleDrawable$RippleState; +Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState; Landroid/graphics/drawable/RippleDrawable$RippleState;->mColor:Landroid/content/res/ColorStateList; +Landroid/graphics/drawable/RippleDrawable;->mState:Landroid/graphics/drawable/RippleDrawable$RippleState; Landroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I Landroid/graphics/drawable/StateListDrawable;->getStateCount()I Landroid/graphics/drawable/StateListDrawable;->getStateDrawable(I)Landroid/graphics/drawable/Drawable; @@ -876,23 +1071,26 @@ Landroid/graphics/drawable/StateListDrawable;->getStateDrawableIndex([I)I Landroid/graphics/drawable/StateListDrawable;->getStateSet(I)[I Landroid/graphics/drawable/StateListDrawable;->mStateListState:Landroid/graphics/drawable/StateListDrawable$StateListState; Landroid/graphics/drawable/StateListDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V +Landroid/graphics/drawable/VectorDrawable$VGroup;->setRotation(F)V Landroid/graphics/drawable/VectorDrawable;->getTargetByName(Ljava/lang/String;)Ljava/lang/Object; +Landroid/graphics/drawable/VectorDrawable;->mTintFilter:Landroid/graphics/PorterDuffColorFilter; Landroid/graphics/drawable/VectorDrawable;->setAllowCaching(Z)V -Landroid/graphics/drawable/VectorDrawable$VGroup;->setRotation(F)V +Landroid/graphics/FontFamily;-><init>()V Landroid/graphics/FontFamily;->abortCreation()V Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z Landroid/graphics/FontFamily;->freeze()Z -Landroid/graphics/FontFamily;-><init>()V Landroid/graphics/fonts/FontVariationAxis;->mStyleValue:F Landroid/graphics/fonts/FontVariationAxis;->mTag:I +Landroid/graphics/GraphicBuffer;-><init>(IIIIJ)V Landroid/graphics/GraphicBuffer;->createFromExisting(IIIIJ)Landroid/graphics/GraphicBuffer; Landroid/graphics/GraphicBuffer;->CREATOR:Landroid/os/Parcelable$Creator; -Landroid/graphics/GraphicBuffer;-><init>(IIIIJ)V Landroid/graphics/GraphicBuffer;->mNativeObject:J Landroid/graphics/ImageDecoder;->postProcessAndRelease(Landroid/graphics/Canvas;)I Landroid/graphics/Insets;->left:I +Landroid/graphics/Insets;->top:I Landroid/graphics/Insets;->right:I +Landroid/graphics/Insets;->bottom:I Landroid/graphics/LinearGradient;->mColors:[I Landroid/graphics/Matrix;->native_instance:J Landroid/graphics/Movie;-><init>(J)V @@ -901,6 +1099,7 @@ Landroid/graphics/NinePatch$InsetStruct;-><init>(IIIIIIIIFIF)V Landroid/graphics/NinePatch;->mBitmap:Landroid/graphics/Bitmap; Landroid/graphics/Picture;->mNativePicture:J Landroid/graphics/PixelXorXfermode;-><init>(I)V +Landroid/graphics/PorterDuffColorFilter;->getColor()I Landroid/graphics/PorterDuffColorFilter;->setColor(I)V Landroid/graphics/PorterDuffColorFilter;->setMode(Landroid/graphics/PorterDuff$Mode;)V Landroid/graphics/Rect;->scale(F)V @@ -917,15 +1116,15 @@ Landroid/graphics/Typeface;->mStyle:I Landroid/graphics/Typeface;->sDefaults:[Landroid/graphics/Typeface; Landroid/graphics/Typeface;->setDefault(Landroid/graphics/Typeface;)V Landroid/graphics/Typeface;->sSystemFontMap:Ljava/util/Map; +Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V +Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V +Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V +Landroid/hardware/camera2/CameraCharacteristics$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; Landroid/hardware/camera2/CameraCharacteristics;->CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->CONTROL_MAX_REGIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; -Landroid/hardware/camera2/CameraCharacteristics$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; -Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V -Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V -Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V Landroid/hardware/camera2/CameraCharacteristics;->LED_AVAILABLE_LEDS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->LENS_INFO_SHADING_MAP_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->LOGICAL_MULTI_CAMERA_PHYSICAL_IDS:Landroid/hardware/camera2/CameraCharacteristics$Key; @@ -945,24 +1144,24 @@ Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_PROCESSED_MIN Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_PROCESSED_SIZES:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key; +Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V +Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V +Landroid/hardware/camera2/CaptureRequest$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_COORDINATES:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_PROCESSING_METHOD:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_TIMESTAMP:Landroid/hardware/camera2/CaptureRequest$Key; -Landroid/hardware/camera2/CaptureRequest$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; -Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V -Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V Landroid/hardware/camera2/CaptureRequest;->LED_TRANSMIT:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->REQUEST_ID:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_BLUE:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_GREEN:Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_RED:Landroid/hardware/camera2/CaptureRequest$Key; +Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V +Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V +Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V +Landroid/hardware/camera2/CaptureResult$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_COORDINATES:Landroid/hardware/camera2/CaptureResult$Key; Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_PROCESSING_METHOD:Landroid/hardware/camera2/CaptureResult$Key; Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_TIMESTAMP:Landroid/hardware/camera2/CaptureResult$Key; -Landroid/hardware/camera2/CaptureResult$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key; -Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V -Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V -Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V Landroid/hardware/camera2/CaptureResult;->LED_TRANSMIT:Landroid/hardware/camera2/CaptureResult$Key; Landroid/hardware/camera2/CaptureResult;->QUIRKS_PARTIAL_RESULT:Landroid/hardware/camera2/CaptureResult$Key; Landroid/hardware/camera2/CaptureResult;->REQUEST_FRAME_COUNT:Landroid/hardware/camera2/CaptureResult$Key; @@ -986,8 +1185,12 @@ Landroid/hardware/camera2/impl/CameraMetadataNative;->mMetadataPtr:J Landroid/hardware/camera2/utils/TypeReference;->createSpecializedTypeReference(Ljava/lang/reflect/Type;)Landroid/hardware/camera2/utils/TypeReference; Landroid/hardware/Camera;->addCallbackBuffer([BI)V Landroid/hardware/Camera;->mNativeContext:J +Landroid/hardware/Camera;->native_setup(Ljava/lang/Object;IILjava/lang/String;)I Landroid/hardware/Camera;->openLegacy(II)Landroid/hardware/Camera; Landroid/hardware/Camera;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V +Landroid/hardware/display/DisplayManagerGlobal;->mDm:Landroid/hardware/display/IDisplayManager; +Landroid/hardware/display/DisplayManagerGlobal;->sInstance:Landroid/hardware/display/DisplayManagerGlobal; +Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager; Landroid/hardware/display/WifiDisplayStatus;->mActiveDisplay:Landroid/hardware/display/WifiDisplay; Landroid/hardware/display/WifiDisplayStatus;->mDisplays:[Landroid/hardware/display/WifiDisplay; Landroid/hardware/fingerprint/Fingerprint;->getFingerId()I @@ -995,44 +1198,47 @@ Landroid/hardware/fingerprint/Fingerprint;->getName()Ljava/lang/CharSequence; Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/HardwareBuffer;-><init>(J)V Landroid/hardware/HardwareBuffer;->mNativeObject:J -Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager; +Landroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService; Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager; Landroid/hardware/input/InputManager;->getInstance()Landroid/hardware/input/InputManager; Landroid/hardware/input/InputManager;->injectInputEvent(Landroid/view/InputEvent;I)Z Landroid/hardware/input/InputManager;->INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH:I Landroid/hardware/input/InputManager;->mIm:Landroid/hardware/input/IInputManager; Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V +Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService; Landroid/hardware/SerialPort;->mNativeContext:I -Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;->confidenceLevel:I Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;-><init>(II)V +Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;->confidenceLevel:I Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;->userId:I Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B)V Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;-><init>(Ljava/util/UUID;Ljava/util/UUID;[B)V Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->id:I Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->locale:Ljava/lang/String; +Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->recognitionModes:I +Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->text:Ljava/lang/String; +Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->users:[I Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;)V +Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;-><init>(III[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;)V Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->coarseConfidenceLevel:I Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->confidenceLevels:[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel; Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->id:I -Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;-><init>(III[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;)V Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->recognitionModes:I -Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->recognitionModes:I Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;->keyphrases:[Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase; -Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->text:Ljava/lang/String; -Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->users:[I -Landroid/hardware/soundtrigger/SoundTriggerModule;->mId:I -Landroid/hardware/soundtrigger/SoundTriggerModule;->mNativeContext:J -Landroid/hardware/soundtrigger/SoundTriggerModule;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIIZIZIZ)V +Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;-><init>(ZZ[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;[B)V Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->captureRequested:Z Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->data:[B -Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;-><init>(ZZ[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;[B)V Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->keyphrases:[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra; Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B)V +Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;->data:[B Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->data:[B -Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;-><init>(II[B)V Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->uuid:Ljava/util/UUID; Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->vendorUuid:Ljava/util/UUID; +Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;-><init>(II[B)V +Landroid/hardware/soundtrigger/SoundTriggerModule;->mId:I +Landroid/hardware/soundtrigger/SoundTriggerModule;->mNativeContext:J +Landroid/hardware/soundtrigger/SoundTriggerModule;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchAdditionalInfoEvent(III[F[I)V Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchFlushCompleteEvent(I)V Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchSensorEvent(I[FIJ)V @@ -1061,29 +1267,38 @@ Landroid/icu/text/DateIntervalFormat;-><init>()V Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;-><init>()V Landroid/icu/text/DecimalFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale; Landroid/icu/text/RuleBasedCollator;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale; -Landroid/icu/text/SpoofChecker$ScriptSet;->and(I)V Landroid/icu/text/SpoofChecker$ScriptSet;-><init>()V +Landroid/icu/text/SpoofChecker$ScriptSet;->and(I)V Landroid/icu/text/SpoofChecker$ScriptSet;->isFull()Z Landroid/icu/text/SpoofChecker$ScriptSet;->setAll()V Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames$FactoryImpl;-><init>()V Landroid/icu/text/Transliterator;->createFromRules(Ljava/lang/String;Ljava/lang/String;I)Landroid/icu/text/Transliterator; +Landroid/icu/text/Transliterator;->getInstance(Ljava/lang/String;)Landroid/icu/text/Transliterator; Landroid/icu/text/Transliterator;->transliterate(Ljava/lang/String;)Ljava/lang/String; Landroid/icu/text/UFormat;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale; Landroid/icu/util/Calendar;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale; +Landroid/inputmethodservice/InputMethodService$SettingsObserver;->shouldShowImeWithHardKeyboard()Z Landroid/inputmethodservice/InputMethodService;->mExtractEditText:Landroid/inputmethodservice/ExtractEditText; Landroid/inputmethodservice/InputMethodService;->mRootView:Landroid/view/View; Landroid/inputmethodservice/InputMethodService;->mSettingsObserver:Landroid/inputmethodservice/InputMethodService$SettingsObserver; -Landroid/inputmethodservice/InputMethodService$SettingsObserver;->shouldShowImeWithHardKeyboard()Z -Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country; Landroid/location/Country;->getCountryIso()Ljava/lang/String; Landroid/location/Country;->getSource()I +Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country; Landroid/location/GeocoderParams;->getClientPackage()Ljava/lang/String; Landroid/location/GeocoderParams;->getLocale()Ljava/util/Locale; Landroid/location/IGeocodeProvider$Stub;-><init>()V Landroid/location/IGeofenceProvider$Stub;-><init>()V -Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager; +Landroid/location/ILocationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/location/ILocationListener$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/location/ILocationListener;->onLocationChanged(Landroid/location/Location;)V Landroid/location/ILocationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager; +Landroid/location/Location;->mElapsedRealtimeNanos:J Landroid/location/LocationManager;->mService:Landroid/location/ILocationManager; +Landroid/location/LocationRequest;->mHideFromAppOps:Z +Landroid/location/LocationRequest;->mInterval:J +Landroid/location/LocationRequest;->mProvider:Ljava/lang/String; +Landroid/location/LocationRequest;->mWorkSource:Landroid/os/WorkSource; Landroid/media/AudioAttributes$Builder;->addTag(Ljava/lang/String;)Landroid/media/AudioAttributes$Builder; Landroid/media/AudioAttributes;->mContentType:I Landroid/media/AudioAttributes;->mFlags:I @@ -1091,30 +1306,30 @@ Landroid/media/AudioAttributes;->mFormattedTags:Ljava/lang/String; Landroid/media/AudioAttributes;->mSource:I Landroid/media/AudioAttributes;->mUsage:I Landroid/media/AudioAttributes;->toLegacyStreamType(Landroid/media/AudioAttributes;)I -Landroid/media/AudioDevicePortConfig;-><init>(Landroid/media/AudioDevicePort;IIILandroid/media/AudioGainConfig;)V Landroid/media/AudioDevicePort;-><init>(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V +Landroid/media/AudioDevicePortConfig;-><init>(Landroid/media/AudioDevicePort;IIILandroid/media/AudioGainConfig;)V Landroid/media/AudioFormat;-><init>(IIII)V Landroid/media/AudioFormat;->mChannelMask:I Landroid/media/AudioFormat;->mEncoding:I Landroid/media/AudioFormat;->mSampleRate:I +Landroid/media/audiofx/AudioEffect;-><init>(Ljava/util/UUID;Ljava/util/UUID;II)V Landroid/media/audiofx/AudioEffect;->command(I[B[B)I Landroid/media/audiofx/AudioEffect;->getParameter([I[B)I Landroid/media/audiofx/AudioEffect;->getParameter([I[I)I -Landroid/media/audiofx/AudioEffect;-><init>(Ljava/util/UUID;Ljava/util/UUID;II)V Landroid/media/audiofx/AudioEffect;->setParameter([I[S)I +Landroid/media/AudioGain;-><init>(IIIIIIIII)V Landroid/media/AudioGainConfig;-><init>(ILandroid/media/AudioGain;II[II)V Landroid/media/AudioGainConfig;->mChannelMask:I Landroid/media/AudioGainConfig;->mIndex:I Landroid/media/AudioGainConfig;->mMode:I Landroid/media/AudioGainConfig;->mRampDurationMs:I Landroid/media/AudioGainConfig;->mValues:[I -Landroid/media/AudioGain;-><init>(IIIIIIIII)V Landroid/media/AudioHandle;-><init>(I)V Landroid/media/AudioHandle;->mId:I +Landroid/media/AudioManager;-><init>(Landroid/content/Context;)V Landroid/media/AudioManager;->forceVolumeControlStream(I)V Landroid/media/AudioManager;->getOutputLatency(I)I Landroid/media/AudioManager;->getService()Landroid/media/IAudioService; -Landroid/media/AudioManager;-><init>(Landroid/content/Context;)V Landroid/media/AudioManager;->mAudioFocusIdListenerMap:Ljava/util/concurrent/ConcurrentHashMap; Landroid/media/AudioManager;->setMasterMute(ZI)V Landroid/media/AudioManager;->setRingerModeInternal(I)V @@ -1122,14 +1337,10 @@ Landroid/media/AudioManager;->startBluetoothScoVirtualCall()V Landroid/media/AudioManager;->STREAM_BLUETOOTH_SCO:I Landroid/media/AudioManager;->STREAM_SYSTEM_ENFORCED:I Landroid/media/AudioManager;->STREAM_TTS:I -Landroid/media/AudioMixPortConfig;-><init>(Landroid/media/AudioMixPort;IIILandroid/media/AudioGainConfig;)V Landroid/media/AudioMixPort;-><init>(Landroid/media/AudioHandle;IILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V +Landroid/media/AudioMixPortConfig;-><init>(Landroid/media/AudioMixPort;IIILandroid/media/AudioGainConfig;)V Landroid/media/AudioPatch;-><init>(Landroid/media/AudioHandle;[Landroid/media/AudioPortConfig;[Landroid/media/AudioPortConfig;)V Landroid/media/AudioPatch;->mHandle:Landroid/media/AudioHandle; -Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mAttr:Landroid/media/AudioAttributes; -Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mIntProp:I -Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mRule:I -Landroid/media/audiopolicy/AudioMixingRule;->mCriteria:Ljava/util/ArrayList; Landroid/media/audiopolicy/AudioMix;->mCallbackFlags:I Landroid/media/audiopolicy/AudioMix;->mDeviceAddress:Ljava/lang/String; Landroid/media/audiopolicy/AudioMix;->mDeviceSystemType:I @@ -1137,6 +1348,15 @@ Landroid/media/audiopolicy/AudioMix;->mFormat:Landroid/media/AudioFormat; Landroid/media/audiopolicy/AudioMix;->mMixType:I Landroid/media/audiopolicy/AudioMix;->mRouteFlags:I Landroid/media/audiopolicy/AudioMix;->mRule:Landroid/media/audiopolicy/AudioMixingRule; +Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mAttr:Landroid/media/AudioAttributes; +Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mIntProp:I +Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mRule:I +Landroid/media/audiopolicy/AudioMixingRule;->mCriteria:Ljava/util/ArrayList; +Landroid/media/AudioPort;-><init>(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V +Landroid/media/AudioPort;->mActiveConfig:Landroid/media/AudioPortConfig; +Landroid/media/AudioPort;->mGains:[Landroid/media/AudioGain; +Landroid/media/AudioPort;->mHandle:Landroid/media/AudioHandle; +Landroid/media/AudioPort;->mRole:I Landroid/media/AudioPortConfig;-><init>(Landroid/media/AudioPort;IIILandroid/media/AudioGainConfig;)V Landroid/media/AudioPortConfig;->mChannelMask:I Landroid/media/AudioPortConfig;->mConfigMask:I @@ -1146,18 +1366,13 @@ Landroid/media/AudioPortConfig;->mPort:Landroid/media/AudioPort; Landroid/media/AudioPortConfig;->mSamplingRate:I Landroid/media/AudioPortEventHandler;->mJniCallback:J Landroid/media/AudioPortEventHandler;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V -Landroid/media/AudioPort;-><init>(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V -Landroid/media/AudioPort;->mActiveConfig:Landroid/media/AudioPortConfig; -Landroid/media/AudioPort;->mGains:[Landroid/media/AudioGain; -Landroid/media/AudioPort;->mHandle:Landroid/media/AudioHandle; -Landroid/media/AudioPort;->mRole:I -Landroid/media/AudioRecordingConfiguration;->getClientPackageName()Ljava/lang/String; -Landroid/media/AudioRecordingConfiguration;->getClientUid()I Landroid/media/AudioRecord;->mNativeCallbackCookie:J Landroid/media/AudioRecord;->mNativeDeviceCallback:J Landroid/media/AudioRecord;->mNativeRecorderInJavaObj:J Landroid/media/AudioRecord;->native_release()V Landroid/media/AudioRecord;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V +Landroid/media/AudioRecordingConfiguration;->getClientPackageName()Ljava/lang/String; +Landroid/media/AudioRecordingConfiguration;->getClientUid()I Landroid/media/AudioSystem;->dynamicPolicyCallbackFromNative(ILjava/lang/String;I)V Landroid/media/AudioSystem;->errorCallbackFromNative(I)V Landroid/media/AudioSystem;->getPrimaryOutputFrameCount()I @@ -1175,14 +1390,15 @@ Landroid/media/AudioTrack;->mStreamType:I Landroid/media/AudioTrack;->native_release()V Landroid/media/AudioTrack;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V Landroid/media/ExifInterface;->getDateTime()J +Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService; Landroid/media/IAudioService;->getStreamMaxVolume(I)I Landroid/media/IAudioService;->getStreamVolume(I)I Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V -Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService; -Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/media/Image;-><init>()V -Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V +Landroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService; Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService; +Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V Landroid/media/IRemoteDisplayCallback;->onStateChanged(Landroid/media/RemoteDisplayState;)V Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController; Landroid/media/JetPlayer;->mNativePlayerInJavaObj:J @@ -1190,18 +1406,18 @@ Landroid/media/JetPlayer;->postEventFromNative(Ljava/lang/Object;III)V Landroid/media/MediaCodec$CodecException;-><init>(IILjava/lang/String;)V Landroid/media/MediaCodec;->getBuffers(Z)[Ljava/nio/ByteBuffer; Landroid/media/MediaCodec;->releaseOutputBuffer(IZZJ)V +Landroid/media/MediaFile$MediaFileType;->fileType:I +Landroid/media/MediaFile$MediaFileType;->mimeType:Ljava/lang/String; +Landroid/media/MediaFile;-><init>()V Landroid/media/MediaFile;->FIRST_AUDIO_FILE_TYPE:I -Landroid/media/MediaFile;->getFileTypeForMimeType(Ljava/lang/String;)I Landroid/media/MediaFile;->getFileType(Ljava/lang/String;)Landroid/media/MediaFile$MediaFileType; +Landroid/media/MediaFile;->getFileTypeForMimeType(Ljava/lang/String;)I Landroid/media/MediaFile;->getMimeTypeForFile(Ljava/lang/String;)Ljava/lang/String; -Landroid/media/MediaFile;-><init>()V Landroid/media/MediaFile;->isAudioFileType(I)Z Landroid/media/MediaFile;->isImageFileType(I)Z Landroid/media/MediaFile;->isPlayListFileType(I)Z Landroid/media/MediaFile;->isVideoFileType(I)Z Landroid/media/MediaFile;->LAST_AUDIO_FILE_TYPE:I -Landroid/media/MediaFile$MediaFileType;->fileType:I -Landroid/media/MediaFile$MediaFileType;->mimeType:Ljava/lang/String; Landroid/media/MediaFile;->sFileTypeMap:Ljava/util/HashMap; Landroid/media/MediaFormat;->getMap()Ljava/util/Map; Landroid/media/MediaHTTPService;->createHttpServiceBinderIfNecessary(Ljava/lang/String;)Landroid/os/IBinder; @@ -1210,9 +1426,9 @@ Landroid/media/MediaPlayer;->getMetadata(ZZ)Landroid/media/Metadata; Landroid/media/MediaPlayer;->invoke(Landroid/os/Parcel;Landroid/os/Parcel;)V Landroid/media/MediaPlayer;->mEventHandler:Landroid/media/MediaPlayer$EventHandler; Landroid/media/MediaPlayer;->newRequest()Landroid/os/Parcel; -Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;)V -Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)V Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;)V +Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)V +Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;)V Landroid/media/MediaPlayer;->setRetransmitEndpoint(Ljava/net/InetSocketAddress;)V Landroid/media/MediaRecorder;->setParameter(Ljava/lang/String;)V Landroid/media/MediaRouter$RouteInfo;->getStatusCode()I @@ -1240,11 +1456,13 @@ Landroid/media/PlaybackParams;->SET_SPEED:I Landroid/media/RemoteDisplay;->notifyDisplayConnected(Landroid/view/Surface;IIII)V Landroid/media/RemoteDisplay;->notifyDisplayDisconnected()V Landroid/media/RemoteDisplay;->notifyDisplayError(I)V -Landroid/media/RemoteDisplayState;->displays:Ljava/util/ArrayList; Landroid/media/RemoteDisplayState;-><init>()V +Landroid/media/RemoteDisplayState;->displays:Ljava/util/ArrayList; Landroid/media/RingtoneManager;->getRingtone(Landroid/content/Context;Landroid/net/Uri;I)Landroid/media/Ringtone; -Landroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper; +Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager; +Landroid/media/session/MediaSession;->getCallingPackage()Ljava/lang/String; Landroid/media/session/MediaSession;->mCallback:Landroid/media/session/MediaSession$CallbackMessageHandler; +Landroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper; Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getCaptureSession()Ljava/lang/Integer; Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getData()[B Landroid/media/soundtrigger/SoundTriggerManager;->loadSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;)I @@ -1287,8 +1505,8 @@ Landroid/net/ConnectivityManager;->isNetworkSupported(I)Z Landroid/net/ConnectivityManager;->isNetworkTypeMobile(I)Z Landroid/net/ConnectivityManager;->mService:Landroid/net/IConnectivityManager; Landroid/net/ConnectivityManager;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V -Landroid/net/ConnectivityManager;->requestRouteToHostAddress(ILjava/net/InetAddress;)Z Landroid/net/ConnectivityManager;->requestRouteToHost(II)Z +Landroid/net/ConnectivityManager;->requestRouteToHostAddress(ILjava/net/InetAddress;)Z Landroid/net/ConnectivityManager;->setBackgroundDataSetting(Z)V Landroid/net/ConnectivityManager;->TYPE_MOBILE_CBS:I Landroid/net/ConnectivityManager;->TYPE_MOBILE_EMERGENCY:I @@ -1299,11 +1517,7 @@ Landroid/net/ConnectivityManager;->TYPE_NONE:I Landroid/net/ConnectivityManager;->TYPE_PROXY:I Landroid/net/ConnectivityManager;->TYPE_WIFI_P2P:I Landroid/net/http/SslError;->mCertificate:Landroid/net/http/SslCertificate; -Landroid/net/IConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties; -Landroid/net/IConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo; -Landroid/net/IConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo; -Landroid/net/IConnectivityManager;->getTetheredIfaces()[Ljava/lang/String; -Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager; +Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties; Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo; Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo; @@ -1311,9 +1525,16 @@ Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Net Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableIfaces()[Ljava/lang/String; Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String; Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String; -Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String; +Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager; +Landroid/net/IConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties; +Landroid/net/IConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo; +Landroid/net/IConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo; +Landroid/net/IConnectivityManager;->getTetheredIfaces()[Ljava/lang/String; +Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager; +Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService; Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String; Landroid/net/IpConfiguration;->httpProxy:Landroid/net/ProxyInfo; Landroid/net/LinkProperties;->setHttpProxy(Landroid/net/ProxyInfo;)V Landroid/net/LocalSocketImpl;->inboundFileDescriptors:[Ljava/io/FileDescriptor; @@ -1323,7 +1544,6 @@ Landroid/net/NetworkCapabilities;->getTransportTypes()[I Landroid/net/NetworkPolicyManager;->mService:Landroid/net/INetworkPolicyManager; Landroid/net/NetworkStats;->capacity:I Landroid/net/NetworkStats;->defaultNetwork:[I -Landroid/net/NetworkStatsHistory$Entry;->rxBytes:J Landroid/net/NetworkStats;->iface:[Ljava/lang/String; Landroid/net/NetworkStats;->metered:[I Landroid/net/NetworkStats;->operations:[J @@ -1336,15 +1556,16 @@ Landroid/net/NetworkStats;->tag:[I Landroid/net/NetworkStats;->txBytes:[J Landroid/net/NetworkStats;->txPackets:[J Landroid/net/NetworkStats;->uid:[I +Landroid/net/NetworkStatsHistory$Entry;->rxBytes:J Landroid/net/NetworkTemplate;->buildTemplateWifi()Landroid/net/NetworkTemplate; Landroid/net/Proxy;->getProxy(Landroid/content/Context;Ljava/lang/String;)Ljava/net/Proxy; Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;ILjava/lang/String;)V Landroid/net/SntpClient;-><init>()V +Landroid/net/SSLCertificateSocketFactory;-><init>(ILandroid/net/SSLSessionCache;Z)V Landroid/net/SSLCertificateSocketFactory;->castToOpenSSLSocket(Ljava/net/Socket;)Lcom/android/org/conscrypt/OpenSSLSocketImpl; Landroid/net/SSLCertificateSocketFactory;->getAlpnSelectedProtocol(Ljava/net/Socket;)[B Landroid/net/SSLCertificateSocketFactory;->getDelegate()Ljavax/net/ssl/SSLSocketFactory; Landroid/net/SSLCertificateSocketFactory;->getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory; -Landroid/net/SSLCertificateSocketFactory;-><init>(ILandroid/net/SSLSessionCache;Z)V Landroid/net/SSLCertificateSocketFactory;->INSECURE_TRUST_MANAGER:[Ljavax/net/ssl/TrustManager; Landroid/net/SSLCertificateSocketFactory;->isSslCheckRelaxed()Z Landroid/net/SSLCertificateSocketFactory;->makeSocketFactory([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;)Ljavax/net/ssl/SSLSocketFactory; @@ -1354,8 +1575,8 @@ Landroid/net/SSLCertificateSocketFactory;->mHandshakeTimeoutMillis:I Landroid/net/SSLCertificateSocketFactory;->mInsecureFactory:Ljavax/net/ssl/SSLSocketFactory; Landroid/net/SSLCertificateSocketFactory;->mKeyManagers:[Ljavax/net/ssl/KeyManager; Landroid/net/SSLCertificateSocketFactory;->mNpnProtocols:[B -Landroid/net/SSLCertificateSocketFactory;->mSecureFactory:Ljavax/net/ssl/SSLSocketFactory; Landroid/net/SSLCertificateSocketFactory;->mSecure:Z +Landroid/net/SSLCertificateSocketFactory;->mSecureFactory:Ljavax/net/ssl/SSLSocketFactory; Landroid/net/SSLCertificateSocketFactory;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache; Landroid/net/SSLCertificateSocketFactory;->mTrustManagers:[Ljavax/net/ssl/TrustManager; Landroid/net/SSLCertificateSocketFactory;->setAlpnProtocols([[B)V @@ -1364,19 +1585,23 @@ Landroid/net/SSLCertificateSocketFactory;->setSoWriteTimeout(Ljava/net/Socket;I) Landroid/net/SSLCertificateSocketFactory;->TAG:Ljava/lang/String; Landroid/net/SSLCertificateSocketFactory;->verifyHostname(Ljava/net/Socket;Ljava/lang/String;)V Landroid/net/SSLSessionCache;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache; -Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress; Landroid/net/StaticIpConfiguration;-><init>()V +Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress; Landroid/net/StaticIpConfiguration;->ipAddress:Landroid/net/LinkAddress; Landroid/net/TrafficStats;->getMobileIfaces()[Ljava/lang/String; Landroid/net/TrafficStats;->getRxBytes(Ljava/lang/String;)J Landroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService; Landroid/net/TrafficStats;->getTxBytes(Ljava/lang/String;)J Landroid/net/Uri;-><init>()V -Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager; Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager; +Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Landroid/net/wifi/IWifiScanner$Stub;-><init>()V +Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner; Landroid/net/wifi/p2p/WifiP2pGroup;->getNetworkId()I -Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection; Landroid/net/wifi/p2p/WifiP2pGroup;->TEMPORARY_NET_ID:I +Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection; Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel; Landroid/net/wifi/p2p/WifiP2pManager$Channel;->putListener(Ljava/lang/Object;)I Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP:I @@ -1384,12 +1609,6 @@ Landroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p Landroid/net/wifi/p2p/WifiP2pManager;->requestPersistentGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;)V Landroid/net/wifi/p2p/WifiP2pManager;->setDeviceName(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V Landroid/net/wifi/p2p/WifiP2pManager;->setWifiP2pChannels(Landroid/net/wifi/p2p/WifiP2pManager$Channel;IILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V -Landroid/net/wifi/ScanResult;->anqpDomainId:I -Landroid/net/wifi/ScanResult;->anqpLines:Ljava/util/List; -Landroid/net/wifi/ScanResult;->distanceCm:I -Landroid/net/wifi/ScanResult;->distanceSdCm:I -Landroid/net/wifi/ScanResult;->flags:J -Landroid/net/wifi/ScanResult;->hessid:J Landroid/net/wifi/ScanResult$InformationElement;->bytes:[B Landroid/net/wifi/ScanResult$InformationElement;->EID_BSS_LOAD:I Landroid/net/wifi/ScanResult$InformationElement;->EID_ERP:I @@ -1405,6 +1624,12 @@ Landroid/net/wifi/ScanResult$InformationElement;->EID_TIM:I Landroid/net/wifi/ScanResult$InformationElement;->EID_VHT_OPERATION:I Landroid/net/wifi/ScanResult$InformationElement;->EID_VSA:I Landroid/net/wifi/ScanResult$InformationElement;->id:I +Landroid/net/wifi/ScanResult;->anqpDomainId:I +Landroid/net/wifi/ScanResult;->anqpLines:Ljava/util/List; +Landroid/net/wifi/ScanResult;->distanceCm:I +Landroid/net/wifi/ScanResult;->distanceSdCm:I +Landroid/net/wifi/ScanResult;->flags:J +Landroid/net/wifi/ScanResult;->hessid:J Landroid/net/wifi/ScanResult;->informationElements:[Landroid/net/wifi/ScanResult$InformationElement; Landroid/net/wifi/ScanResult;->numUsage:I Landroid/net/wifi/ScanResult;->seen:J @@ -1448,46 +1673,44 @@ Landroid/os/AsyncTask;->mWorker:Landroid/os/AsyncTask$WorkerRunnable; Landroid/os/AsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor; Landroid/os/AsyncTask;->setDefaultExecutor(Ljava/util/concurrent/Executor;)V Landroid/os/BatteryStats$Counter;->getCountLocked(I)I -Landroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray; Landroid/os/BatteryStats$HistoryItem;->CMD_UPDATE:B Landroid/os/BatteryStats$HistoryItem;->states2:I -Landroid/os/BatteryStats;->NUM_DATA_CONNECTION_TYPES:I -Landroid/os/BatteryStats;->startIteratingHistoryLocked()Z Landroid/os/BatteryStats$Timer;->getTotalTimeLocked(JI)J -Landroid/os/BatteryStats$Uid;->getAudioTurnedOnTimer()Landroid/os/BatteryStats$Timer; -Landroid/os/BatteryStats$Uid;->getFullWifiLockTime(JI)J -Landroid/os/BatteryStats$Uid;->getPackageStats()Landroid/util/ArrayMap; -Landroid/os/BatteryStats$Uid;->getProcessStats()Landroid/util/ArrayMap; -Landroid/os/BatteryStats$Uid;->getSensorStats()Landroid/util/SparseArray; -Landroid/os/BatteryStats$Uid;->getUid()I -Landroid/os/BatteryStats$Uid;->getVideoTurnedOnTimer()Landroid/os/BatteryStats$Timer; -Landroid/os/BatteryStats$Uid;->getWifiMulticastTime(JI)J -Landroid/os/BatteryStats$Uid;->getWifiScanTime(JI)J -Landroid/os/BatteryStats$Uid$Pkg;->getServiceStats()Landroid/util/ArrayMap; -Landroid/os/BatteryStats$Uid$Pkg;->getWakeupAlarmStats()Landroid/util/ArrayMap; Landroid/os/BatteryStats$Uid$Pkg$Serv;->getLaunches(I)I Landroid/os/BatteryStats$Uid$Pkg$Serv;->getStartTime(JI)J -Landroid/os/BatteryStats$Uid$Proc;->countExcessivePowers()I +Landroid/os/BatteryStats$Uid$Pkg;->getServiceStats()Landroid/util/ArrayMap; +Landroid/os/BatteryStats$Uid$Pkg;->getWakeupAlarmStats()Landroid/util/ArrayMap; Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->overTime:J Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->type:I Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->usedTime:J +Landroid/os/BatteryStats$Uid$Proc;->countExcessivePowers()I Landroid/os/BatteryStats$Uid$Proc;->getExcessivePower(I)Landroid/os/BatteryStats$Uid$Proc$ExcessivePower; Landroid/os/BatteryStats$Uid$Proc;->getForegroundTime(I)J +Landroid/os/BatteryStats$Uid$Proc;->getStarts(I)I Landroid/os/BatteryStats$Uid$Proc;->getSystemTime(I)J Landroid/os/BatteryStats$Uid$Proc;->getUserTime(I)J Landroid/os/BatteryStats$Uid$Sensor;->getHandle()I Landroid/os/BatteryStats$Uid$Sensor;->getSensorTime()Landroid/os/BatteryStats$Timer; +Landroid/os/BatteryStats$Uid;->getAudioTurnedOnTimer()Landroid/os/BatteryStats$Timer; +Landroid/os/BatteryStats$Uid;->getFullWifiLockTime(JI)J +Landroid/os/BatteryStats$Uid;->getPackageStats()Landroid/util/ArrayMap; +Landroid/os/BatteryStats$Uid;->getProcessStats()Landroid/util/ArrayMap; +Landroid/os/BatteryStats$Uid;->getSensorStats()Landroid/util/SparseArray; +Landroid/os/BatteryStats$Uid;->getUid()I +Landroid/os/BatteryStats$Uid;->getVideoTurnedOnTimer()Landroid/os/BatteryStats$Timer; +Landroid/os/BatteryStats$Uid;->getWifiMulticastTime(JI)J +Landroid/os/BatteryStats$Uid;->getWifiScanTime(JI)J +Landroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray; +Landroid/os/BatteryStats;->NUM_DATA_CONNECTION_TYPES:I +Landroid/os/BatteryStats;->startIteratingHistoryLocked()Z Landroid/os/Binder;->execTransact(IJJI)Z Landroid/os/Binder;->mObject:J +Landroid/os/Build$VERSION;->ACTIVE_CODENAMES:[Ljava/lang/String; Landroid/os/Build;->getString(Ljava/lang/String;)Ljava/lang/String; Landroid/os/Build;->IS_DEBUGGABLE:Z Landroid/os/Build;->IS_EMULATOR:Z -Landroid/os/Build$VERSION;->ACTIVE_CODENAMES:[Ljava/lang/String; Landroid/os/Bundle;->getIBinder(Ljava/lang/String;)Landroid/os/IBinder; Landroid/os/Bundle;->putIBinder(Ljava/lang/String;Landroid/os/IBinder;)V -Landroid/os/Debug;->countInstancesOfClass(Ljava/lang/Class;)J -Landroid/os/Debug;->dumpReferenceTables()V -Landroid/os/Debug;-><init>()V Landroid/os/Debug$MemoryInfo;->dalvikPrivateClean:I Landroid/os/Debug$MemoryInfo;->dalvikRss:I Landroid/os/Debug$MemoryInfo;->dalvikSharedClean:I @@ -1495,8 +1718,8 @@ Landroid/os/Debug$MemoryInfo;->dalvikSwappablePss:I Landroid/os/Debug$MemoryInfo;->dalvikSwappedOut:I Landroid/os/Debug$MemoryInfo;->dalvikSwappedOutPss:I Landroid/os/Debug$MemoryInfo;->getOtherLabel(I)Ljava/lang/String; -Landroid/os/Debug$MemoryInfo;->getOtherPrivateDirty(I)I Landroid/os/Debug$MemoryInfo;->getOtherPrivate(I)I +Landroid/os/Debug$MemoryInfo;->getOtherPrivateDirty(I)I Landroid/os/Debug$MemoryInfo;->getOtherPss(I)I Landroid/os/Debug$MemoryInfo;->getOtherSharedDirty(I)I Landroid/os/Debug$MemoryInfo;->getTotalUss()I @@ -1516,6 +1739,10 @@ Landroid/os/Debug$MemoryInfo;->otherStats:[I Landroid/os/Debug$MemoryInfo;->otherSwappablePss:I Landroid/os/Debug$MemoryInfo;->otherSwappedOut:I Landroid/os/Debug$MemoryInfo;->otherSwappedOutPss:I +Landroid/os/Debug;-><init>()V +Landroid/os/Debug;->countInstancesOfClass(Ljava/lang/Class;)J +Landroid/os/Debug;->dumpReferenceTables()V +Landroid/os/DropBoxManager;->mService:Lcom/android/internal/os/IDropBoxManagerService; Landroid/os/Environment;->buildExternalStorageAppDataDirs(Ljava/lang/String;)[Ljava/io/File; Landroid/os/Environment;->getStorageDirectory()Ljava/io/File; Landroid/os/Environment;->getVendorDirectory()Ljava/io/File; @@ -1526,42 +1753,46 @@ Landroid/os/FileUtils;->copyFile(Ljava/io/File;Ljava/io/File;)Z Landroid/os/FileUtils;->copyToFile(Ljava/io/InputStream;Ljava/io/File;)Z Landroid/os/FileUtils;->deleteOlderFiles(Ljava/io/File;IJ)Z Landroid/os/FileUtils;->readTextFile(Ljava/io/File;ILjava/lang/String;)Ljava/lang/String; -Landroid/os/FileUtils;->setPermissions(Ljava/io/FileDescriptor;III)I Landroid/os/FileUtils;->setPermissions(Ljava/io/File;III)I +Landroid/os/FileUtils;->setPermissions(Ljava/io/FileDescriptor;III)I Landroid/os/FileUtils;->setPermissions(Ljava/lang/String;III)I Landroid/os/FileUtils;->stringToFile(Ljava/io/File;Ljava/lang/String;)V Landroid/os/FileUtils;->stringToFile(Ljava/lang/String;Ljava/lang/String;)V Landroid/os/FileUtils;->sync(Ljava/io/FileOutputStream;)Z +Landroid/os/Handler;-><init>(Z)V Landroid/os/Handler;->getIMessenger()Landroid/os/IMessenger; Landroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z -Landroid/os/Handler;-><init>(Z)V Landroid/os/Handler;->mCallback:Landroid/os/Handler$Callback; Landroid/os/Handler;->mMessenger:Landroid/os/IMessenger; Landroid/os/health/HealthKeys$Constants;-><init>(Ljava/lang/Class;)V Landroid/os/health/HealthStats;-><init>(Landroid/os/Parcel;)V -Landroid/os/health/HealthStatsParceler;->getHealthStats()Landroid/os/health/HealthStats; Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/health/HealthStatsWriter;)V Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/Parcel;)V +Landroid/os/health/HealthStatsParceler;->getHealthStats()Landroid/os/health/HealthStats; +Landroid/os/health/HealthStatsWriter;-><init>(Landroid/os/health/HealthKeys$Constants;)V Landroid/os/health/HealthStatsWriter;->addMeasurement(IJ)V Landroid/os/health/HealthStatsWriter;->addMeasurements(ILjava/lang/String;J)V Landroid/os/health/HealthStatsWriter;->addStats(ILjava/lang/String;Landroid/os/health/HealthStatsWriter;)V Landroid/os/health/HealthStatsWriter;->addTimer(IIJ)V Landroid/os/health/HealthStatsWriter;->addTimers(ILjava/lang/String;Landroid/os/health/TimerStat;)V Landroid/os/health/HealthStatsWriter;->flattenToParcel(Landroid/os/Parcel;)V -Landroid/os/health/HealthStatsWriter;-><init>(Landroid/os/health/HealthKeys$Constants;)V Landroid/os/health/SystemHealthManager;->from(Landroid/content/Context;)Landroid/os/health/SystemHealthManager; Landroid/os/HwParcel;-><init>(Z)V Landroid/os/HwRemoteBinder;-><init>()V Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Landroid/os/IPermissionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPermissionController; Landroid/os/IPermissionController$Stub$Proxy;->checkPermission(Ljava/lang/String;II)Z -Landroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager; +Landroid/os/IPermissionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPermissionController; Landroid/os/IPowerManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z +Landroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager; +Landroid/os/IPowerManager;->releaseWakeLock(Landroid/os/IBinder;I)V Landroid/os/IPowerManager;->userActivity(JII)V +Landroid/os/IRecoverySystem$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IRecoverySystem; Landroid/os/IServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder; Landroid/os/IServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder; Landroid/os/IUserManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/os/IUserManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IUserManager; +Landroid/os/IVibratorService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IVibratorService; Landroid/os/LocaleList;->setDefault(Landroid/os/LocaleList;I)V Landroid/os/Looper;->mQueue:Landroid/os/MessageQueue; Landroid/os/Looper;->setTraceTag(J)V @@ -1571,6 +1802,9 @@ Landroid/os/Message;->callback:Ljava/lang/Runnable; Landroid/os/Message;->flags:I Landroid/os/Message;->markInUse()V Landroid/os/Message;->next:Landroid/os/Message; +Landroid/os/Message;->recycleUnchecked()V +Landroid/os/Message;->target:Landroid/os/Handler; +Landroid/os/Message;->when:J Landroid/os/MessageQueue;->dispatchEvents(II)I Landroid/os/MessageQueue;->mIdleHandlers:Ljava/util/ArrayList; Landroid/os/MessageQueue;->mMessages:Landroid/os/Message; @@ -1580,17 +1814,14 @@ Landroid/os/MessageQueue;->nativePollOnce(JI)V Landroid/os/MessageQueue;->next()Landroid/os/Message; Landroid/os/MessageQueue;->postSyncBarrier()I Landroid/os/MessageQueue;->removeSyncBarrier(I)V -Landroid/os/Message;->recycleUnchecked()V -Landroid/os/Message;->target:Landroid/os/Handler; -Landroid/os/Message;->when:J -Landroid/os/ParcelFileDescriptor;->fromData([BLjava/lang/String;)Landroid/os/ParcelFileDescriptor; -Landroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;)V +Landroid/os/Parcel$ReadWriteHelper;-><init>()V Landroid/os/Parcel;->mNativePtr:J Landroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;Ljava/lang/ClassLoader;)V Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List; -Landroid/os/Parcel$ReadWriteHelper;-><init>()V Landroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V +Landroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;)V +Landroid/os/ParcelFileDescriptor;->fromData([BLjava/lang/String;)Landroid/os/ParcelFileDescriptor; Landroid/os/PowerManager;->getDefaultScreenBrightnessSetting()I Landroid/os/PowerManager;->getMaximumScreenBrightnessSetting()I Landroid/os/PowerManager;->getMinimumScreenBrightnessSetting()I @@ -1598,8 +1829,9 @@ Landroid/os/PowerManager;->isLightDeviceIdleMode()Z Landroid/os/PowerManager;->mService:Landroid/os/IPowerManager; Landroid/os/PowerManager;->userActivity(JZ)V Landroid/os/PowerManager;->validateWakeLockParameters(ILjava/lang/String;)V -Landroid/os/PowerManager;->wakeUp(JLjava/lang/String;)V Landroid/os/PowerManager;->wakeUp(J)V +Landroid/os/PowerManager;->wakeUp(JLjava/lang/String;)V +Landroid/os/Process;->getFreeMemory()J Landroid/os/Process;->getParentPid(I)I Landroid/os/Process;->getPids(Ljava/lang/String;[I)[I Landroid/os/Process;->getTotalMemory()J @@ -1608,24 +1840,26 @@ Landroid/os/Process;->isIsolated(I)Z Landroid/os/Process;->readProcFile(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z Landroid/os/Process;->readProcLines(Ljava/lang/String;[Ljava/lang/String;[J)V Landroid/os/Process;->setArgV0(Ljava/lang/String;)V +Landroid/os/SELinux;->checkSELinuxAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z Landroid/os/SELinux;->getFileContext(Ljava/lang/String;)Ljava/lang/String; +Landroid/os/SELinux;->getPidContext(I)Ljava/lang/String; Landroid/os/SELinux;->isSELinuxEnabled()Z Landroid/os/SELinux;->isSELinuxEnforced()Z +Landroid/os/ServiceManager;-><init>()V Landroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;)V Landroid/os/ServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder; Landroid/os/ServiceManager;->getIServiceManager()Landroid/os/IServiceManager; Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder; -Landroid/os/ServiceManager;-><init>()V Landroid/os/ServiceManager;->listServices()[Ljava/lang/String; -Landroid/os/ServiceManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/os/IServiceManager; Landroid/os/ServiceManager;->sCache:Ljava/util/HashMap; Landroid/os/ServiceManager;->sServiceManager:Landroid/os/IServiceManager; +Landroid/os/ServiceManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/os/IServiceManager; Landroid/os/SharedMemory;->getFd()I Landroid/os/storage/DiskInfo;->getDescription()Ljava/lang/String; Landroid/os/storage/DiskInfo;->isSd()Z Landroid/os/storage/DiskInfo;->isUsb()Z -Landroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager; Landroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager; Landroid/os/storage/StorageManager;->findVolumeByUuid(Ljava/lang/String;)Landroid/os/storage/VolumeInfo; Landroid/os/storage/StorageManager;->getBestVolumeDescription(Landroid/os/storage/VolumeInfo;)Ljava/lang/String; Landroid/os/storage/StorageManager;->getDisks()Ljava/util/List; @@ -1633,15 +1867,15 @@ Landroid/os/storage/StorageManager;->getPrimaryVolume()Landroid/os/storage/Stora Landroid/os/storage/StorageManager;->getStorageBytesUntilLow(Ljava/io/File;)J Landroid/os/storage/StorageManager;->getStorageFullBytes(Ljava/io/File;)J Landroid/os/storage/StorageManager;->getStorageLowBytes(Ljava/io/File;)J -Landroid/os/storage/StorageManager;->getVolumeList(II)[Landroid/os/storage/StorageVolume; Landroid/os/storage/StorageManager;->getVolumeList()[Landroid/os/storage/StorageVolume; +Landroid/os/storage/StorageManager;->getVolumeList(II)[Landroid/os/storage/StorageVolume; Landroid/os/storage/StorageManager;->getVolumePaths()[Ljava/lang/String; Landroid/os/storage/StorageManager;->getVolumes()Ljava/util/List; Landroid/os/storage/StorageManager;->getVolumeState(Ljava/lang/String;)Ljava/lang/String; Landroid/os/storage/StorageVolume;->allowMassStorage()Z Landroid/os/storage/StorageVolume;->getMaxFileSize()J -Landroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File; Landroid/os/storage/StorageVolume;->getPath()Ljava/lang/String; +Landroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File; Landroid/os/storage/StorageVolume;->getUserLabel()Ljava/lang/String; Landroid/os/storage/StorageVolume;->mPath:Ljava/io/File; Landroid/os/storage/VolumeInfo;->buildStorageVolume(Landroid/content/Context;IZ)Landroid/os/storage/StorageVolume; @@ -1655,16 +1889,16 @@ Landroid/os/storage/VolumeInfo;->isPrimary()Z Landroid/os/storage/VolumeInfo;->isVisible()Z Landroid/os/storage/VolumeInfo;->TYPE_EMULATED:I Landroid/os/storage/VolumeInfo;->TYPE_PUBLIC:I +Landroid/os/StrictMode$Span;->finish()V +Landroid/os/StrictMode$ThreadPolicy$Builder;->penaltyListener(Landroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)Landroid/os/StrictMode$ThreadPolicy$Builder; Landroid/os/StrictMode;->conditionallyCheckInstanceCounts()V Landroid/os/StrictMode;->disableDeathOnFileUriExposure()V Landroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span; Landroid/os/StrictMode;->getThreadPolicyMask()I Landroid/os/StrictMode;->onBinderStrictModePolicyChange(I)V -Landroid/os/StrictMode$Span;->finish()V -Landroid/os/StrictMode$ThreadPolicy$Builder;->penaltyListener(Landroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)Landroid/os/StrictMode$ThreadPolicy$Builder; Landroid/os/StrictMode;->violationsBeingTimed:Ljava/lang/ThreadLocal; -Landroid/os/SystemProperties;->addChangeCallback(Ljava/lang/Runnable;)V Landroid/os/SystemProperties;-><init>()V +Landroid/os/SystemProperties;->addChangeCallback(Ljava/lang/Runnable;)V Landroid/os/SystemProperties;->native_get(Ljava/lang/String;)Ljava/lang/String; Landroid/os/SystemProperties;->PROP_NAME_MAX:I Landroid/os/SystemProperties;->set(Ljava/lang/String;Ljava/lang/String;)V @@ -1683,6 +1917,7 @@ Landroid/os/UpdateLock;->NOW_IS_CONVENIENT:Ljava/lang/String; Landroid/os/UpdateLock;->release()V Landroid/os/UpdateLock;->TIMESTAMP:Ljava/lang/String; Landroid/os/UpdateLock;->UPDATE_LOCK_CHANGED:Ljava/lang/String; +Landroid/os/UserHandle;-><init>(I)V Landroid/os/UserHandle;->AID_APP_END:I Landroid/os/UserHandle;->AID_APP_START:I Landroid/os/UserHandle;->AID_CACHE_GID_START:I @@ -1696,7 +1931,6 @@ Landroid/os/UserHandle;->getAppIdFromSharedAppGid(I)I Landroid/os/UserHandle;->getCallingUserId()I Landroid/os/UserHandle;->getUid(II)I Landroid/os/UserHandle;->getUserId(I)I -Landroid/os/UserHandle;-><init>(I)V Landroid/os/UserHandle;->MU_ENABLED:Z Landroid/os/UserHandle;->OWNER:Landroid/os/UserHandle; Landroid/os/UserHandle;->PER_USER_RANGE:I @@ -1707,21 +1941,22 @@ Landroid/os/UserHandle;->USER_NULL:I Landroid/os/UserHandle;->USER_OWNER:I Landroid/os/UserHandle;->USER_SERIAL_SYSTEM:I Landroid/os/UserHandle;->USER_SYSTEM:I -Landroid/os/UserManager;->getBadgedLabelForUser(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence; Landroid/os/UserManager;->get(Landroid/content/Context;)Landroid/os/UserManager; +Landroid/os/UserManager;->getBadgedLabelForUser(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence; Landroid/os/UserManager;->getMaxSupportedUsers()I Landroid/os/UserManager;->getProfiles(I)Ljava/util/List; Landroid/os/UserManager;->getUserHandle()I Landroid/os/UserManager;->getUserHandle(I)I Landroid/os/UserManager;->getUserIcon(I)Landroid/graphics/Bitmap; Landroid/os/UserManager;->getUserInfo(I)Landroid/content/pm/UserInfo; -Landroid/os/UserManager;->getUserSerialNumber(I)I Landroid/os/UserManager;->getUsers()Ljava/util/List; +Landroid/os/UserManager;->getUserSerialNumber(I)I Landroid/os/UserManager;->getUserStartRealtime()J Landroid/os/UserManager;->getUserUnlockRealtime()J Landroid/os/UserManager;->hasBaseUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z Landroid/os/UserManager;->isLinkedUser()Z Landroid/os/UserManager;->isUserUnlocked(I)Z +Landroid/os/UserManager;->mService:Landroid/os/IUserManager; Landroid/os/VintfObject;->getHalNamesAndVersions()[Ljava/lang/String; Landroid/os/VintfObject;->getSepolicyVersion()Ljava/lang/String; Landroid/os/VintfObject;->getTargetFrameworkCompatibilityMatrixVersion()Ljava/lang/Long; @@ -1734,12 +1969,12 @@ Landroid/os/VintfRuntimeInfo;->getNodeName()Ljava/lang/String; Landroid/os/VintfRuntimeInfo;->getOsName()Ljava/lang/String; Landroid/os/VintfRuntimeInfo;->getOsRelease()Ljava/lang/String; Landroid/os/VintfRuntimeInfo;->getOsVersion()Ljava/lang/String; -Landroid/os/WorkSource;->add(ILjava/lang/String;)Z +Landroid/os/WorkSource;-><init>(I)V Landroid/os/WorkSource;->add(I)Z +Landroid/os/WorkSource;->add(ILjava/lang/String;)Z Landroid/os/WorkSource;->addReturningNewbs(Landroid/os/WorkSource;)Landroid/os/WorkSource; Landroid/os/WorkSource;->get(I)I Landroid/os/WorkSource;->getName(I)Ljava/lang/String; -Landroid/os/WorkSource;-><init>(I)V Landroid/os/WorkSource;->mNames:[Ljava/lang/String; Landroid/os/WorkSource;->mNum:I Landroid/os/WorkSource;->mUids:[I @@ -1747,16 +1982,20 @@ Landroid/os/WorkSource;->setReturningDiffs(Landroid/os/WorkSource;)[Landroid/os/ Landroid/os/WorkSource;->size()I Landroid/permissionpresenterservice/RuntimePermissionPresenterService;->onRevokeRuntimePermission(Ljava/lang/String;Ljava/lang/String;)V Landroid/preference/DialogPreference;->mBuilder:Landroid/app/AlertDialog$Builder; -Landroid/preference/DialogPreference;->mDialogIcon:Landroid/graphics/drawable/Drawable; Landroid/preference/DialogPreference;->mDialog:Landroid/app/Dialog; +Landroid/preference/DialogPreference;->mDialogIcon:Landroid/graphics/drawable/Drawable; Landroid/preference/DialogPreference;->mDialogMessage:Ljava/lang/CharSequence; Landroid/preference/DialogPreference;->mDialogTitle:Ljava/lang/CharSequence; Landroid/preference/DialogPreference;->mNegativeButtonText:Ljava/lang/CharSequence; Landroid/preference/DialogPreference;->mPositiveButtonText:Ljava/lang/CharSequence; Landroid/preference/DialogPreference;->mWhichButtonClicked:I Landroid/preference/ListPreference;->mClickedDialogEntryIndex:I +Landroid/preference/Preference;->onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z +Landroid/preference/Preference;->performClick(Landroid/preference/PreferenceScreen;)V Landroid/preference/PreferenceActivity;->mPreferenceManager:Landroid/preference/PreferenceManager; Landroid/preference/PreferenceActivity;->mPrefsContainer:Landroid/view/ViewGroup; +Landroid/preference/PreferenceManager;-><init>(Landroid/app/Activity;I)V +Landroid/preference/PreferenceManager;-><init>(Landroid/content/Context;)V Landroid/preference/PreferenceManager;->dispatchActivityDestroy()V Landroid/preference/PreferenceManager;->dispatchActivityResult(IILandroid/content/Intent;)V Landroid/preference/PreferenceManager;->dispatchActivityStop()V @@ -1764,8 +2003,6 @@ Landroid/preference/PreferenceManager;->getEditor()Landroid/content/SharedPrefer Landroid/preference/PreferenceManager;->getPreferenceScreen()Landroid/preference/PreferenceScreen; Landroid/preference/PreferenceManager;->inflateFromIntent(Landroid/content/Intent;Landroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen; Landroid/preference/PreferenceManager;->inflateFromResource(Landroid/content/Context;ILandroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen; -Landroid/preference/PreferenceManager;-><init>(Landroid/app/Activity;I)V -Landroid/preference/PreferenceManager;-><init>(Landroid/content/Context;)V Landroid/preference/PreferenceManager;->mActivityDestroyListeners:Ljava/util/List; Landroid/preference/PreferenceManager;->mOnPreferenceTreeClickListener:Landroid/preference/PreferenceManager$OnPreferenceTreeClickListener; Landroid/preference/PreferenceManager;->mSharedPreferences:Landroid/content/SharedPreferences; @@ -1776,8 +2013,6 @@ Landroid/preference/PreferenceManager;->setPreferences(Landroid/preference/Prefe Landroid/preference/PreferenceManager;->shouldCommit()Z Landroid/preference/PreferenceManager;->unregisterOnActivityDestroyListener(Landroid/preference/PreferenceManager$OnActivityDestroyListener;)V Landroid/preference/PreferenceManager;->unregisterOnActivityStopListener(Landroid/preference/PreferenceManager$OnActivityStopListener;)V -Landroid/preference/Preference;->onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z -Landroid/preference/Preference;->performClick(Landroid/preference/PreferenceScreen;)V Landroid/preference/PreferenceScreen;->mRootAdapter:Landroid/widget/ListAdapter; Landroid/print/PrinterId;->getServiceName()Landroid/content/ComponentName; Landroid/print/PrintJobInfo;->getAdvancedOptions()Landroid/os/Bundle; @@ -1795,13 +2030,32 @@ Landroid/provider/Browser;->sendString(Landroid/content/Context;Ljava/lang/Strin Landroid/provider/Browser;->updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V Landroid/provider/CalendarContract$CalendarAlerts;->findNextAlarmTime(Landroid/content/ContentResolver;J)J Landroid/provider/CalendarContract$CalendarAlerts;->rescheduleMissedAlarms(Landroid/content/ContentResolver;Landroid/content/Context;Landroid/app/AlarmManager;)V +Landroid/provider/Downloads$Impl$RequestHeaders;->INSERT_KEY_PREFIX:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_ALLOWED_NETWORK_TYPES:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_ALLOW_ROAMING:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_COOKIE_DATA:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_DELETED:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_DESCRIPTION:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_DESTINATION:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_FILE_NAME_HINT:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_IS_PUBLIC_API:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_MEDIA_SCANNED:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_MIME_TYPE:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_CLASS:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_EXTRAS:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_PACKAGE:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_REFERER:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_TITLE:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_URI:Ljava/lang/String; +Landroid/provider/Downloads$Impl;->COLUMN_VISIBILITY:Ljava/lang/String; Landroid/provider/Downloads$Impl;->CONTENT_URI:Landroid/net/Uri; +Landroid/provider/Downloads$Impl;->DESTINATION_CACHE_PARTITION_PURGEABLE:I +Landroid/provider/Downloads$Impl;->DESTINATION_FILE_URI:I Landroid/provider/Settings$ContentProviderHolder;->mContentProvider:Landroid/content/IContentProvider; Landroid/provider/Settings$Global;->ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED:Ljava/lang/String; Landroid/provider/Settings$Global;->PACKAGE_VERIFIER_ENABLE:Ljava/lang/String; Landroid/provider/Settings$Global;->sNameValueCache:Landroid/provider/Settings$NameValueCache; -Landroid/provider/Settings;->isCallingPackageAllowedToDrawOverlays(Landroid/content/Context;ILjava/lang/String;Z)Z -Landroid/provider/Settings;->isCallingPackageAllowedToWriteSettings(Landroid/content/Context;ILjava/lang/String;Z)Z Landroid/provider/Settings$NameValueCache;->mProviderHolder:Landroid/provider/Settings$ContentProviderHolder; Landroid/provider/Settings$Secure;->ACCESSIBILITY_AUTOCLICK_ENABLED:Ljava/lang/String; Landroid/provider/Settings$Secure;->ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:Ljava/lang/String; @@ -1820,28 +2074,26 @@ Landroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentRes Landroid/provider/Settings$System;->SCREEN_AUTO_BRIGHTNESS_ADJ:Ljava/lang/String; Landroid/provider/Settings$System;->sNameValueCache:Landroid/provider/Settings$NameValueCache; Landroid/provider/Settings$System;->VOLUME_SETTINGS:[Ljava/lang/String; -Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri; -Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri; -Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri; -Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri; +Landroid/provider/Settings;->isCallingPackageAllowedToDrawOverlays(Landroid/content/Context;ILjava/lang/String;Z)Z +Landroid/provider/Settings;->isCallingPackageAllowedToWriteSettings(Landroid/content/Context;ILjava/lang/String;Z)Z Landroid/provider/Telephony$Sms$Inbox;->addMessage(ILandroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Z)Landroid/net/Uri; Landroid/provider/Telephony$Sms$Inbox;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Z)Landroid/net/Uri; Landroid/provider/Telephony$Sms$Sent;->addMessage(ILandroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri; Landroid/provider/Telephony$Sms$Sent;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri; -Landroid/renderscript/RenderScriptCacheDir;->mCacheDir:Ljava/io/File; -Landroid/renderscript/RenderScript;->create(Landroid/content/Context;I)Landroid/renderscript/RenderScript; -Landroid/renderscript/RenderScript;->create(Landroid/content/Context;ILandroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript; -Landroid/renderscript/RenderScript;->getMinorID()J +Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri; +Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri; +Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri; +Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri; +Landroid/R$styleable;->ActionBar:[I Landroid/R$styleable;->ActionBar_background:I Landroid/R$styleable;->ActionBar_backgroundSplit:I Landroid/R$styleable;->ActionBar_backgroundStacked:I Landroid/R$styleable;->ActionBar_divider:I -Landroid/R$styleable;->ActionBar:[I Landroid/R$styleable;->ActionBar_itemPadding:I +Landroid/R$styleable;->CalendarView:[I Landroid/R$styleable;->CalendarView_dateTextAppearance:I Landroid/R$styleable;->CalendarView_firstDayOfWeek:I Landroid/R$styleable;->CalendarView_focusedMonthDateColor:I -Landroid/R$styleable;->CalendarView:[I Landroid/R$styleable;->CalendarView_selectedDateVerticalBar:I Landroid/R$styleable;->CalendarView_selectedWeekBackgroundColor:I Landroid/R$styleable;->CalendarView_shownWeekCount:I @@ -1850,26 +2102,27 @@ Landroid/R$styleable;->CalendarView_unfocusedMonthDateColor:I Landroid/R$styleable;->CalendarView_weekDayTextAppearance:I Landroid/R$styleable;->CalendarView_weekNumberColor:I Landroid/R$styleable;->CalendarView_weekSeparatorLineColor:I -Landroid/R$styleable;->CheckedTextView_checkMark:I Landroid/R$styleable;->CheckedTextView:[I -Landroid/R$styleable;->CompoundButton_button:I +Landroid/R$styleable;->CheckedTextView_checkMark:I Landroid/R$styleable;->CompoundButton:[I +Landroid/R$styleable;->CompoundButton_button:I +Landroid/R$styleable;->DrawableStates:[I +Landroid/R$styleable;->ImageView:[I Landroid/R$styleable;->ImageView_adjustViewBounds:I Landroid/R$styleable;->ImageView_baselineAlignBottom:I Landroid/R$styleable;->ImageView_cropToPadding:I -Landroid/R$styleable;->ImageView:[I Landroid/R$styleable;->ImageView_maxHeight:I Landroid/R$styleable;->ImageView_maxWidth:I Landroid/R$styleable;->ImageView_scaleType:I Landroid/R$styleable;->ImageView_src:I Landroid/R$styleable;->ImageView_tint:I +Landroid/R$styleable;->LinearLayout:[I Landroid/R$styleable;->LinearLayout_divider:I Landroid/R$styleable;->LinearLayout_dividerPadding:I -Landroid/R$styleable;->LinearLayout:[I Landroid/R$styleable;->LinearLayout_showDividers:I -Landroid/R$styleable;->ListView_dividerHeight:I -Landroid/R$styleable;->ListView_divider:I Landroid/R$styleable;->ListView:[I +Landroid/R$styleable;->ListView_divider:I +Landroid/R$styleable;->ListView_dividerHeight:I Landroid/R$styleable;->ProgressBar:[I Landroid/R$styleable;->ProgressBar_indeterminateDrawable:I Landroid/R$styleable;->ProgressBar_indeterminateDuration:I @@ -1894,13 +2147,14 @@ Landroid/R$styleable;->Switch_thumbTextPadding:I Landroid/R$styleable;->Switch_track:I Landroid/R$styleable;->TextAppearance:[I Landroid/R$styleable;->TextAppearance_textAllCaps:I +Landroid/R$styleable;->TextAppearance_textColor:I Landroid/R$styleable;->TextAppearance_textColorHighlight:I Landroid/R$styleable;->TextAppearance_textColorHint:I -Landroid/R$styleable;->TextAppearance_textColor:I Landroid/R$styleable;->TextAppearance_textColorLink:I Landroid/R$styleable;->TextAppearance_textSize:I Landroid/R$styleable;->TextAppearance_textStyle:I Landroid/R$styleable;->TextAppearance_typeface:I +Landroid/R$styleable;->TextView:[I Landroid/R$styleable;->TextView_autoLink:I Landroid/R$styleable;->TextView_autoText:I Landroid/R$styleable;->TextView_bufferType:I @@ -1922,7 +2176,6 @@ Landroid/R$styleable;->TextView_freezesText:I Landroid/R$styleable;->TextView_gravity:I Landroid/R$styleable;->TextView_height:I Landroid/R$styleable;->TextView_hint:I -Landroid/R$styleable;->TextView:[I Landroid/R$styleable;->TextView_imeActionId:I Landroid/R$styleable;->TextView_imeActionLabel:I Landroid/R$styleable;->TextView_imeOptions:I @@ -1954,14 +2207,14 @@ Landroid/R$styleable;->TextView_shadowDx:I Landroid/R$styleable;->TextView_shadowDy:I Landroid/R$styleable;->TextView_shadowRadius:I Landroid/R$styleable;->TextView_singleLine:I +Landroid/R$styleable;->TextView_text:I Landroid/R$styleable;->TextView_textAllCaps:I Landroid/R$styleable;->TextView_textAppearance:I +Landroid/R$styleable;->TextView_textColor:I Landroid/R$styleable;->TextView_textColorHighlight:I Landroid/R$styleable;->TextView_textColorHint:I -Landroid/R$styleable;->TextView_textColor:I Landroid/R$styleable;->TextView_textColorLink:I Landroid/R$styleable;->TextView_textCursorDrawable:I -Landroid/R$styleable;->TextView_text:I Landroid/R$styleable;->TextView_textIsSelectable:I Landroid/R$styleable;->TextView_textScaleX:I Landroid/R$styleable;->TextView_textSelectHandle:I @@ -1971,10 +2224,13 @@ Landroid/R$styleable;->TextView_textSize:I Landroid/R$styleable;->TextView_textStyle:I Landroid/R$styleable;->TextView_typeface:I Landroid/R$styleable;->TextView_width:I +Landroid/R$styleable;->View:[I +Landroid/R$styleable;->ViewDrawableStates:[I +Landroid/R$styleable;->ViewGroup_Layout:[I +Landroid/R$styleable;->ViewGroup_MarginLayout:[I Landroid/R$styleable;->View_background:I Landroid/R$styleable;->View_clickable:I Landroid/R$styleable;->View_contentDescription:I -Landroid/R$styleable;->ViewDrawableStates:[I Landroid/R$styleable;->View_drawingCacheQuality:I Landroid/R$styleable;->View_duplicateParentState:I Landroid/R$styleable;->View_fadingEdge:I @@ -1982,10 +2238,7 @@ Landroid/R$styleable;->View_filterTouchesWhenObscured:I Landroid/R$styleable;->View_fitsSystemWindows:I Landroid/R$styleable;->View_focusable:I Landroid/R$styleable;->View_focusableInTouchMode:I -Landroid/R$styleable;->ViewGroup_Layout:[I -Landroid/R$styleable;->ViewGroup_MarginLayout:[I Landroid/R$styleable;->View_hapticFeedbackEnabled:I -Landroid/R$styleable;->View:[I Landroid/R$styleable;->View_id:I Landroid/R$styleable;->View_isScrollContainer:I Landroid/R$styleable;->View_keepScreenOn:I @@ -1998,9 +2251,9 @@ Landroid/R$styleable;->View_nextFocusRight:I Landroid/R$styleable;->View_nextFocusUp:I Landroid/R$styleable;->View_onClick:I Landroid/R$styleable;->View_overScrollMode:I +Landroid/R$styleable;->View_padding:I Landroid/R$styleable;->View_paddingBottom:I Landroid/R$styleable;->View_paddingEnd:I -Landroid/R$styleable;->View_padding:I Landroid/R$styleable;->View_paddingLeft:I Landroid/R$styleable;->View_paddingRight:I Landroid/R$styleable;->View_paddingStart:I @@ -2023,26 +2276,36 @@ Landroid/R$styleable;->View_visibility:I Landroid/R$styleable;->Window:[I Landroid/R$styleable;->Window_windowBackground:I Landroid/R$styleable;->Window_windowFrame:I +Landroid/renderscript/RenderScript;->create(Landroid/content/Context;I)Landroid/renderscript/RenderScript; +Landroid/renderscript/RenderScript;->create(Landroid/content/Context;ILandroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript; +Landroid/renderscript/RenderScript;->getMinorID()J +Landroid/renderscript/RenderScriptCacheDir;->mCacheDir:Ljava/io/File; +Landroid/renderscript/RenderScriptCacheDir;->setupDiskCache(Ljava/io/File;)V Landroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreOperationHandle(Ljava/lang/Object;)J -Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore; Landroid/security/keystore/recovery/RecoveryController;->initRecoveryService(Ljava/lang/String;[B)V +Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore; Landroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; -Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnectFailed()V +Landroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/media/IMediaBrowserServiceCallbacks; Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnect(Ljava/lang/String;Landroid/media/session/MediaSession$Token;Landroid/os/Bundle;)V +Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnectFailed()V Landroid/service/media/IMediaBrowserServiceCallbacks;->onLoadChildren(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V Landroid/service/media/IMediaBrowserServiceCallbacks;->onLoadChildrenWithOptions(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;Landroid/os/Bundle;)V -Landroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/media/IMediaBrowserServiceCallbacks; -Landroid/service/media/MediaBrowserService;->KEY_MEDIA_ITEM:Ljava/lang/String; Landroid/service/media/MediaBrowserService$Result;->mFlags:I +Landroid/service/media/MediaBrowserService;->KEY_MEDIA_ITEM:Ljava/lang/String; +Landroid/service/notification/NotificationListenerService;->isBound()Z +Landroid/service/notification/NotificationListenerService;->mHandler:Landroid/os/Handler; Landroid/service/notification/NotificationListenerService;->registerAsSystemService(Landroid/content/Context;Landroid/content/ComponentName;I)V Landroid/service/notification/NotificationListenerService;->unregisterAsSystemService()V +Landroid/service/notification/StatusBarNotification;->getInitialPid()I Landroid/service/notification/StatusBarNotification;->getUid()I +Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService; Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;->getCaptureSession()Ljava/lang/Integer; Landroid/service/voice/VoiceInteractionService;->isKeyphraseAndLocaleSupportedForHotword(Ljava/lang/String;Ljava/util/Locale;)Z Landroid/service/vr/IVrManager;->getVr2dDisplayId()I Landroid/service/wallpaper/WallpaperService$Engine;->setFixedSizeAllowed(Z)V Landroid/speech/tts/TextToSpeech;->getCurrentEngine()Ljava/lang/String; Landroid/system/Int32Ref;->value:I +Landroid/system/OsConstants;-><init>()V Landroid/system/OsConstants;->AF_NETLINK:I Landroid/system/OsConstants;->AF_PACKET:I Landroid/system/OsConstants;->ARPHRD_ETHER:I @@ -2060,10 +2323,8 @@ Landroid/system/OsConstants;->ICMP6_ECHO_REQUEST:I Landroid/system/OsConstants;->ICMP_ECHO:I Landroid/system/OsConstants;->ICMP_ECHOREPLY:I Landroid/system/OsConstants;->initConstants()V -Landroid/system/OsConstants;-><init>()V Landroid/system/OsConstants;->IP_MULTICAST_ALL:I Landroid/system/OsConstants;->IP_RECVTOS:I -Landroid/system/OsConstants;->_LINUX_CAPABILITY_VERSION_3:I Landroid/system/OsConstants;->MAP_POPULATE:I Landroid/system/OsConstants;->NETLINK_NETFILTER:I Landroid/system/OsConstants;->NETLINK_ROUTE:I @@ -2091,12 +2352,13 @@ Landroid/system/OsConstants;->SPLICE_F_MORE:I Landroid/system/OsConstants;->SPLICE_F_MOVE:I Landroid/system/OsConstants;->SPLICE_F_NONBLOCK:I Landroid/system/OsConstants;->TIOCOUTQ:I +Landroid/system/OsConstants;->UDP_ENCAP:I Landroid/system/OsConstants;->UDP_ENCAP_ESPINUDP:I Landroid/system/OsConstants;->UDP_ENCAP_ESPINUDP_NON_IKE:I -Landroid/system/OsConstants;->UDP_ENCAP:I Landroid/system/OsConstants;->UNIX_PATH_MAX:I Landroid/system/OsConstants;->XATTR_CREATE:I Landroid/system/OsConstants;->XATTR_REPLACE:I +Landroid/system/OsConstants;->_LINUX_CAPABILITY_VERSION_3:I Landroid/system/StructTimeval;->fromMillis(J)Landroid/system/StructTimeval; Landroid/telecom/AudioState;->isMuted:Z Landroid/telecom/TelecomManager;->EXTRA_IS_HANDOVER:Ljava/lang/String; @@ -2107,20 +2369,22 @@ Landroid/telephony/CellSignalStrengthLte;->mRsrp:I Landroid/telephony/CellSignalStrengthLte;->mRsrq:I Landroid/telephony/CellSignalStrengthLte;->mRssnr:I Landroid/telephony/CellSignalStrengthLte;->mSignalStrength:I +Landroid/telephony/CellSignalStrengthLte;->mTimingAdvance:I Landroid/telephony/CellSignalStrengthWcdma;->mBitErrorRate:I Landroid/telephony/CellSignalStrengthWcdma;->mSignalStrength:I Landroid/telephony/PhoneNumberUtils;->isLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z Landroid/telephony/PhoneStateListener;->mSubId:Ljava/lang/Integer; Landroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState; +Landroid/telephony/SignalStrength;-><init>()V Landroid/telephony/SignalStrength;->getAsuLevel()I Landroid/telephony/SignalStrength;->getCdmaLevel()I Landroid/telephony/SignalStrength;->getDbm()I +Landroid/telephony/SignalStrength;->getGsmDbm()I Landroid/telephony/SignalStrength;->getLteDbm()I Landroid/telephony/SignalStrength;->getLteRsrp()I Landroid/telephony/SignalStrength;->getLteRsrq()I Landroid/telephony/SignalStrength;->getLteRssnr()I Landroid/telephony/SignalStrength;->getLteSignalStrength()I -Landroid/telephony/SignalStrength;-><init>()V Landroid/telephony/SignalStrength;->mGsmBitErrorRate:I Landroid/telephony/SignalStrength;->mGsmSignalStrength:I Landroid/telephony/SignalStrength;->mLteCqi:I @@ -2149,6 +2413,8 @@ Landroid/telephony/SubscriptionManager;->getSlotIndex(I)I Landroid/telephony/SubscriptionManager;->getSubId(I)[I Landroid/telephony/SubscriptionManager;->setDefaultDataSubId(I)V Landroid/telephony/SubscriptionManager;->setDefaultSmsSubId(I)V +Landroid/telephony/TelephonyManager;-><init>()V +Landroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;)V Landroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager; Landroid/telephony/TelephonyManager;->getCallState(I)I Landroid/telephony/TelephonyManager;->getDataNetworkType(I)I @@ -2159,27 +2425,26 @@ Landroid/telephony/TelephonyManager;->getLine1Number(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getMultiSimConfiguration()Landroid/telephony/TelephonyManager$MultiSimVariants; Landroid/telephony/TelephonyManager;->getNetworkClass(I)I Landroid/telephony/TelephonyManager;->getNetworkCountryIso(I)Ljava/lang/String; -Landroid/telephony/TelephonyManager;->getNetworkOperatorForPhone(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkOperator(I)Ljava/lang/String; +Landroid/telephony/TelephonyManager;->getNetworkOperatorForPhone(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkOperatorName(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkType(I)I Landroid/telephony/TelephonyManager;->getNetworkTypeName(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getPhoneType(I)I Landroid/telephony/TelephonyManager;->getSimCount()I Landroid/telephony/TelephonyManager;->getSimOperator(I)Ljava/lang/String; -Landroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSimOperatorName(I)Ljava/lang/String; -Landroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String; +Landroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSimOperatorNumeric(I)Ljava/lang/String; +Landroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSubIdForPhoneAccount(Landroid/telecom/PhoneAccount;)I Landroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSubscriberInfo()Lcom/android/internal/telephony/IPhoneSubInfo; Landroid/telephony/TelephonyManager;->hasIccCard(I)Z -Landroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;)V -Landroid/telephony/TelephonyManager;-><init>()V Landroid/telephony/TelephonyManager;->isMultiSimEnabled()Z Landroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z +Landroid/telephony/TelephonyManager;->isVideoTelephonyAvailable()Z Landroid/telephony/TelephonyManager;->isVolteAvailable()Z Landroid/telephony/TelephonyManager;->isWifiCallingAvailable()Z Landroid/telephony/TelephonyManager;->mSubscriptionManager:Landroid/telephony/SubscriptionManager; @@ -2200,6 +2465,7 @@ Landroid/text/SpannableStringBuilder;->mSpanEnds:[I Landroid/text/SpannableStringBuilder;->mSpanFlags:[I Landroid/text/SpannableStringBuilder;->mSpans:[Ljava/lang/Object; Landroid/text/SpannableStringBuilder;->mSpanStarts:[I +Landroid/text/SpannableStringInternal;-><init>(Ljava/lang/CharSequence;II)V Landroid/text/SpannableStringInternal;->charAt(I)C Landroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V Landroid/text/SpannableStringInternal;->COLUMNS:I @@ -2213,7 +2479,6 @@ Landroid/text/SpannableStringInternal;->getSpanEnd(Ljava/lang/Object;)I Landroid/text/SpannableStringInternal;->getSpanFlags(Ljava/lang/Object;)I Landroid/text/SpannableStringInternal;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object; Landroid/text/SpannableStringInternal;->getSpanStart(Ljava/lang/Object;)I -Landroid/text/SpannableStringInternal;-><init>(Ljava/lang/CharSequence;II)V Landroid/text/SpannableStringInternal;->isIndexFollowsNextLine(I)Z Landroid/text/SpannableStringInternal;->isOutOfCopyRange(IIII)Z Landroid/text/SpannableStringInternal;->length()I @@ -2231,13 +2496,13 @@ Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;III)V Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V Landroid/text/SpannableStringInternal;->START:I Landroid/text/SpanSet;->spans:[Ljava/lang/Object; -Landroid/text/StaticLayout;->getHeight(Z)I -Landroid/text/StaticLayout;-><init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZLandroid/text/TextUtils$TruncateAt;II)V Landroid/text/StaticLayout$LineBreaks;->ascents:[F Landroid/text/StaticLayout$LineBreaks;->breaks:[I Landroid/text/StaticLayout$LineBreaks;->descents:[F Landroid/text/StaticLayout$LineBreaks;->flags:[I Landroid/text/StaticLayout$LineBreaks;->widths:[F +Landroid/text/StaticLayout;-><init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZLandroid/text/TextUtils$TruncateAt;II)V +Landroid/text/StaticLayout;->getHeight(Z)I Landroid/text/StaticLayout;->mColumns:I Landroid/text/StaticLayout;->mLineCount:I Landroid/text/StaticLayout;->mLines:[I @@ -2261,6 +2526,7 @@ Landroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V Landroid/util/ArrayMap;->mBaseCacheSize:I Landroid/util/ArrayMap;->mTwiceBaseCacheSize:I Landroid/util/ArraySet;-><init>(Ljava/util/Collection;)V +Landroid/util/DisplayMetrics;->DENSITY_DEVICE:I Landroid/util/DisplayMetrics;->noncompatHeightPixels:I Landroid/util/DisplayMetrics;->noncompatWidthPixels:I Landroid/util/EventLog$Event;-><init>([B)V @@ -2276,13 +2542,13 @@ Landroid/util/NtpTrustedTime;->getInstance(Landroid/content/Context;)Landroid/ut Landroid/util/NtpTrustedTime;->hasCache()Z Landroid/util/PathParser;->createPathFromPathData(Ljava/lang/String;)Landroid/graphics/Path; Landroid/util/Pools$SimplePool;->mPool:[Ljava/lang/Object; -Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object; Landroid/util/Pools$SynchronizedPool;-><init>(I)V +Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object; Landroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z Landroid/util/Rational;->mDenominator:I Landroid/util/Rational;->mNumerator:I -Landroid/util/Singleton;->get()Ljava/lang/Object; Landroid/util/Singleton;-><init>()V +Landroid/util/Singleton;->get()Ljava/lang/Object; Landroid/util/Singleton;->mInstance:Ljava/lang/Object; Landroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I Landroid/util/Slog;->w(Ljava/lang/String;Ljava/lang/String;)I @@ -2304,9 +2570,9 @@ Landroid/view/accessibility/AccessibilityNodeInfo;->mSealed:Z Landroid/view/accessibility/AccessibilityNodeInfo;->refresh(Landroid/os/Bundle;Z)Z Landroid/view/accessibility/AccessibilityNodeInfo;->setSealed(Z)V Landroid/view/accessibility/AccessibilityRecord;->getSourceNodeId()J -Landroid/view/accessibility/IAccessibilityManager;->getEnabledAccessibilityServiceList(II)Ljava/util/List; -Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager; Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager; +Landroid/view/accessibility/IAccessibilityManager;->getEnabledAccessibilityServiceList(II)Ljava/util/List; Landroid/view/animation/Animation;->detach()V Landroid/view/animation/Animation;->initializeInvalidateRegion(IIII)V Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener; @@ -2326,9 +2592,12 @@ Landroid/view/ContextThemeWrapper;->mInflater:Landroid/view/LayoutInflater; Landroid/view/ContextThemeWrapper;->mResources:Landroid/content/res/Resources; Landroid/view/ContextThemeWrapper;->mTheme:Landroid/content/res/Resources$Theme; Landroid/view/ContextThemeWrapper;->mThemeResource:I +Landroid/view/Display$HdrCapabilities;-><init>([IFFF)V +Landroid/view/Display;->getDisplayAdjustments()Landroid/view/DisplayAdjustments; +Landroid/view/DisplayAdjustments;->getConfiguration()Landroid/content/res/Configuration; +Landroid/view/DisplayAdjustments;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V Landroid/view/DisplayEventReceiver;->dispatchHotplug(JIZ)V Landroid/view/DisplayEventReceiver;->dispatchVsync(JII)V -Landroid/view/Display$HdrCapabilities;-><init>([IFFF)V Landroid/view/DisplayListCanvas;->callDrawGLFunction2(J)V Landroid/view/DisplayListCanvas;->drawGLFunctor2(JLjava/lang/Runnable;)V Landroid/view/FrameMetrics;->mTimingData:[J @@ -2340,10 +2609,11 @@ Landroid/view/GestureDetector;->mTouchSlopSquare:I Landroid/view/GhostView;->addGhost(Landroid/view/View;Landroid/view/ViewGroup;Landroid/graphics/Matrix;)Landroid/view/GhostView; Landroid/view/GhostView;->removeGhost(Landroid/view/View;)V Landroid/view/IGraphicsStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/view/IGraphicsStats$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IGraphicsStats; Landroid/view/InputChannel;-><init>()V Landroid/view/InputChannel;->mPtr:J -Landroid/view/InputDevice;->addMotionRange(IIFFFFF)V Landroid/view/InputDevice;-><init>(IIILjava/lang/String;IILjava/lang/String;ZIILandroid/view/KeyCharacterMap;ZZZ)V +Landroid/view/InputDevice;->addMotionRange(IIFFFFF)V Landroid/view/InputDevice;->isExternal()Z Landroid/view/InputEvent;->getSequenceNumber()I Landroid/view/InputEventReceiver;->dispatchBatchedInputEventPending()V @@ -2353,6 +2623,7 @@ Landroid/view/inputmethod/InputMethodInfo;->mSubtypes:Landroid/view/inputmethod/ Landroid/view/inputmethod/InputMethodManager;->finishInputLocked()V Landroid/view/inputmethod/InputMethodManager;->focusIn(Landroid/view/View;)V Landroid/view/inputmethod/InputMethodManager;->focusOut(Landroid/view/View;)V +Landroid/view/inputmethod/InputMethodManager;->getClient()Lcom/android/internal/view/IInputMethodClient; Landroid/view/inputmethod/InputMethodManager;->getInputMethodWindowVisibleHeight()I Landroid/view/inputmethod/InputMethodManager;->getInstance()Landroid/view/inputmethod/InputMethodManager; Landroid/view/inputmethod/InputMethodManager;->mCurId:Ljava/lang/String; @@ -2370,17 +2641,17 @@ Landroid/view/inputmethod/InputMethodManager;->windowDismissed(Landroid/os/IBind Landroid/view/inputmethod/InputMethodSubtypeArray;-><init>(Ljava/util/List;)V Landroid/view/InputQueue;->finishInputEvent(JZ)V Landroid/view/IRecentsAnimationController;->setAnimationTargetsBehindSystemBars(Z)V +Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Landroid/view/IWindowManager$Stub$Proxy;->getBaseDisplayDensity(I)I +Landroid/view/IWindowManager$Stub$Proxy;->getDockedStackSide()I +Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I +Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z +Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager; Landroid/view/IWindowManager;->getAnimationScale(I)F Landroid/view/IWindowManager;->hasNavigationBar()Z Landroid/view/IWindowManager;->setAnimationScale(IF)V Landroid/view/IWindowManager;->setShelfHeight(ZI)V Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V -Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager; -Landroid/view/IWindowManager$Stub$Proxy;->getBaseDisplayDensity(I)I -Landroid/view/IWindowManager$Stub$Proxy;->getDockedStackSide()I -Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I -Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z -Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I Landroid/view/KeyCharacterMap$FallbackAction;->keyCode:I Landroid/view/KeyCharacterMap$FallbackAction;->metaState:I @@ -2409,18 +2680,18 @@ Landroid/view/LayoutInflater;->mFactorySet:Z Landroid/view/LayoutInflater;->mPrivateFactory:Landroid/view/LayoutInflater$Factory2; Landroid/view/LayoutInflater;->sConstructorMap:Ljava/util/HashMap; Landroid/view/LayoutInflater;->setPrivateFactory(Landroid/view/LayoutInflater$Factory2;)V +Landroid/view/MotionEvent$PointerCoords;->mPackedAxisBits:J +Landroid/view/MotionEvent$PointerCoords;->mPackedAxisValues:[F Landroid/view/MotionEvent;->getPointerIdBits()I Landroid/view/MotionEvent;->HISTORY_CURRENT:I Landroid/view/MotionEvent;->mNativePtr:J Landroid/view/MotionEvent;->nativeGetRawAxisValue(JIII)F Landroid/view/MotionEvent;->obtain()Landroid/view/MotionEvent; -Landroid/view/MotionEvent$PointerCoords;->mPackedAxisBits:J -Landroid/view/MotionEvent$PointerCoords;->mPackedAxisValues:[F Landroid/view/MotionEvent;->scale(F)V Landroid/view/MotionEvent;->split(I)Landroid/view/MotionEvent; Landroid/view/PointerIcon;->load(Landroid/content/Context;)Landroid/view/PointerIcon; -Landroid/view/PointerIcon;->mBitmapFrames:[Landroid/graphics/Bitmap; Landroid/view/PointerIcon;->mBitmap:Landroid/graphics/Bitmap; +Landroid/view/PointerIcon;->mBitmapFrames:[Landroid/graphics/Bitmap; Landroid/view/PointerIcon;->mDurationPerFrame:I Landroid/view/PointerIcon;->mHotSpotX:F Landroid/view/PointerIcon;->mHotSpotY:F @@ -2437,29 +2708,29 @@ Landroid/view/RemoteAnimationTarget;->prefixOrderIndex:I Landroid/view/RemoteAnimationTarget;->sourceContainerBounds:Landroid/graphics/Rect; Landroid/view/RemoteAnimationTarget;->taskId:I Landroid/view/RemoteAnimationTarget;->windowConfiguration:Landroid/app/WindowConfiguration; -Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V +Landroid/view/RenderNode;->discardDisplayList()V +Landroid/view/RenderNode;->output()V Landroid/view/RenderNodeAnimator;-><init>(IF)V +Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V Landroid/view/RenderNodeAnimator;->mapViewPropertyToRenderProperty(I)I Landroid/view/RenderNodeAnimator;->setTarget(Landroid/view/View;)V -Landroid/view/RenderNode;->discardDisplayList()V -Landroid/view/RenderNode;->output()V Landroid/view/ScaleGestureDetector;->mListener:Landroid/view/ScaleGestureDetector$OnScaleGestureListener; Landroid/view/ScaleGestureDetector;->mMinSpan:I +Landroid/view/Surface;-><init>(J)V +Landroid/view/Surface;->mLock:Ljava/lang/Object; +Landroid/view/Surface;->mNativeObject:J +Landroid/view/Surface;->transferFrom(Landroid/view/Surface;)V +Landroid/view/SurfaceControl$PhysicalDisplayInfo;-><init>()V Landroid/view/SurfaceControl$PhysicalDisplayInfo;->appVsyncOffsetNanos:J Landroid/view/SurfaceControl$PhysicalDisplayInfo;->density:F Landroid/view/SurfaceControl$PhysicalDisplayInfo;->height:I -Landroid/view/SurfaceControl$PhysicalDisplayInfo;-><init>()V Landroid/view/SurfaceControl$PhysicalDisplayInfo;->presentationDeadlineNanos:J Landroid/view/SurfaceControl$PhysicalDisplayInfo;->refreshRate:F Landroid/view/SurfaceControl$PhysicalDisplayInfo;->secure:Z Landroid/view/SurfaceControl$PhysicalDisplayInfo;->width:I Landroid/view/SurfaceControl$PhysicalDisplayInfo;->xDpi:F Landroid/view/SurfaceControl$PhysicalDisplayInfo;->yDpi:F -Landroid/view/Surface;-><init>(J)V -Landroid/view/Surface;->mLock:Ljava/lang/Object; -Landroid/view/Surface;->mNativeObject:J Landroid/view/SurfaceSession;->mNativeClient:J -Landroid/view/Surface;->transferFrom(Landroid/view/Surface;)V Landroid/view/SurfaceView;->isFixedSize()Z Landroid/view/SurfaceView;->mCallbacks:Ljava/util/ArrayList; Landroid/view/SurfaceView;->mFormat:I @@ -2468,14 +2739,14 @@ Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder; Landroid/view/SurfaceView;->setFrame(IIII)Z Landroid/view/SurfaceView;->surfacePositionLost_uiRtSync(J)V Landroid/view/SurfaceView;->updateSurfacePosition_renderWorker(JIIII)V -Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V -Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(II)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V +Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V Landroid/view/textclassifier/TextClassificationManager;->getTextClassifier(I)Landroid/view/textclassifier/TextClassifier; Landroid/view/textclassifier/TextClassifier;->classifyText(Ljava/lang/CharSequence;IILandroid/view/textclassifier/TextClassification$Options;)Landroid/view/textclassifier/TextClassification; Landroid/view/textclassifier/TextClassifier;->generateLinks(Ljava/lang/CharSequence;Landroid/view/textclassifier/TextLinks$Options;)Landroid/view/textclassifier/TextLinks; @@ -2488,28 +2759,28 @@ Landroid/view/TextureView;->mLayer:Landroid/view/TextureLayer; Landroid/view/TextureView;->mNativeWindow:J Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture; Landroid/view/TextureView;->mUpdateListener:Landroid/graphics/SurfaceTexture$OnFrameAvailableListener; +Landroid/view/ThreadedRenderer;->setupDiskCache(Ljava/io/File;)V Landroid/view/TouchDelegate;->mDelegateTargeted:Z Landroid/view/VelocityTracker$Estimator;->confidence:F Landroid/view/VelocityTracker$Estimator;->degree:I Landroid/view/VelocityTracker$Estimator;->xCoeff:[F Landroid/view/VelocityTracker$Estimator;->yCoeff:[F Landroid/view/VelocityTracker;->obtain(Ljava/lang/String;)Landroid/view/VelocityTracker; -Landroid/view/View;->applyDrawableToTransparentRegion(Landroid/graphics/drawable/Drawable;Landroid/graphics/Region;)V Landroid/view/View$AttachInfo;->mContentInsets:Landroid/graphics/Rect; Landroid/view/View$AttachInfo;->mDrawingTime:J Landroid/view/View$AttachInfo;->mStableInsets:Landroid/graphics/Rect; +Landroid/view/View$ListenerInfo;-><init>()V +Landroid/view/View$ListenerInfo;->mOnClickListener:Landroid/view/View$OnClickListener; +Landroid/view/View$ListenerInfo;->mOnDragListener:Landroid/view/View$OnDragListener; +Landroid/view/View$ListenerInfo;->mOnFocusChangeListener:Landroid/view/View$OnFocusChangeListener; +Landroid/view/View$ListenerInfo;->mOnLongClickListener:Landroid/view/View$OnLongClickListener; +Landroid/view/View$ListenerInfo;->mOnTouchListener:Landroid/view/View$OnTouchListener; +Landroid/view/View$ScrollabilityCache;->scrollBar:Landroid/widget/ScrollBarDrawable; +Landroid/view/View;->applyDrawableToTransparentRegion(Landroid/graphics/drawable/Drawable;Landroid/graphics/Region;)V Landroid/view/View;->clearAccessibilityFocus()V Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z Landroid/view/View;->computeOpaqueFlags()V -Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J -Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I -Landroid/view/ViewConfiguration;->getScaledScrollFactor()I -Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z -Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z -Landroid/view/ViewConfiguration;->sHasPermanentMenuKey:Z Landroid/view/View;->createSnapshot(Landroid/view/ViewDebug$CanvasProvider;Z)Landroid/graphics/Bitmap; -Landroid/view/ViewDebug;->dispatchCommand(Landroid/view/View;Ljava/lang/String;Ljava/lang/String;Ljava/io/OutputStream;)V -Landroid/view/ViewDebug;->dump(Landroid/view/View;ZZLjava/io/OutputStream;)V Landroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V Landroid/view/View;->dispatchDetachedFromWindow()V Landroid/view/View;->fitsSystemWindows()Z @@ -2526,40 +2797,14 @@ Landroid/view/View;->getTransitionAlpha()F Landroid/view/View;->getVerticalScrollFactor()F Landroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl; Landroid/view/View;->getWindowDisplayFrame(Landroid/graphics/Rect;)V -Landroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V -Landroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V -Landroid/view/ViewGroup;->FLAG_SUPPORT_STATIC_TRANSFORMATIONS:I -Landroid/view/ViewGroup;->FLAG_USE_CHILD_DRAWING_ORDER:I -Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V -Landroid/view/ViewGroup$MarginLayoutParams;->endMargin:I -Landroid/view/ViewGroup$MarginLayoutParams;->startMargin:I -Landroid/view/ViewGroup;->mChildrenCount:I -Landroid/view/ViewGroup;->mChildren:[Landroid/view/View; -Landroid/view/ViewGroup;->mFirstTouchTarget:Landroid/view/ViewGroup$TouchTarget; -Landroid/view/ViewGroup;->mGroupFlags:I -Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener; -Landroid/view/ViewGroup;->mPersistentDrawingCache:I -Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V -Landroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V -Landroid/view/ViewGroup;->resetResolvedDrawables()V -Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V -Landroid/view/ViewGroup;->resetResolvedPadding()V -Landroid/view/ViewGroup;->resetResolvedTextAlignment()V -Landroid/view/ViewGroup;->resetResolvedTextDirection()V -Landroid/view/ViewGroup;->suppressLayout(Z)V Landroid/view/View;->includeForAccessibility()Z Landroid/view/View;->initializeScrollbars(Landroid/content/res/TypedArray;)V Landroid/view/View;->internalSetPadding(IIII)V +Landroid/view/View;->invalidateParentIfNeeded()V Landroid/view/View;->isPaddingResolved()Z Landroid/view/View;->isRootNamespace()Z -Landroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z Landroid/view/View;->isVisibleToUser()Z -Landroid/view/View$ListenerInfo;-><init>()V -Landroid/view/View$ListenerInfo;->mOnClickListener:Landroid/view/View$OnClickListener; -Landroid/view/View$ListenerInfo;->mOnDragListener:Landroid/view/View$OnDragListener; -Landroid/view/View$ListenerInfo;->mOnFocusChangeListener:Landroid/view/View$OnFocusChangeListener; -Landroid/view/View$ListenerInfo;->mOnLongClickListener:Landroid/view/View$OnLongClickListener; -Landroid/view/View$ListenerInfo;->mOnTouchListener:Landroid/view/View$OnTouchListener; +Landroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z Landroid/view/View;->mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate; Landroid/view/View;->mAttachInfo:Landroid/view/View$AttachInfo; Landroid/view/View;->mBackground:Landroid/graphics/drawable/Drawable; @@ -2603,16 +2848,6 @@ Landroid/view/View;->resetResolvedPadding()V Landroid/view/View;->resetResolvedTextAlignment()V Landroid/view/View;->resetResolvedTextDirection()V Landroid/view/View;->resetRtlProperties()V -Landroid/view/ViewRootImpl;->detachFunctor(J)V -Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;)V -Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;)V -Landroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V -Landroid/view/ViewRootImpl;->getWindowFlags()I -Landroid/view/ViewRootImpl;->invokeFunctor(JZ)V -Landroid/view/ViewRootImpl;->mStopped:Z -Landroid/view/ViewRootImpl;->mSurface:Landroid/view/Surface; -Landroid/view/ViewRootImpl;->mView:Landroid/view/View; -Landroid/view/View$ScrollabilityCache;->scrollBar:Landroid/widget/ScrollBarDrawable; Landroid/view/View;->setAlphaNoInvalidation(F)Z Landroid/view/View;->setAnimationMatrix(Landroid/graphics/Matrix;)V Landroid/view/View;->setAssistBlocked(Z)V @@ -2629,13 +2864,63 @@ Landroid/view/View;->toGlobalMotionEvent(Landroid/view/MotionEvent;)Z Landroid/view/View;->toLocalMotionEvent(Landroid/view/MotionEvent;)Z Landroid/view/View;->transformMatrixToGlobal(Landroid/graphics/Matrix;)V Landroid/view/View;->transformMatrixToLocal(Landroid/graphics/Matrix;)V -Landroid/view/ViewTreeObserver;->addOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V +Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J +Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I +Landroid/view/ViewConfiguration;->getScaledScrollFactor()I +Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z +Landroid/view/ViewConfiguration;->sHasPermanentMenuKey:Z +Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z +Landroid/view/ViewDebug;->dispatchCommand(Landroid/view/View;Ljava/lang/String;Ljava/lang/String;Ljava/io/OutputStream;)V +Landroid/view/ViewDebug;->dump(Landroid/view/View;ZZLjava/io/OutputStream;)V +Landroid/view/ViewGroup$MarginLayoutParams;->endMargin:I +Landroid/view/ViewGroup$MarginLayoutParams;->startMargin:I +Landroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V +Landroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V +Landroid/view/ViewGroup;->FLAG_SUPPORT_STATIC_TRANSFORMATIONS:I +Landroid/view/ViewGroup;->FLAG_USE_CHILD_DRAWING_ORDER:I +Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V +Landroid/view/ViewGroup;->mChildren:[Landroid/view/View; +Landroid/view/ViewGroup;->mChildrenCount:I +Landroid/view/ViewGroup;->mFirstTouchTarget:Landroid/view/ViewGroup$TouchTarget; +Landroid/view/ViewGroup;->mGroupFlags:I +Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener; +Landroid/view/ViewGroup;->mPersistentDrawingCache:I +Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V +Landroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V +Landroid/view/ViewGroup;->resetResolvedDrawables()V +Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V +Landroid/view/ViewGroup;->resetResolvedPadding()V +Landroid/view/ViewGroup;->resetResolvedTextAlignment()V +Landroid/view/ViewGroup;->resetResolvedTextDirection()V +Landroid/view/ViewGroup;->suppressLayout(Z)V +Landroid/view/ViewRootImpl;->detachFunctor(J)V +Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;)V +Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;)V +Landroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V +Landroid/view/ViewRootImpl;->getWindowFlags()I +Landroid/view/ViewRootImpl;->invokeFunctor(JZ)V +Landroid/view/ViewRootImpl;->mStopped:Z +Landroid/view/ViewRootImpl;->mSurface:Landroid/view/Surface; +Landroid/view/ViewRootImpl;->mView:Landroid/view/View; Landroid/view/ViewTreeObserver$InternalInsetsInfo;->setTouchableInsets(I)V -Landroid/view/ViewTreeObserver$InternalInsetsInfo;->TOUCHABLE_INSETS_REGION:I Landroid/view/ViewTreeObserver$InternalInsetsInfo;->touchableRegion:Landroid/graphics/Region; +Landroid/view/ViewTreeObserver$InternalInsetsInfo;->TOUCHABLE_INSETS_REGION:I +Landroid/view/ViewTreeObserver;->addOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V Landroid/view/ViewTreeObserver;->removeOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V +Landroid/view/Window;->mAppName:Ljava/lang/String; +Landroid/view/Window;->mAppToken:Landroid/os/IBinder; +Landroid/view/Window;->mCallback:Landroid/view/Window$Callback; +Landroid/view/Window;->mContext:Landroid/content/Context; +Landroid/view/Window;->mHardwareAccelerated:Z +Landroid/view/Window;->mWindowStyle:Landroid/content/res/TypedArray; +Landroid/view/Window;->setNeedsMenuKey(I)V Landroid/view/WindowAnimationFrameStats;->init(J[J)V Landroid/view/WindowContentFrameStats;->init(J[J[J[J)V +Landroid/view/WindowManager$LayoutParams;->hideTimeoutMilliseconds:J +Landroid/view/WindowManager$LayoutParams;->needsMenuKey:I +Landroid/view/WindowManager$LayoutParams;->NEEDS_MENU_SET_FALSE:I +Landroid/view/WindowManager$LayoutParams;->NEEDS_MENU_SET_TRUE:I +Landroid/view/WindowManager$LayoutParams;->userActivityTimeout:J Landroid/view/WindowManagerGlobal;->getInstance()Landroid/view/WindowManagerGlobal; Landroid/view/WindowManagerGlobal;->getRootView(Ljava/lang/String;)Landroid/view/View; Landroid/view/WindowManagerGlobal;->getViewRootNames()[Ljava/lang/String; @@ -2650,17 +2935,7 @@ Landroid/view/WindowManagerGlobal;->sWindowManagerService:Landroid/view/IWindowM Landroid/view/WindowManagerGlobal;->sWindowSession:Landroid/view/IWindowSession; Landroid/view/WindowManagerGlobal;->trimMemory(I)V Landroid/view/WindowManagerImpl;->mGlobal:Landroid/view/WindowManagerGlobal; -Landroid/view/WindowManager$LayoutParams;->hideTimeoutMilliseconds:J -Landroid/view/WindowManager$LayoutParams;->needsMenuKey:I -Landroid/view/WindowManager$LayoutParams;->NEEDS_MENU_SET_TRUE:I -Landroid/view/WindowManager$LayoutParams;->userActivityTimeout:J -Landroid/view/Window;->mAppName:Ljava/lang/String; -Landroid/view/Window;->mAppToken:Landroid/os/IBinder; -Landroid/view/Window;->mCallback:Landroid/view/Window$Callback; -Landroid/view/Window;->mContext:Landroid/content/Context; -Landroid/view/Window;->mHardwareAccelerated:Z -Landroid/view/Window;->mWindowStyle:Landroid/content/res/TypedArray; -Landroid/webkit/CacheManager;->cacheDisabled()Z +Landroid/webkit/CacheManager$CacheResult;-><init>()V Landroid/webkit/CacheManager$CacheResult;->getContentDisposition()Ljava/lang/String; Landroid/webkit/CacheManager$CacheResult;->getContentLength()J Landroid/webkit/CacheManager$CacheResult;->getEncoding()Ljava/lang/String; @@ -2674,27 +2949,22 @@ Landroid/webkit/CacheManager$CacheResult;->getLocalPath()Ljava/lang/String; Landroid/webkit/CacheManager$CacheResult;->getLocation()Ljava/lang/String; Landroid/webkit/CacheManager$CacheResult;->getMimeType()Ljava/lang/String; Landroid/webkit/CacheManager$CacheResult;->getOutputStream()Ljava/io/OutputStream; -Landroid/webkit/CacheManager$CacheResult;-><init>()V Landroid/webkit/CacheManager$CacheResult;->setEncoding(Ljava/lang/String;)V Landroid/webkit/CacheManager$CacheResult;->setInputStream(Ljava/io/InputStream;)V +Landroid/webkit/CacheManager;->cacheDisabled()Z Landroid/webkit/CacheManager;->endCacheTransaction()Z -Landroid/webkit/CacheManager;->getCacheFileBaseDir()Ljava/io/File; Landroid/webkit/CacheManager;->getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult; +Landroid/webkit/CacheManager;->getCacheFileBaseDir()Ljava/io/File; Landroid/webkit/CacheManager;->saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V Landroid/webkit/CacheManager;->startCacheTransaction()Z Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/webkit/WebResourceResponse;->mImmutable:Z Landroid/webkit/WebSettings$TextSize;->value:I Landroid/webkit/WebSyncManager;->mHandler:Landroid/os/Handler; -Landroid/webkit/WebViewClient;->onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V Landroid/webkit/WebView;->debugDump()V Landroid/webkit/WebView;->disablePlatformNotifications()V Landroid/webkit/WebView;->emulateShiftHeld()V Landroid/webkit/WebView;->enablePlatformNotifications()V -Landroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider; -Landroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context; -Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo; -Landroid/webkit/WebViewFactory;->sProviderInstance:Landroid/webkit/WebViewFactoryProvider; Landroid/webkit/WebView;->getContentWidth()I Landroid/webkit/WebView;->getTouchIconUrl()Ljava/lang/String; Landroid/webkit/WebView;->getVisibleTitleHeight()I @@ -2705,12 +2975,24 @@ Landroid/webkit/WebView;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landr Landroid/webkit/WebView;->restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z Landroid/webkit/WebView;->savePicture(Landroid/os/Bundle;Ljava/io/File;)Z Landroid/webkit/WebView;->sEnforceThreadChecking:Z +Landroid/webkit/WebViewClient;->onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V +Landroid/webkit/WebViewDelegate;-><init>()V +Landroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider; +Landroid/webkit/WebViewFactory;->getUpdateService()Landroid/webkit/IWebViewUpdateService; +Landroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context; +Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo; +Landroid/webkit/WebViewFactory;->sProviderInstance:Landroid/webkit/WebViewFactoryProvider; Landroid/widget/AbsListView$FlingRunnable;->endFling()V Landroid/widget/AbsListView$FlingRunnable;->mScroller:Landroid/widget/OverScroller; Landroid/widget/AbsListView$FlingRunnable;->start(I)V +Landroid/widget/AbsListView$RecycleBin;->clear()V +Landroid/widget/AbsListView$RecycleBin;->mRecyclerListener:Landroid/widget/AbsListView$RecyclerListener; +Landroid/widget/AbsListView$SavedState;->firstId:J +Landroid/widget/AbsListView$SavedState;->viewTop:I Landroid/widget/AbsListView;->invokeOnItemScrollListener()V Landroid/widget/AbsListView;->isVerticalScrollBarHidden()Z Landroid/widget/AbsListView;->mAdapter:Landroid/widget/ListAdapter; +Landroid/widget/AbsListView;->mDataSetObserver:Landroid/widget/AbsListView$AdapterDataSetObserver; Landroid/widget/AbsListView;->mEdgeGlowBottom:Landroid/widget/EdgeEffect; Landroid/widget/AbsListView;->mEdgeGlowTop:Landroid/widget/EdgeEffect; Landroid/widget/AbsListView;->mFastScroll:Landroid/widget/FastScroller; @@ -2729,13 +3011,9 @@ Landroid/widget/AbsListView;->mSelectorRect:Landroid/graphics/Rect; Landroid/widget/AbsListView;->mTouchMode:I Landroid/widget/AbsListView;->mTouchSlop:I Landroid/widget/AbsListView;->mVelocityTracker:Landroid/view/VelocityTracker; -Landroid/widget/AbsListView;->performLongPress(Landroid/view/View;IJFF)Z Landroid/widget/AbsListView;->performLongPress(Landroid/view/View;IJ)Z -Landroid/widget/AbsListView$RecycleBin;->clear()V -Landroid/widget/AbsListView$RecycleBin;->mRecyclerListener:Landroid/widget/AbsListView$RecyclerListener; +Landroid/widget/AbsListView;->performLongPress(Landroid/view/View;IJFF)Z Landroid/widget/AbsListView;->reportScrollStateChange(I)V -Landroid/widget/AbsListView$SavedState;->firstId:J -Landroid/widget/AbsListView$SavedState;->viewTop:I Landroid/widget/AbsListView;->smoothScrollBy(IIZZ)V Landroid/widget/AbsListView;->trackMotionScroll(II)Z Landroid/widget/AbsSeekBar;->mIsDragging:Z @@ -2758,6 +3036,7 @@ Landroid/widget/AutoCompleteTextView;->mPopup:Landroid/widget/ListPopupWindow; Landroid/widget/AutoCompleteTextView;->setDropDownAlwaysVisible(Z)V Landroid/widget/AutoCompleteTextView;->setForceIgnoreOutsideTouch(Z)V Landroid/widget/BaseAdapter;->mDataSetObservable:Landroid/database/DataSetObservable; +Landroid/widget/CompoundButton;->mBroadcasting:Z Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/CompoundButton;->mOnCheckedChangeListener:Landroid/widget/CompoundButton$OnCheckedChangeListener; Landroid/widget/CursorAdapter;->mChangeObserver:Landroid/widget/CursorAdapter$ChangeObserver; @@ -2767,6 +3046,7 @@ Landroid/widget/CursorAdapter;->mRowIDColumn:I Landroid/widget/DatePicker;->mDelegate:Landroid/widget/DatePicker$DatePickerDelegate; Landroid/widget/EdgeEffect;->mPaint:Landroid/graphics/Paint; Landroid/widget/Editor;->invalidateTextDisplayList()V +Landroid/widget/Editor;->mSelectHandleLeft:Landroid/graphics/drawable/Drawable; Landroid/widget/Editor;->mShowCursor:J Landroid/widget/Editor;->mShowSoftInputOnFocus:Z Landroid/widget/ExpandableListView;->mChildDivider:Landroid/graphics/drawable/Drawable; @@ -2779,9 +3059,9 @@ Landroid/widget/FastScroller;->mThumbDrawable:Landroid/graphics/drawable/Drawabl Landroid/widget/FastScroller;->mThumbImage:Landroid/widget/ImageView; Landroid/widget/FastScroller;->mTrackDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/FastScroller;->mTrackImage:Landroid/widget/ImageView; +Landroid/widget/Gallery$FlingRunnable;->startUsingVelocity(I)V Landroid/widget/Gallery;->fillToGalleryLeft()V Landroid/widget/Gallery;->fillToGalleryRight()V -Landroid/widget/Gallery$FlingRunnable;->startUsingVelocity(I)V Landroid/widget/Gallery;->makeAndAddView(IIIZ)Landroid/view/View; Landroid/widget/Gallery;->mDownTouchPosition:I Landroid/widget/Gallery;->mDownTouchView:Landroid/view/View; @@ -2805,6 +3085,7 @@ Landroid/widget/ImageView;->mAlpha:I Landroid/widget/ImageView;->mDrawMatrix:Landroid/graphics/Matrix; Landroid/widget/ImageView;->mMaxHeight:I Landroid/widget/ImageView;->mMaxWidth:I +Landroid/widget/ImageView;->mRecycleableBitmapDrawable:Landroid/graphics/drawable/BitmapDrawable; Landroid/widget/ImageView;->mResource:I Landroid/widget/ImageView;->mUri:Landroid/net/Uri; Landroid/widget/ImageView;->updateDrawable(Landroid/graphics/drawable/Drawable;)V @@ -2818,6 +3099,8 @@ Landroid/widget/ListView;->fillUp(II)Landroid/view/View; Landroid/widget/ListView;->findViewTraversal(I)Landroid/view/View; Landroid/widget/ListView;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View; Landroid/widget/ListView;->mAreAllItemsSelectable:Z +Landroid/widget/ListView;->mFooterViewInfos:Ljava/util/ArrayList; +Landroid/widget/ListView;->mHeaderViewInfos:Ljava/util/ArrayList; Landroid/widget/ListView;->setSelectionInt(I)V Landroid/widget/MediaController;->mAnchor:Landroid/view/View; Landroid/widget/MediaController;->mDecor:Landroid/view/View; @@ -2826,9 +3109,9 @@ Landroid/widget/MediaController;->mWindowManager:Landroid/view/WindowManager; Landroid/widget/NumberPicker;->mInputText:Landroid/widget/EditText; Landroid/widget/NumberPicker;->mSelectionDivider:Landroid/graphics/drawable/Drawable; Landroid/widget/NumberPicker;->mSelectorWheelPaint:Landroid/graphics/Paint; +Landroid/widget/OverScroller$SplineOverScroller;->mCurrVelocity:F Landroid/widget/OverScroller;->isScrollingInDirection(FF)Z Landroid/widget/OverScroller;->mScrollerY:Landroid/widget/OverScroller$SplineOverScroller; -Landroid/widget/OverScroller$SplineOverScroller;->mCurrVelocity:F Landroid/widget/PopupMenu;->mPopup:Lcom/android/internal/view/menu/MenuPopupHelper; Landroid/widget/PopupWindow;->computeAnimationResource()I Landroid/widget/PopupWindow;->createPopupLayoutParams(Landroid/os/IBinder;)Landroid/view/WindowManager$LayoutParams; @@ -2869,20 +3152,23 @@ Landroid/widget/RelativeLayout$LayoutParams;->mTop:I Landroid/widget/RelativeLayout;->mGravity:I Landroid/widget/RemoteViews$Action;->mergeBehavior()I Landroid/widget/RemoteViews$Action;->viewId:I -Landroid/widget/RemoteViewsAdapter;->mCache:Landroid/widget/RemoteViewsAdapter$FixedSizeRemoteViewsCache; -Landroid/widget/RemoteViewsAdapter;->mWorkerThread:Landroid/os/HandlerThread; Landroid/widget/RemoteViews$BitmapCache;->mBitmaps:Ljava/util/ArrayList; Landroid/widget/RemoteViews$BitmapReflectionAction;->bitmap:Landroid/graphics/Bitmap; Landroid/widget/RemoteViews$BitmapReflectionAction;->methodName:Ljava/lang/String; +Landroid/widget/RemoteViews$ReflectionAction;->methodName:Ljava/lang/String; +Landroid/widget/RemoteViews$ReflectionAction;->value:Ljava/lang/Object; +Landroid/widget/RemoteViews$SetOnClickPendingIntent;->pendingIntent:Landroid/app/PendingIntent; +Landroid/widget/RemoteViews$SetPendingIntentTemplate;->pendingIntentTemplate:Landroid/app/PendingIntent; +Landroid/widget/RemoteViews$ViewGroupActionAdd;->mNestedViews:Landroid/widget/RemoteViews; Landroid/widget/RemoteViews;->estimateMemoryUsage()I Landroid/widget/RemoteViews;->mActions:Ljava/util/ArrayList; Landroid/widget/RemoteViews;->mApplication:Landroid/content/pm/ApplicationInfo; Landroid/widget/RemoteViews;->mBitmapCache:Landroid/widget/RemoteViews$BitmapCache; Landroid/widget/RemoteViews;->mergeRemoteViews(Landroid/widget/RemoteViews;)V +Landroid/widget/RemoteViews;->mLayoutId:I Landroid/widget/RemoteViews;->mPortrait:Landroid/widget/RemoteViews; -Landroid/widget/RemoteViews$ReflectionAction;->methodName:Ljava/lang/String; -Landroid/widget/RemoteViews$ReflectionAction;->value:Ljava/lang/Object; -Landroid/widget/RemoteViews$SetOnClickPendingIntent;->pendingIntent:Landroid/app/PendingIntent; +Landroid/widget/RemoteViewsAdapter;->mCache:Landroid/widget/RemoteViewsAdapter$FixedSizeRemoteViewsCache; +Landroid/widget/RemoteViewsAdapter;->mWorkerThread:Landroid/os/HandlerThread; Landroid/widget/ScrollBarDrawable;->mVerticalThumb:Landroid/graphics/drawable/Drawable; Landroid/widget/ScrollBarDrawable;->setHorizontalThumbDrawable(Landroid/graphics/drawable/Drawable;)V Landroid/widget/ScrollBarDrawable;->setVerticalThumbDrawable(Landroid/graphics/drawable/Drawable;)V @@ -2907,9 +3193,9 @@ Landroid/widget/Switch;->mThumbDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/Switch;->mTrackDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/TabHost$IntentContentStrategy;->getContentView()Landroid/view/View; Landroid/widget/TabHost$IntentContentStrategy;->tabClosed()V -Landroid/widget/TabHost;->mTabSpecs:Ljava/util/List; Landroid/widget/TabHost$TabSpec;->mContentStrategy:Landroid/widget/TabHost$ContentStrategy; Landroid/widget/TabHost$TabSpec;->mIndicatorStrategy:Landroid/widget/TabHost$IndicatorStrategy; +Landroid/widget/TabHost;->mTabSpecs:Ljava/util/List; Landroid/widget/TabWidget;->mDrawBottomStrips:Z Landroid/widget/TabWidget;->mSelectedTab:I Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V @@ -2927,17 +3213,19 @@ Landroid/widget/TextView;->mMarquee:Landroid/widget/TextView$Marquee; Landroid/widget/TextView;->mMaximum:I Landroid/widget/TextView;->mMaxMode:I Landroid/widget/TextView;->mSingleLine:Z +Landroid/widget/TextView;->mText:Ljava/lang/CharSequence; Landroid/widget/TextView;->mTextPaint:Landroid/text/TextPaint; Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V +Landroid/widget/Toast$TN;->mNextView:Landroid/view/View; +Landroid/widget/Toast$TN;->mParams:Landroid/view/WindowManager$LayoutParams; +Landroid/widget/Toast$TN;->mView:Landroid/view/View; Landroid/widget/Toast;->getService()Landroid/app/INotificationManager; Landroid/widget/Toast;->getWindowParams()Landroid/view/WindowManager$LayoutParams; Landroid/widget/Toast;->mDuration:I Landroid/widget/Toast;->mTN:Landroid/widget/Toast$TN; Landroid/widget/Toast;->sService:Landroid/app/INotificationManager; -Landroid/widget/Toast$TN;->mNextView:Landroid/view/View; -Landroid/widget/Toast$TN;->mParams:Landroid/view/WindowManager$LayoutParams; -Landroid/widget/VideoView2;->getMediaController()Landroid/media/session/MediaController; Landroid/widget/VideoView2$OnViewTypeChangedListener;->onViewTypeChanged(Landroid/view/View;I)V +Landroid/widget/VideoView2;->getMediaController()Landroid/media/session/MediaController; Landroid/widget/VideoView2;->setOnViewTypeChangedListener(Landroid/widget/VideoView2$OnViewTypeChangedListener;)V Landroid/widget/VideoView2;->setVideoPath(Ljava/lang/String;)V Landroid/widget/VideoView;->mCurrentBufferPercentage:I @@ -3014,56 +3302,44 @@ Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setContactUri(Ljava/lang/ Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setFeatureTag(Ljava/lang/String;)V Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setTimestamp(Ljava/lang/String;)V Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;-><init>()V +Lcom/android/internal/app/AlertController$RecycleListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V Lcom/android/internal/app/AlertController;->mCustomTitleView:Landroid/view/View; Lcom/android/internal/app/AlertController;->mForceInverseBackground:Z Lcom/android/internal/app/AlertController;->mTitle:Ljava/lang/CharSequence; Lcom/android/internal/app/AlertController;->mView:Landroid/view/View; -Lcom/android/internal/app/AlertController$RecycleListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V -Lcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService; -Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I Lcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->setMode(IILjava/lang/String;I)V -Lcom/android/internal/app/IBatteryStats;->getStatistics()[B -Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats; +Lcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService; Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Lcom/android/internal/app/IVoiceInteractionManagerService;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel; -Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService; +Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats; +Lcom/android/internal/app/IBatteryStats;->getStatistics()[B Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->showSessionFromSession(Landroid/os/IBinder;Landroid/os/Bundle;I)Z +Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService; +Lcom/android/internal/app/IVoiceInteractionManagerService;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel; +Lcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/appwidget/IAppWidgetService; +Lcom/android/internal/content/ReferrerIntent;-><init>(Landroid/content/Intent;Ljava/lang/String;)V +Lcom/android/internal/content/ReferrerIntent;->mReferrer:Ljava/lang/String; Lcom/android/internal/location/ILocationProvider$Stub;-><init>()V +Lcom/android/internal/os/BatterySipper;-><init>(Lcom/android/internal/os/BatterySipper$DrainType;Landroid/os/BatteryStats$Uid;D)V Lcom/android/internal/os/BatterySipper;->add(Lcom/android/internal/os/BatterySipper;)V Lcom/android/internal/os/BatterySipper;->drainType:Lcom/android/internal/os/BatterySipper$DrainType; Lcom/android/internal/os/BatterySipper;->getUid()I -Lcom/android/internal/os/BatterySipper;-><init>(Lcom/android/internal/os/BatterySipper$DrainType;Landroid/os/BatteryStats$Uid;D)V Lcom/android/internal/os/BatterySipper;->mPackages:[Ljava/lang/String; Lcom/android/internal/os/BatterySipper;->packageWithHighestDrain:Ljava/lang/String; Lcom/android/internal/os/BatterySipper;->totalPowerMah:D Lcom/android/internal/os/BatterySipper;->uidObj:Landroid/os/BatteryStats$Uid; +Lcom/android/internal/os/BatteryStatsHelper;-><init>(Landroid/content/Context;ZZ)V Lcom/android/internal/os/BatteryStatsHelper;->getMaxPower()D Lcom/android/internal/os/BatteryStatsHelper;->getStats()Landroid/os/BatteryStats; Lcom/android/internal/os/BatteryStatsHelper;->getTotalPower()D -Lcom/android/internal/os/BatteryStatsHelper;-><init>(Landroid/content/Context;ZZ)V Lcom/android/internal/os/BatteryStatsHelper;->load()V Lcom/android/internal/os/BatteryStatsHelper;->mBatteryInfo:Lcom/android/internal/app/IBatteryStats; Lcom/android/internal/os/BatteryStatsHelper;->mPowerProfile:Lcom/android/internal/os/PowerProfile; Lcom/android/internal/os/BatteryStatsHelper;->mUsageList:Ljava/util/List; Lcom/android/internal/os/BatteryStatsHelper;->refreshStats(II)V -Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryRealtime(JI)J -Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryUptime(JI)J -Lcom/android/internal/os/BatteryStatsImpl;->CREATOR:Landroid/os/Parcelable$Creator; -Lcom/android/internal/os/BatteryStatsImpl;->getBatteryRealtime(J)J -Lcom/android/internal/os/BatteryStatsImpl;->getDischargeAmount(I)I -Lcom/android/internal/os/BatteryStatsImpl;->getGlobalWifiRunningTime(JI)J -Lcom/android/internal/os/BatteryStatsImpl;->getScreenOnTime(JI)J -Lcom/android/internal/os/BatteryStatsImpl;->getUidStats()Landroid/util/SparseArray; -Lcom/android/internal/os/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/internal/os/BatteryStatsImpl$Uid; Lcom/android/internal/os/BatteryStatsImpl$Timer;->getCountLocked(I)I Lcom/android/internal/os/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getProcessStats()Landroid/util/ArrayMap; -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getSensorStats()Landroid/util/SparseArray; -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getUid()I -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockStats()Landroid/util/ArrayMap; -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiRunningTime(JI)J -Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiScanTime(JI)J Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getForegroundTime(I)J Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getStarts(I)I Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getSystemTime(I)J @@ -3071,12 +3347,29 @@ Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getUserTime(I)J Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getHandle()I Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getSensorTime()Lcom/android/internal/os/BatteryStatsImpl$Timer; Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Lcom/android/internal/os/BatteryStatsImpl$Timer; +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getProcessStats()Landroid/util/ArrayMap; +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getSensorStats()Landroid/util/SparseArray; +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getUid()I +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockStats()Landroid/util/ArrayMap; +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiRunningTime(JI)J +Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiScanTime(JI)J +Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryRealtime(JI)J +Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryUptime(JI)J +Lcom/android/internal/os/BatteryStatsImpl;->CREATOR:Landroid/os/Parcelable$Creator; +Lcom/android/internal/os/BatteryStatsImpl;->getBatteryRealtime(J)J +Lcom/android/internal/os/BatteryStatsImpl;->getDischargeAmount(I)I +Lcom/android/internal/os/BatteryStatsImpl;->getGlobalWifiRunningTime(JI)J +Lcom/android/internal/os/BatteryStatsImpl;->getScreenOnTime(JI)J +Lcom/android/internal/os/BatteryStatsImpl;->getUidStats()Landroid/util/SparseArray; +Lcom/android/internal/os/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/internal/os/BatteryStatsImpl$Uid; Lcom/android/internal/os/FuseAppLoop;->onCommand(IJJJI[B)V Lcom/android/internal/os/FuseAppLoop;->onOpen(JJ)[B +Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService; +Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;)V Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;)D Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;I)D Lcom/android/internal/os/PowerProfile;->getBatteryCapacity()D -Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;)V +Lcom/android/internal/os/SomeArgs;->arg1:Ljava/lang/Object; Lcom/android/internal/R$array;->config_mobile_hotspot_provision_app:I Lcom/android/internal/R$array;->config_tether_wifi_regexs:I Lcom/android/internal/R$array;->maps_starting_lat_lng:I @@ -3112,8 +3405,8 @@ Lcom/android/internal/R$id;->shortcut:I Lcom/android/internal/R$id;->text:I Lcom/android/internal/R$id;->time:I Lcom/android/internal/R$id;->timePicker:I -Lcom/android/internal/R$id;->title_container:I Lcom/android/internal/R$id;->title:I +Lcom/android/internal/R$id;->title_container:I Lcom/android/internal/R$integer;->config_screenBrightnessDim:I Lcom/android/internal/R$integer;->config_toastDefaultGravity:I Lcom/android/internal/R$layout;->screen_title:I @@ -3123,25 +3416,28 @@ Lcom/android/internal/R$string;->kilobyteShort:I Lcom/android/internal/R$string;->megabyteShort:I Lcom/android/internal/R$string;->petabyteShort:I Lcom/android/internal/R$string;->terabyteShort:I +Lcom/android/internal/R$style;->Theme:I +Lcom/android/internal/R$styleable;->AbsListView:[I Lcom/android/internal/R$styleable;->AbsListView_cacheColorHint:I Lcom/android/internal/R$styleable;->AbsListView_choiceMode:I Lcom/android/internal/R$styleable;->AbsListView_drawSelectorOnTop:I Lcom/android/internal/R$styleable;->AbsListView_fastScrollAlwaysVisible:I Lcom/android/internal/R$styleable;->AbsListView_fastScrollEnabled:I -Lcom/android/internal/R$styleable;->AbsListView:[I Lcom/android/internal/R$styleable;->AbsListView_listSelector:I Lcom/android/internal/R$styleable;->AbsListView_scrollingCache:I Lcom/android/internal/R$styleable;->AbsListView_smoothScrollbar:I Lcom/android/internal/R$styleable;->AbsListView_stackFromBottom:I Lcom/android/internal/R$styleable;->AbsListView_textFilterEnabled:I Lcom/android/internal/R$styleable;->AbsListView_transcriptMode:I +Lcom/android/internal/R$styleable;->AccountAuthenticator:[I Lcom/android/internal/R$styleable;->AccountAuthenticator_accountPreferences:I Lcom/android/internal/R$styleable;->AccountAuthenticator_accountType:I Lcom/android/internal/R$styleable;->AccountAuthenticator_customTokens:I -Lcom/android/internal/R$styleable;->AccountAuthenticator:[I Lcom/android/internal/R$styleable;->AccountAuthenticator_icon:I Lcom/android/internal/R$styleable;->AccountAuthenticator_label:I Lcom/android/internal/R$styleable;->AccountAuthenticator_smallIcon:I +Lcom/android/internal/R$styleable;->AndroidManifest:[I +Lcom/android/internal/R$styleable;->AndroidManifestActivity:[I Lcom/android/internal/R$styleable;->AndroidManifestActivity_allowTaskReparenting:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_configChanges:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_description:I @@ -3149,7 +3445,6 @@ Lcom/android/internal/R$styleable;->AndroidManifestActivity_enabled:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_excludeFromRecents:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_exported:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_hardwareAccelerated:I -Lcom/android/internal/R$styleable;->AndroidManifestActivity:[I Lcom/android/internal/R$styleable;->AndroidManifestActivity_icon:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_immersive:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_label:I @@ -3164,9 +3459,9 @@ Lcom/android/internal/R$styleable;->AndroidManifestActivity_taskAffinity:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_theme:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_uiOptions:I Lcom/android/internal/R$styleable;->AndroidManifestActivity_windowSoftInputMode:I +Lcom/android/internal/R$styleable;->AndroidManifestApplication:[I Lcom/android/internal/R$styleable;->AndroidManifestApplication_enabled:I Lcom/android/internal/R$styleable;->AndroidManifestApplication_hardwareAccelerated:I -Lcom/android/internal/R$styleable;->AndroidManifestApplication:[I Lcom/android/internal/R$styleable;->AndroidManifestApplication_label:I Lcom/android/internal/R$styleable;->AndroidManifestApplication_largeHeap:I Lcom/android/internal/R$styleable;->AndroidManifestApplication_name:I @@ -3176,62 +3471,61 @@ Lcom/android/internal/R$styleable;->AndroidManifestApplication_supportsRtl:I Lcom/android/internal/R$styleable;->AndroidManifestApplication_theme:I Lcom/android/internal/R$styleable;->AndroidManifestApplication_uiOptions:I Lcom/android/internal/R$styleable;->AndroidManifestData:[I -Lcom/android/internal/R$styleable;->AndroidManifest:[I -Lcom/android/internal/R$styleable;->AndroidManifest_installLocation:I Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter:[I Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter_priority:I Lcom/android/internal/R$styleable;->AndroidManifestMetaData:[I Lcom/android/internal/R$styleable;->AndroidManifestMetaData_name:I Lcom/android/internal/R$styleable;->AndroidManifestMetaData_resource:I Lcom/android/internal/R$styleable;->AndroidManifestMetaData_value:I +Lcom/android/internal/R$styleable;->AndroidManifestService:[I Lcom/android/internal/R$styleable;->AndroidManifestService_enabled:I Lcom/android/internal/R$styleable;->AndroidManifestService_exported:I -Lcom/android/internal/R$styleable;->AndroidManifestService:[I Lcom/android/internal/R$styleable;->AndroidManifestService_name:I Lcom/android/internal/R$styleable;->AndroidManifestService_permission:I Lcom/android/internal/R$styleable;->AndroidManifestService_process:I -Lcom/android/internal/R$styleable;->AndroidManifest_sharedUserId:I Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission:[I Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission_name:I Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk:[I Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk_minSdkVersion:I Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk_targetSdkVersion:I +Lcom/android/internal/R$styleable;->AndroidManifest_installLocation:I +Lcom/android/internal/R$styleable;->AndroidManifest_sharedUserId:I Lcom/android/internal/R$styleable;->AndroidManifest_versionCode:I Lcom/android/internal/R$styleable;->AndroidManifest_versionName:I -Lcom/android/internal/R$styleable;->CheckBoxPreference_disableDependentsState:I Lcom/android/internal/R$styleable;->CheckBoxPreference:[I +Lcom/android/internal/R$styleable;->CheckBoxPreference_disableDependentsState:I Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOff:I Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOn:I +Lcom/android/internal/R$styleable;->CompoundButton:[I Lcom/android/internal/R$styleable;->CompoundButton_button:I Lcom/android/internal/R$styleable;->CompoundButton_checked:I -Lcom/android/internal/R$styleable;->CompoundButton:[I -Lcom/android/internal/R$styleable;->DialogPreference_dialogTitle:I Lcom/android/internal/R$styleable;->DialogPreference:[I -Lcom/android/internal/R$styleable;->EdgeEffect_colorEdgeEffect:I +Lcom/android/internal/R$styleable;->DialogPreference_dialogTitle:I Lcom/android/internal/R$styleable;->EdgeEffect:[I +Lcom/android/internal/R$styleable;->EdgeEffect_colorEdgeEffect:I Lcom/android/internal/R$styleable;->GridView:[I Lcom/android/internal/R$styleable;->IconMenuView:[I Lcom/android/internal/R$styleable;->ImageView:[I Lcom/android/internal/R$styleable;->ImageView_scaleType:I Lcom/android/internal/R$styleable;->ImageView_src:I -Lcom/android/internal/R$styleable;->ListPreference_entries:I Lcom/android/internal/R$styleable;->ListPreference:[I -Lcom/android/internal/R$styleable;->ListView_dividerHeight:I +Lcom/android/internal/R$styleable;->ListPreference_entries:I +Lcom/android/internal/R$styleable;->ListView:[I Lcom/android/internal/R$styleable;->ListView_divider:I +Lcom/android/internal/R$styleable;->ListView_dividerHeight:I Lcom/android/internal/R$styleable;->ListView_entries:I Lcom/android/internal/R$styleable;->ListView_footerDividersEnabled:I Lcom/android/internal/R$styleable;->ListView_headerDividersEnabled:I -Lcom/android/internal/R$styleable;->ListView:[I Lcom/android/internal/R$styleable;->ListView_overScrollFooter:I Lcom/android/internal/R$styleable;->ListView_overScrollHeader:I Lcom/android/internal/R$styleable;->PopupWindow:[I +Lcom/android/internal/R$styleable;->Preference:[I +Lcom/android/internal/R$styleable;->PreferenceGroup:[I +Lcom/android/internal/R$styleable;->PreferenceGroup_orderingFromXml:I Lcom/android/internal/R$styleable;->Preference_defaultValue:I Lcom/android/internal/R$styleable;->Preference_dependency:I Lcom/android/internal/R$styleable;->Preference_enabled:I Lcom/android/internal/R$styleable;->Preference_fragment:I -Lcom/android/internal/R$styleable;->PreferenceGroup:[I -Lcom/android/internal/R$styleable;->PreferenceGroup_orderingFromXml:I -Lcom/android/internal/R$styleable;->Preference:[I Lcom/android/internal/R$styleable;->Preference_icon:I Lcom/android/internal/R$styleable;->Preference_key:I Lcom/android/internal/R$styleable;->Preference_layout:I @@ -3242,73 +3536,76 @@ Lcom/android/internal/R$styleable;->Preference_shouldDisableView:I Lcom/android/internal/R$styleable;->Preference_summary:I Lcom/android/internal/R$styleable;->Preference_title:I Lcom/android/internal/R$styleable;->Preference_widgetLayout:I -Lcom/android/internal/R$styleable;->ScrollView_fillViewport:I Lcom/android/internal/R$styleable;->ScrollView:[I +Lcom/android/internal/R$styleable;->ScrollView_fillViewport:I +Lcom/android/internal/R$styleable;->SyncAdapter:[I Lcom/android/internal/R$styleable;->SyncAdapter_accountType:I Lcom/android/internal/R$styleable;->SyncAdapter_allowParallelSyncs:I Lcom/android/internal/R$styleable;->SyncAdapter_contentAuthority:I -Lcom/android/internal/R$styleable;->SyncAdapter:[I Lcom/android/internal/R$styleable;->SyncAdapter_isAlwaysSyncable:I Lcom/android/internal/R$styleable;->SyncAdapter_settingsActivity:I Lcom/android/internal/R$styleable;->SyncAdapter_supportsUploading:I Lcom/android/internal/R$styleable;->SyncAdapter_userVisible:I Lcom/android/internal/R$styleable;->TabWidget:[I Lcom/android/internal/R$styleable;->TextAppearance:[I +Lcom/android/internal/R$styleable;->TextView:[I Lcom/android/internal/R$styleable;->TextViewAppearance:[I Lcom/android/internal/R$styleable;->TextView_drawableBottom:I Lcom/android/internal/R$styleable;->TextView_drawableLeft:I Lcom/android/internal/R$styleable;->TextView_drawableRight:I Lcom/android/internal/R$styleable;->TextView_drawableTop:I -Lcom/android/internal/R$styleable;->TextView:[I Lcom/android/internal/R$styleable;->TextView_maxLines:I -Lcom/android/internal/R$styleable;->TextView_textColorHint:I Lcom/android/internal/R$styleable;->TextView_textColor:I -Lcom/android/internal/R$styleable;->View_background:I +Lcom/android/internal/R$styleable;->TextView_textColorHint:I +Lcom/android/internal/R$styleable;->View:[I Lcom/android/internal/R$styleable;->ViewGroup_Layout:[I Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_height:I Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_width:I -Lcom/android/internal/R$styleable;->View:[I -Lcom/android/internal/R$styleable;->View_id:I Lcom/android/internal/R$styleable;->ViewStub:[I Lcom/android/internal/R$styleable;->ViewStub_inflatedId:I Lcom/android/internal/R$styleable;->ViewStub_layout:I +Lcom/android/internal/R$styleable;->View_background:I +Lcom/android/internal/R$styleable;->View_id:I Lcom/android/internal/R$styleable;->Window:[I Lcom/android/internal/R$styleable;->Window_windowActionBarFullscreenDecorLayout:I Lcom/android/internal/R$styleable;->Window_windowIsFloating:I Lcom/android/internal/R$styleable;->Window_windowIsTranslucent:I Lcom/android/internal/R$styleable;->Window_windowShowWallpaper:I -Lcom/android/internal/R$style;->Theme:I Lcom/android/internal/R$xml;->power_profile:I -Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo; +Lcom/android/internal/telephony/IMms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IMms; Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo; Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms; Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z +Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->mRemote:Landroid/os/IBinder; +Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony; +Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I +Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_endCall:I +Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I Lcom/android/internal/telephony/ITelephony;->answerRingingCall()V Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z Lcom/android/internal/telephony/ITelephony;->endCall()Z +Lcom/android/internal/telephony/ITelephony;->endCallForSubscriber(I)Z Lcom/android/internal/telephony/ITelephony;->getCallState()I Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z -Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V -Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry; Lcom/android/internal/telephony/ITelephony;->setRadio(Z)Z Lcom/android/internal/telephony/ITelephony;->silenceRinger()V -Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony; -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I -Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_endCall:I -Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I -Lcom/android/internal/telephony/SmsHeader;->concatRef:Lcom/android/internal/telephony/SmsHeader$ConcatRef; +Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry; +Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V Lcom/android/internal/telephony/SmsHeader$ConcatRef;->msgCount:I Lcom/android/internal/telephony/SmsHeader$ConcatRef;->refNumber:I Lcom/android/internal/telephony/SmsHeader$ConcatRef;->seqNumber:I +Lcom/android/internal/telephony/SmsHeader;->concatRef:Lcom/android/internal/telephony/SmsHeader$ConcatRef; Lcom/android/internal/telephony/SmsMessageBase;->mUserDataHeader:Lcom/android/internal/telephony/SmsHeader; -Lcom/android/internal/telephony/SmsRawData;->CREATOR:Landroid/os/Parcelable$Creator; Lcom/android/internal/telephony/SmsRawData;-><init>([B)V +Lcom/android/internal/telephony/SmsRawData;->CREATOR:Landroid/os/Parcelable$Creator; Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/util/AsyncChannel;->sendMessage(III)V Lcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;)V @@ -3317,9 +3614,9 @@ Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullPars Lcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/io/OutputStream;)V Lcom/android/internal/view/IInputConnectionWrapper;->mInputConnection:Landroid/view/inputmethod/InputConnection; Lcom/android/internal/view/IInputConnectionWrapper;->mLock:Ljava/lang/Object; -Lcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager; -Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList()Ljava/util/List; Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList()Ljava/util/List; +Lcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager; Lcom/android/internal/view/InputBindResult;->CREATOR:Landroid/os/Parcelable$Creator; Lcom/android/internal/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V Lcom/android/internal/view/menu/MenuBuilder;->mContext:Landroid/content/Context; @@ -3336,8 +3633,8 @@ Lcom/android/okhttp/ConnectionPool;->systemDefault:Lcom/android/okhttp/Connectio Lcom/android/okhttp/HttpUrl;->encodedPath()Ljava/lang/String; Lcom/android/okhttp/HttpUrl;->query()Ljava/lang/String; Lcom/android/okhttp/internal/http/HttpEngine;->httpStream:Lcom/android/okhttp/internal/http/HttpStream; -Lcom/android/okhttp/internal/http/HttpEngine;->networkRequest:Lcom/android/okhttp/Request; Lcom/android/okhttp/internal/http/HttpEngine;->networkRequest(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Request; +Lcom/android/okhttp/internal/http/HttpEngine;->networkRequest:Lcom/android/okhttp/Request; Lcom/android/okhttp/internal/http/HttpEngine;->priorResponse:Lcom/android/okhttp/Response; Lcom/android/okhttp/internal/http/HttpEngine;->userResponse:Lcom/android/okhttp/Response; Lcom/android/okhttp/OkHttpClient;->connectionPool:Lcom/android/okhttp/ConnectionPool; @@ -3399,9 +3696,9 @@ Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;)V Ldalvik/system/BaseDexClassLoader;->addDexPath(Ljava/lang/String;)V Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String; Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList; -Ldalvik/system/BlockGuard;->getThreadPolicy()Ldalvik/system/BlockGuard$Policy; Ldalvik/system/BlockGuard$Policy;->onNetwork()V Ldalvik/system/BlockGuard$Policy;->onReadFromDisk()V +Ldalvik/system/BlockGuard;->getThreadPolicy()Ldalvik/system/BlockGuard$Policy; Ldalvik/system/CloseGuard;->close()V Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V @@ -3414,32 +3711,35 @@ Ldalvik/system/DexFile;->mCookie:Ljava/lang/Object; Ldalvik/system/DexFile;->mFileName:Ljava/lang/String; Ldalvik/system/DexFile;->mInternalCookie:Ljava/lang/Object; Ldalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object; -Ldalvik/system/DexPathList;->addDexPath(Ljava/lang/String;Ljava/io/File;)V -Ldalvik/system/DexPathList;->definingContext:Ljava/lang/ClassLoader; -Ldalvik/system/DexPathList;->dexElements:[Ldalvik/system/DexPathList$Element; -Ldalvik/system/DexPathList$Element;->dexFile:Ldalvik/system/DexFile; Ldalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V Ldalvik/system/DexPathList$Element;-><init>(Ljava/io/File;ZLjava/io/File;Ldalvik/system/DexFile;)V +Ldalvik/system/DexPathList$Element;->dexFile:Ldalvik/system/DexFile; +Ldalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;)V +Ldalvik/system/DexPathList$NativeLibraryElement;->path:Ljava/io/File; Ldalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V +Ldalvik/system/DexPathList;->addDexPath(Ljava/lang/String;Ljava/io/File;)V +Ldalvik/system/DexPathList;->definingContext:Ljava/lang/ClassLoader; +Ldalvik/system/DexPathList;->dexElements:[Ldalvik/system/DexPathList$Element; Ldalvik/system/DexPathList;->loadDexFile(Ljava/io/File;Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ldalvik/system/DexFile; Ldalvik/system/DexPathList;->makeDexElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;Ljava/lang/ClassLoader;)[Ldalvik/system/DexPathList$Element; Ldalvik/system/DexPathList;->makeInMemoryDexElements([Ljava/nio/ByteBuffer;Ljava/util/List;)[Ldalvik/system/DexPathList$Element; Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;)[Ldalvik/system/DexPathList$NativeLibraryElement; Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;)[Ldalvik/system/DexPathList$Element; Ldalvik/system/DexPathList;->nativeLibraryDirectories:Ljava/util/List; -Ldalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;)V -Ldalvik/system/DexPathList$NativeLibraryElement;->path:Ljava/io/File; Ldalvik/system/DexPathList;->nativeLibraryPathElements:[Ldalvik/system/DexPathList$NativeLibraryElement; Ldalvik/system/DexPathList;->splitPaths(Ljava/lang/String;Z)Ljava/util/List; Ldalvik/system/DexPathList;->systemNativeLibraryDirectories:Ljava/util/List; Ldalvik/system/VMDebug;->dumpReferenceTables()V +Ldalvik/system/VMDebug;->isDebuggerConnected()Z Ldalvik/system/VMRuntime;->addressOf(Ljava/lang/Object;)J Ldalvik/system/VMRuntime;->clearGrowthLimit()V +Ldalvik/system/VMRuntime;->gcSoftReferences()V Ldalvik/system/VMRuntime;->getCurrentInstructionSet()Ljava/lang/String; +Ldalvik/system/VMRuntime;->getExternalBytesAllocated()J Ldalvik/system/VMRuntime;->getInstructionSet(Ljava/lang/String;)Ljava/lang/String; Ldalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime; -Ldalvik/system/VMRuntime;->is64BitAbi(Ljava/lang/String;)Z Ldalvik/system/VMRuntime;->is64Bit()Z +Ldalvik/system/VMRuntime;->is64BitAbi(Ljava/lang/String;)Z Ldalvik/system/VMRuntime;->newNonMovableArray(Ljava/lang/Class;I)Ljava/lang/Object; Ldalvik/system/VMRuntime;->registerNativeAllocation(I)V Ldalvik/system/VMRuntime;->registerNativeFree(I)V @@ -3453,20 +3753,20 @@ Ldalvik/system/VMRuntime;->vmInstructionSet()Ljava/lang/String; Ldalvik/system/VMRuntime;->vmLibrary()Ljava/lang/String; Ldalvik/system/VMStack;->getCallingClassLoader()Ljava/lang/ClassLoader; Ldalvik/system/VMStack;->getStackClass2()Ljava/lang/Class; +Ljava/io/File;->filePath:Ljava/nio/file/Path; +Ljava/io/File;->fs:Ljava/io/FileSystem; +Ljava/io/File;->path:Ljava/lang/String; +Ljava/io/File;->prefixLength:I +Ljava/io/File;->status:Ljava/io/File$PathStatus; Ljava/io/FileDescriptor;->descriptor:I Ljava/io/FileDescriptor;->getInt$()I Ljava/io/FileDescriptor;->isSocket$()Z Ljava/io/FileDescriptor;->setInt$(I)V -Ljava/io/File;->filePath:Ljava/nio/file/Path; -Ljava/io/File;->fs:Ljava/io/FileSystem; Ljava/io/FileInputStream;->fd:Ljava/io/FileDescriptor; Ljava/io/FileOutputStream;->fd:Ljava/io/FileDescriptor; -Ljava/io/File;->path:Ljava/lang/String; -Ljava/io/File;->prefixLength:I -Ljava/io/File;->status:Ljava/io/File$PathStatus; Ljava/io/ObjectStreamClass;->getConstructorId(Ljava/lang/Class;)J -Ljava/io/ObjectStreamClass;->newInstance(Ljava/lang/Class;J)Ljava/lang/Object; Ljava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object; +Ljava/io/ObjectStreamClass;->newInstance(Ljava/lang/Class;J)Ljava/lang/Object; Ljava/lang/AbstractStringBuilder;->value:[C Ljava/lang/Boolean;->value:Z Ljava/lang/Byte;->value:B @@ -3483,8 +3783,8 @@ Ljava/lang/Daemons$Daemon;->thread:Ljava/lang/Thread; Ljava/lang/Daemons$FinalizerDaemon;->finalizingObject:Ljava/lang/Object; Ljava/lang/Daemons$FinalizerDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerDaemon; Ljava/lang/Daemons$FinalizerWatchdogDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerWatchdogDaemon; -Ljava/lang/Daemons;->MAX_FINALIZE_NANOS:J Ljava/lang/Daemons$ReferenceQueueDaemon;->INSTANCE:Ljava/lang/Daemons$ReferenceQueueDaemon; +Ljava/lang/Daemons;->MAX_FINALIZE_NANOS:J Ljava/lang/Daemons;->requestHeapTrim()V Ljava/lang/Daemons;->start()V Ljava/lang/Daemons;->stop()V @@ -3498,42 +3798,43 @@ Ljava/lang/ref/FinalizerReference;->head:Ljava/lang/ref/FinalizerReference; Ljava/lang/ref/FinalizerReference;->next:Ljava/lang/ref/FinalizerReference; Ljava/lang/ref/FinalizerReference;->queue:Ljava/lang/ref/ReferenceQueue; Ljava/lang/ref/FinalizerReference;->remove(Ljava/lang/ref/FinalizerReference;)V +Ljava/lang/ref/Reference;->getReferent()Ljava/lang/Object; +Ljava/lang/ref/Reference;->referent:Ljava/lang/Object; +Ljava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V Ljava/lang/reflect/Executable;->artMethod:J +Ljava/lang/reflect/Field;->accessFlags:I Ljava/lang/reflect/Parameter;-><init>(Ljava/lang/String;ILjava/lang/reflect/Executable;I)V Ljava/lang/reflect/Proxy;->invoke(Ljava/lang/reflect/Proxy;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object; -Ljava/lang/ref/Reference;->getReferent()Ljava/lang/Object; -Ljava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V -Ljava/lang/ref/Reference;->referent:Ljava/lang/Object; -Ljava/lang/Runtime;->loadLibrary(Ljava/lang/String;Ljava/lang/ClassLoader;)V Ljava/lang/Runtime;->load(Ljava/lang/String;Ljava/lang/ClassLoader;)V +Ljava/lang/Runtime;->loadLibrary(Ljava/lang/String;Ljava/lang/ClassLoader;)V Ljava/lang/Runtime;->mLibPaths:[Ljava/lang/String; Ljava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String; Ljava/lang/Short;->value:S -Ljava/lang/String;->getCharsNoCheck(II[CI)V Ljava/lang/String;-><init>(II[C)V +Ljava/lang/String;->getCharsNoCheck(II[CI)V +Ljava/lang/System;-><init>()V Ljava/lang/System;->arraycopy([CI[CII)V Ljava/lang/System;->arraycopy([II[III)V -Ljava/lang/System;-><init>()V +Ljava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V Ljava/lang/Thread;->contextClassLoader:Ljava/lang/ClassLoader; Ljava/lang/Thread;->daemon:Z Ljava/lang/Thread;->dispatchUncaughtException(Ljava/lang/Throwable;)V -Ljava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V -Ljava/lang/ThreadGroup;->groups:[Ljava/lang/ThreadGroup; Ljava/lang/Thread;->group:Ljava/lang/ThreadGroup; -Ljava/lang/ThreadGroup;->mainThreadGroup:Ljava/lang/ThreadGroup; -Ljava/lang/ThreadGroup;->name:Ljava/lang/String; -Ljava/lang/ThreadGroup;->ngroups:I -Ljava/lang/ThreadGroup;->parent:Ljava/lang/ThreadGroup; -Ljava/lang/ThreadGroup;->systemThreadGroup:Ljava/lang/ThreadGroup; -Ljava/lang/ThreadGroup;->threadTerminated(Ljava/lang/Thread;)V Ljava/lang/Thread;->inheritableThreadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap; -Ljava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V Ljava/lang/Thread;->lock:Ljava/lang/Object; Ljava/lang/Thread;->name:Ljava/lang/String; Ljava/lang/Thread;->nativePeer:J Ljava/lang/Thread;->parkBlocker:Ljava/lang/Object; Ljava/lang/Thread;->priority:I Ljava/lang/Thread;->threadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap; +Ljava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V +Ljava/lang/ThreadGroup;->groups:[Ljava/lang/ThreadGroup; +Ljava/lang/ThreadGroup;->mainThreadGroup:Ljava/lang/ThreadGroup; +Ljava/lang/ThreadGroup;->name:Ljava/lang/String; +Ljava/lang/ThreadGroup;->ngroups:I +Ljava/lang/ThreadGroup;->parent:Ljava/lang/ThreadGroup; +Ljava/lang/ThreadGroup;->systemThreadGroup:Ljava/lang/ThreadGroup; +Ljava/lang/ThreadGroup;->threadTerminated(Ljava/lang/Thread;)V Ljava/lang/Throwable;->backtrace:Ljava/lang/Object; Ljava/lang/Throwable;->cause:Ljava/lang/Throwable; Ljava/lang/Throwable;->detailMessage:Ljava/lang/String; @@ -3560,19 +3861,19 @@ Ljava/net/HttpCookie;->value:Ljava/lang/String; Ljava/net/HttpCookie;->version:I Ljava/net/HttpCookie;->whenCreated:J Ljava/net/Inet4Address;-><init>()V -Ljava/net/Inet6Address;->holder6:Ljava/net/Inet6Address$Inet6AddressHolder; Ljava/net/Inet6Address$Inet6AddressHolder;->ipaddress:[B Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id:I Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id_set:Z Ljava/net/Inet6Address$Inet6AddressHolder;->scope_ifname:Ljava/net/NetworkInterface; Ljava/net/Inet6Address;-><init>()V -Ljava/net/InetAddress;->clearDnsCache()V -Ljava/net/InetAddress;->holder:Ljava/net/InetAddress$InetAddressHolder; -Ljava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder; +Ljava/net/Inet6Address;->holder6:Ljava/net/Inet6Address$Inet6AddressHolder; Ljava/net/InetAddress$InetAddressHolder;->address:I Ljava/net/InetAddress$InetAddressHolder;->family:I Ljava/net/InetAddress$InetAddressHolder;->hostName:Ljava/lang/String; Ljava/net/InetAddress$InetAddressHolder;->originalHostName:Ljava/lang/String; +Ljava/net/InetAddress;->clearDnsCache()V +Ljava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder; +Ljava/net/InetAddress;->holder:Ljava/net/InetAddress$InetAddressHolder; Ljava/net/InetAddress;->isNumeric(Ljava/lang/String;)Z Ljava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress; Ljava/net/Socket;->getFileDescriptor$()Ljava/io/FileDescriptor; @@ -3587,9 +3888,9 @@ Ljava/net/URL;->handler:Ljava/net/URLStreamHandler; Ljava/net/URL;->handlers:Ljava/util/Hashtable; Ljava/nio/Buffer;->address:J Ljava/nio/Buffer;->capacity:I -Ljava/nio/Buffer;->_elementSizeShift:I Ljava/nio/Buffer;->limit:I Ljava/nio/Buffer;->position:I +Ljava/nio/Buffer;->_elementSizeShift:I Ljava/nio/ByteBuffer;->hb:[B Ljava/nio/ByteBuffer;->isReadOnly:Z Ljava/nio/ByteBuffer;->offset:I @@ -3606,11 +3907,11 @@ Ljava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffse Ljava/util/ArrayDeque;->elements:[Ljava/lang/Object; Ljava/util/ArrayDeque;->head:I Ljava/util/ArrayDeque;->tail:I -Ljava/util/ArrayList;->elementData:[Ljava/lang/Object; -Ljava/util/ArrayList;->size:I Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList; Ljava/util/ArrayList$SubList;->parentOffset:I Ljava/util/ArrayList$SubList;->size:I +Ljava/util/ArrayList;->elementData:[Ljava/lang/Object; +Ljava/util/ArrayList;->size:I Ljava/util/Arrays$ArrayList;->a:[Ljava/lang/Object; Ljava/util/Calendar;->zone:Ljava/util/TimeZone; Ljava/util/Collections$EmptyList;-><init>()V @@ -3640,8 +3941,8 @@ Ljava/util/HashMap;->modCount:I Ljava/util/HashMap;->table:[Ljava/util/HashMap$Node; Ljava/util/HashSet;->map:Ljava/util/HashMap; Ljava/util/jar/JarFile;->manifest:Ljava/util/jar/Manifest; -Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry; Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z +Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry; Ljava/util/LinkedList;->size:I Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale; Ljava/util/PriorityQueue;->modCount:I @@ -3652,8 +3953,8 @@ Ljava/util/UUID;->leastSigBits:J Ljava/util/UUID;->mostSigBits:J Ljava/util/Vector;->elementData(I)Ljava/lang/Object; Ljava/util/zip/Deflater;->buf:[B -Ljava/util/zip/Deflater;->finished:Z Ljava/util/zip/Deflater;->finish:Z +Ljava/util/zip/Deflater;->finished:Z Ljava/util/zip/Deflater;->len:I Ljava/util/zip/Deflater;->level:I Ljava/util/zip/Deflater;->off:I @@ -3670,8 +3971,8 @@ Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ss Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory; Llibcore/util/BasicLruCache;->map:Ljava/util/LinkedHashMap; Llibcore/util/ZoneInfo;->mTransitions:[J -Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>()V +Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V Lorg/ccil/cowan/tagsoup/AttributesImpl;->data:[Ljava/lang/String; Lorg/ccil/cowan/tagsoup/AttributesImpl;->length:I Lorg/json/JSONArray;->values:Ljava/util/List; diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt index 76bf51013867..4f878ac52b42 100644 --- a/config/hiddenapi-vendor-list.txt +++ b/config/hiddenapi-vendor-list.txt @@ -1,24 +1,24 @@ Landroid/accounts/AccountManager;-><init>(Landroid/content/Context;Landroid/accounts/IAccountManager;Landroid/os/Handler;)V Landroid/app/Activity;->managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; -Landroid/app/ActivityManagerNative;->broadcastStickyIntent(Landroid/content/Intent;Ljava/lang/String;I)V +Landroid/app/Activity;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V Landroid/app/ActivityManager$RecentTaskInfo;->configuration:Landroid/content/res/Configuration; Landroid/app/ActivityManager$TaskDescription;->loadTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap; Landroid/app/ActivityManager$TaskSnapshot;->getSnapshot()Landroid/graphics/GraphicBuffer; +Landroid/app/ActivityManagerNative;->broadcastStickyIntent(Landroid/content/Intent;Ljava/lang/String;I)V Landroid/app/ActivityOptions;->makeRemoteAnimation(Landroid/view/RemoteAnimationAdapter;)Landroid/app/ActivityOptions; Landroid/app/ActivityOptions;->setSplitScreenCreateMode(I)V -Landroid/app/Activity;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V Landroid/app/ActivityView;-><init>(Landroid/content/Context;)V Landroid/app/ActivityView;->release()V Landroid/app/ActivityView;->startActivity(Landroid/app/PendingIntent;)V Landroid/app/ActivityView;->startActivity(Landroid/content/Intent;)V -Landroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List; -Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder; Landroid/app/AppOpsManager$OpEntry;->getOp()I Landroid/app/AppOpsManager$OpEntry;->getTime()J Landroid/app/AppOpsManager$OpEntry;->isRunning()Z Landroid/app/AppOpsManager$PackageOps;->getOps()Ljava/util/List; Landroid/app/AppOpsManager$PackageOps;->getPackageName()Ljava/lang/String; Landroid/app/AppOpsManager$PackageOps;->getUid()I +Landroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List; +Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder; Landroid/app/IActivityController$Stub;-><init>()V Landroid/app/IActivityManager;->cancelRecentsAnimation(Z)V Landroid/app/IActivityManager;->cancelTaskWindowTransition(I)V @@ -32,15 +32,14 @@ Landroid/app/IActivityManager;->getRunningAppProcesses()Ljava/util/List; Landroid/app/IActivityManager;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot; Landroid/app/IActivityManager;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V Landroid/app/IActivityManager;->removeTask(I)Z +Landroid/app/IActivityManager;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I Landroid/app/IActivityManager;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I Landroid/app/IActivityManager;->startActivityFromRecents(ILandroid/os/Bundle;)I -Landroid/app/IActivityManager;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I Landroid/app/IActivityManager;->startRecentsActivity(Landroid/content/Intent;Landroid/app/IAssistDataReceiver;Landroid/view/IRecentsAnimationRunner;)V Landroid/app/IAlarmManager;->setTime(J)Z -Landroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager; +Landroid/app/IAssistDataReceiver$Stub;-><init>()V Landroid/app/IAssistDataReceiver;->onHandleAssistData(Landroid/os/Bundle;)V Landroid/app/IAssistDataReceiver;->onHandleAssistScreenshot(Landroid/graphics/Bitmap;)V -Landroid/app/IAssistDataReceiver$Stub;-><init>()V Landroid/app/KeyguardManager;->isDeviceLocked(I)Z Landroid/app/NotificationManager;->cancelAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)V Landroid/app/StatusBarManager;->removeIcon(Ljava/lang/String;)V @@ -73,13 +72,13 @@ Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceMacAddress(Landroid/os/ Landroid/companion/BluetoothLeDeviceFilter;->getScanFilter()Landroid/bluetooth/le/ScanFilter; Landroid/companion/DeviceFilter;->getDeviceDisplayName(Landroid/os/Parcelable;)Ljava/lang/String; Landroid/companion/DeviceFilter;->matches(Landroid/os/Parcelable;)Z +Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V -Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V Landroid/companion/IFindDeviceCallback;->onSuccess(Landroid/app/PendingIntent;)V +Landroid/content/ContentProvider;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V Landroid/content/ContentProvider;->attachInfoForTesting(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V Landroid/content/ContentProvider;->getIContentProvider()Landroid/content/IContentProvider; -Landroid/content/ContentProvider;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V Landroid/content/ContentValues;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList; Landroid/content/ContentValues;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V @@ -91,10 +90,9 @@ Landroid/content/ContextWrapper;->getThemeResId()I Landroid/content/Intent;->getExtra(Ljava/lang/String;)Ljava/lang/Object; Landroid/content/Intent;->getIBinderExtra(Ljava/lang/String;)Landroid/os/IBinder; Landroid/content/Intent;->resolveSystemService(Landroid/content/pm/PackageManager;I)Landroid/content/ComponentName; -Landroid/content/pm/IPackageDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V Landroid/content/pm/IPackageDataObserver$Stub;-><init>()V -Landroid/content/pm/IPackageDeleteObserver;->packageDeleted(Ljava/lang/String;I)V Landroid/content/pm/IPackageDeleteObserver$Stub;-><init>()V +Landroid/content/pm/IPackageDeleteObserver;->packageDeleted(Ljava/lang/String;I)V Landroid/content/pm/IPackageManager;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo; Landroid/content/pm/IPackageManager;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo; Landroid/content/pm/IPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName; @@ -105,8 +103,8 @@ Landroid/database/sqlite/SqliteWrapper;->query(Landroid/content/Context;Landroid Landroid/graphics/AvoidXfermode;-><init>(IILandroid/graphics/AvoidXfermode$Mode;)V Landroid/graphics/Bitmap;->createGraphicBufferHandle()Landroid/graphics/GraphicBuffer; Landroid/graphics/Bitmap;->createHardwareBitmap(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap; -Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;)Z +Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z Landroid/graphics/drawable/Drawable;->isProjected()Z Landroid/graphics/drawable/Drawable;->updateTintFilter(Landroid/graphics/PorterDuffColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V @@ -119,8 +117,8 @@ Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDI Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V Landroid/location/ILocationManager;->getNetworkProviderPackage()Ljava/lang/String; Landroid/location/ILocationManager;->reportLocation(Landroid/location/Location;Z)V -Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z Landroid/location/INetInitiatedListener$Stub;-><init>()V +Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z Landroid/location/Location;->setExtraLocation(Ljava/lang/String;Landroid/location/Location;)V Landroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V Landroid/media/AudioManager;->unregisterAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V @@ -146,32 +144,31 @@ Landroid/media/tv/ITvRemoteServiceInput;->sendPointerDown(Landroid/os/IBinder;II Landroid/media/tv/ITvRemoteServiceInput;->sendPointerSync(Landroid/os/IBinder;)V Landroid/media/tv/ITvRemoteServiceInput;->sendPointerUp(Landroid/os/IBinder;I)V Landroid/media/tv/ITvRemoteServiceInput;->sendTimestamp(Landroid/os/IBinder;J)V -Landroid/net/ConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo; +Landroid/net/ConnectivityManager$PacketKeepalive;->stop()V Landroid/net/ConnectivityManager$PacketKeepaliveCallback;-><init>()V Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onError(I)V Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStarted()V Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStopped()V -Landroid/net/ConnectivityManager$PacketKeepalive;->stop()V +Landroid/net/ConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo; Landroid/net/ConnectivityManager;->setAirplaneMode(Z)V Landroid/net/ConnectivityManager;->startNattKeepalive(Landroid/net/Network;ILandroid/net/ConnectivityManager$PacketKeepaliveCallback;Ljava/net/InetAddress;ILjava/net/InetAddress;)Landroid/net/ConnectivityManager$PacketKeepalive; Landroid/net/ConnectivityManager;->startUsingNetworkFeature(ILjava/lang/String;)I Landroid/net/ConnectivityManager;->stopUsingNetworkFeature(ILjava/lang/String;)I Landroid/net/ConnectivityManager;->tether(Ljava/lang/String;)I Landroid/net/ConnectivityManager;->untether(Ljava/lang/String;)I +Landroid/net/DhcpResults;-><init>()V Landroid/net/DhcpResults;-><init>(Landroid/net/DhcpResults;)V Landroid/net/DhcpResults;-><init>(Landroid/net/StaticIpConfiguration;)V -Landroid/net/DhcpResults;-><init>()V Landroid/net/DhcpResults;->leaseDuration:I Landroid/net/DhcpResults;->mtu:I Landroid/net/DhcpResults;->serverAddress:Ljava/net/Inet4Address; Landroid/net/DhcpResults;->vendorInfo:Ljava/lang/String; Landroid/net/IConnectivityManager;->getAllNetworkState()[Landroid/net/NetworkState; -Landroid/net/INetd;->interfaceAddAddress(Ljava/lang/String;Ljava/lang/String;I)V Landroid/net/INetd$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetd; +Landroid/net/INetd;->interfaceAddAddress(Ljava/lang/String;Ljava/lang/String;I)V Landroid/net/INetworkPolicyManager;->getNetworkQuotaInfo(Landroid/net/NetworkState;)Landroid/net/NetworkQuotaInfo; -Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager; -Landroid/net/INetworkStatsService;->openSession()Landroid/net/INetworkStatsSession; Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService; +Landroid/net/INetworkStatsService;->openSession()Landroid/net/INetworkStatsSession; Landroid/net/INetworkStatsSession;->getHistoryForNetwork(Landroid/net/NetworkTemplate;I)Landroid/net/NetworkStatsHistory; Landroid/net/INetworkStatsSession;->getHistoryForUid(Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory; Landroid/net/InterfaceConfiguration;-><init>()V @@ -180,6 +177,13 @@ Landroid/net/LinkAddress;-><init>(Ljava/lang/String;)V Landroid/net/LinkAddress;-><init>(Ljava/net/InetAddress;I)V Landroid/net/LinkAddress;->isIPv6()Z Landroid/net/LinkAddress;->isSameAddressAs(Landroid/net/LinkAddress;)Z +Landroid/net/LinkProperties$ProvisioningChange;->GAINED_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange; +Landroid/net/LinkProperties$ProvisioningChange;->LOST_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange; +Landroid/net/LinkProperties$ProvisioningChange;->STILL_NOT_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange; +Landroid/net/LinkProperties$ProvisioningChange;->STILL_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange; +Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange; +Landroid/net/LinkProperties;-><init>()V +Landroid/net/LinkProperties;-><init>(Landroid/net/LinkProperties;)V Landroid/net/LinkProperties;->addDnsServer(Ljava/net/InetAddress;)Z Landroid/net/LinkProperties;->addRoute(Landroid/net/RouteInfo;)Z Landroid/net/LinkProperties;->addStackedLink(Landroid/net/LinkProperties;)Z @@ -195,8 +199,6 @@ Landroid/net/LinkProperties;->hasIPv4DefaultRoute()Z Landroid/net/LinkProperties;->hasIPv4DnsServer()Z Landroid/net/LinkProperties;->hasIPv6DefaultRoute()Z Landroid/net/LinkProperties;->hasIPv6DnsServer()Z -Landroid/net/LinkProperties;-><init>(Landroid/net/LinkProperties;)V -Landroid/net/LinkProperties;-><init>()V Landroid/net/LinkProperties;->isIdenticalAddresses(Landroid/net/LinkProperties;)Z Landroid/net/LinkProperties;->isIdenticalDnses(Landroid/net/LinkProperties;)Z Landroid/net/LinkProperties;->isIdenticalRoutes(Landroid/net/LinkProperties;)Z @@ -204,11 +206,6 @@ Landroid/net/LinkProperties;->isIdenticalStackedLinks(Landroid/net/LinkPropertie Landroid/net/LinkProperties;->isIPv6Provisioned()Z Landroid/net/LinkProperties;->isProvisioned()Z Landroid/net/LinkProperties;->isReachable(Ljava/net/InetAddress;)Z -Landroid/net/LinkProperties$ProvisioningChange;->GAINED_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange; -Landroid/net/LinkProperties$ProvisioningChange;->LOST_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange; -Landroid/net/LinkProperties$ProvisioningChange;->STILL_NOT_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange; -Landroid/net/LinkProperties$ProvisioningChange;->STILL_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange; -Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange; Landroid/net/LinkProperties;->removeDnsServer(Ljava/net/InetAddress;)Z Landroid/net/LinkProperties;->removeRoute(Landroid/net/RouteInfo;)Z Landroid/net/LinkProperties;->setDnsServers(Ljava/util/Collection;)V @@ -218,26 +215,27 @@ Landroid/net/LinkProperties;->setLinkAddresses(Ljava/util/Collection;)V Landroid/net/LinkProperties;->setMtu(I)V Landroid/net/LinkProperties;->setTcpBufferSizes(Ljava/lang/String;)V Landroid/net/MacAddress;->ALL_ZEROS_ADDRESS:Landroid/net/MacAddress; +Landroid/net/metrics/ApfProgramEvent;-><init>()V Landroid/net/metrics/ApfProgramEvent;->actualLifetime:J Landroid/net/metrics/ApfProgramEvent;->currentRas:I Landroid/net/metrics/ApfProgramEvent;->filteredRas:I -Landroid/net/metrics/ApfProgramEvent;->flagsFor(ZZ)I Landroid/net/metrics/ApfProgramEvent;->flags:I -Landroid/net/metrics/ApfProgramEvent;-><init>()V +Landroid/net/metrics/ApfProgramEvent;->flagsFor(ZZ)I Landroid/net/metrics/ApfProgramEvent;->lifetime:J Landroid/net/metrics/ApfProgramEvent;->programLength:I +Landroid/net/metrics/ApfStats;-><init>()V Landroid/net/metrics/ApfStats;->droppedRas:I Landroid/net/metrics/ApfStats;->durationMs:J -Landroid/net/metrics/ApfStats;-><init>()V Landroid/net/metrics/ApfStats;->matchingRas:I Landroid/net/metrics/ApfStats;->maxProgramSize:I Landroid/net/metrics/ApfStats;->parseErrors:I +Landroid/net/metrics/ApfStats;->programUpdates:I Landroid/net/metrics/ApfStats;->programUpdatesAll:I Landroid/net/metrics/ApfStats;->programUpdatesAllowingMulticast:I -Landroid/net/metrics/ApfStats;->programUpdates:I Landroid/net/metrics/ApfStats;->receivedRas:I Landroid/net/metrics/ApfStats;->zeroLifetimeRas:I Landroid/net/metrics/DhcpClientEvent;-><init>(Ljava/lang/String;I)V +Landroid/net/metrics/DhcpErrorEvent;-><init>(I)V Landroid/net/metrics/DhcpErrorEvent;->BOOTP_TOO_SHORT:I Landroid/net/metrics/DhcpErrorEvent;->BUFFER_UNDERFLOW:I Landroid/net/metrics/DhcpErrorEvent;->DHCP_BAD_MAGIC_COOKIE:I @@ -246,7 +244,6 @@ Landroid/net/metrics/DhcpErrorEvent;->DHCP_NO_COOKIE:I Landroid/net/metrics/DhcpErrorEvent;->DHCP_NO_MSG_TYPE:I Landroid/net/metrics/DhcpErrorEvent;->DHCP_UNKNOWN_MSG_TYPE:I Landroid/net/metrics/DhcpErrorEvent;->errorCodeWithOption(II)I -Landroid/net/metrics/DhcpErrorEvent;-><init>(I)V Landroid/net/metrics/DhcpErrorEvent;->L2_TOO_SHORT:I Landroid/net/metrics/DhcpErrorEvent;->L2_WRONG_ETH_TYPE:I Landroid/net/metrics/DhcpErrorEvent;->L3_INVALID_IP:I @@ -262,29 +259,28 @@ Landroid/net/metrics/IpConnectivityLog;->log(Ljava/lang/String;Landroid/os/Parce Landroid/net/metrics/IpManagerEvent;-><init>(IJ)V Landroid/net/metrics/IpReachabilityEvent;-><init>(I)V Landroid/net/metrics/IpReachabilityEvent;->nudFailureEventType(ZZ)I -Landroid/net/metrics/RaEvent$Builder;->build()Landroid/net/metrics/RaEvent; Landroid/net/metrics/RaEvent$Builder;-><init>()V +Landroid/net/metrics/RaEvent$Builder;->build()Landroid/net/metrics/RaEvent; Landroid/net/metrics/RaEvent$Builder;->updateDnsslLifetime(J)Landroid/net/metrics/RaEvent$Builder; Landroid/net/metrics/RaEvent$Builder;->updatePrefixPreferredLifetime(J)Landroid/net/metrics/RaEvent$Builder; Landroid/net/metrics/RaEvent$Builder;->updatePrefixValidLifetime(J)Landroid/net/metrics/RaEvent$Builder; Landroid/net/metrics/RaEvent$Builder;->updateRdnssLifetime(J)Landroid/net/metrics/RaEvent$Builder; Landroid/net/metrics/RaEvent$Builder;->updateRouteInfoLifetime(J)Landroid/net/metrics/RaEvent$Builder; Landroid/net/metrics/RaEvent$Builder;->updateRouterLifetime(J)Landroid/net/metrics/RaEvent$Builder; +Landroid/net/Network;-><init>(I)V +Landroid/net/Network;->netId:I Landroid/net/NetworkCapabilities;->getNetworkSpecifier()Landroid/net/NetworkSpecifier; Landroid/net/NetworkCapabilities;->getSignalStrength()I Landroid/net/NetworkCapabilities;->hasSignalStrength()Z Landroid/net/NetworkCapabilities;->transportNamesOf([I)Ljava/lang/String; -Landroid/net/Network;-><init>(I)V -Landroid/net/Network;->netId:I Landroid/net/NetworkQuotaInfo;->getEstimatedBytes()J Landroid/net/NetworkQuotaInfo;->getHardLimitBytes()J Landroid/net/NetworkQuotaInfo;->getSoftLimitBytes()J Landroid/net/NetworkRequest$Builder;->setSignalStrength(I)Landroid/net/NetworkRequest$Builder; Landroid/net/NetworkRequest;->networkCapabilities:Landroid/net/NetworkCapabilities; Landroid/net/NetworkState;->network:Landroid/net/Network; -Landroid/net/NetworkStats;->combineValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats; -Landroid/net/NetworkStats$Entry;->iface:Ljava/lang/String; Landroid/net/NetworkStats$Entry;-><init>()V +Landroid/net/NetworkStats$Entry;->iface:Ljava/lang/String; Landroid/net/NetworkStats$Entry;->rxBytes:J Landroid/net/NetworkStats$Entry;->rxPackets:J Landroid/net/NetworkStats$Entry;->set:I @@ -292,10 +288,11 @@ Landroid/net/NetworkStats$Entry;->tag:I Landroid/net/NetworkStats$Entry;->txBytes:J Landroid/net/NetworkStats$Entry;->txPackets:J Landroid/net/NetworkStats$Entry;->uid:I +Landroid/net/NetworkStats;-><init>(JI)V +Landroid/net/NetworkStats;->combineValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats; Landroid/net/NetworkStatsHistory$Entry;->txBytes:J Landroid/net/NetworkStatsHistory;->getStart()J Landroid/net/NetworkStatsHistory;->getValues(JJLandroid/net/NetworkStatsHistory$Entry;)Landroid/net/NetworkStatsHistory$Entry; -Landroid/net/NetworkStats;-><init>(JI)V Landroid/net/NetworkTemplate;->buildTemplateMobileAll(Ljava/lang/String;)Landroid/net/NetworkTemplate; Landroid/net/NetworkUtils;->attachControlPacketFilter(Ljava/io/FileDescriptor;I)V Landroid/net/NetworkUtils;->attachDhcpFilter(Ljava/io/FileDescriptor;)V @@ -303,8 +300,8 @@ Landroid/net/NetworkUtils;->attachRaFilter(Ljava/io/FileDescriptor;I)V Landroid/net/NetworkUtils;->getImplicitNetmask(Ljava/net/Inet4Address;)I Landroid/net/NetworkUtils;->netmaskToPrefixLength(Ljava/net/Inet4Address;)I Landroid/net/NetworkUtils;->protectFromVpn(Ljava/io/FileDescriptor;)Z -Landroid/net/RouteInfo;->hasGateway()Z Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;)V +Landroid/net/RouteInfo;->hasGateway()Z Landroid/net/RouteInfo;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo; Landroid/net/SntpClient;->getNtpTime()J Landroid/net/SntpClient;->getNtpTimeReference()J @@ -318,29 +315,30 @@ Landroid/net/TrafficStats;->getMobileTcpRxPackets()J Landroid/net/TrafficStats;->getMobileTcpTxPackets()J Landroid/net/wifi/WifiInfo;->is5GHz()Z Landroid/net/wifi/WifiInfo;->score:I +Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V Landroid/os/AsyncResult;->exception:Ljava/lang/Throwable; Landroid/os/AsyncResult;->forMessage(Landroid/os/Message;Ljava/lang/Object;Ljava/lang/Throwable;)Landroid/os/AsyncResult; -Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V Landroid/os/AsyncResult;->result:Ljava/lang/Object; Landroid/os/AsyncResult;->userObj:Ljava/lang/Object; -Landroid/os/BatteryStats;->getNextHistoryLocked(Landroid/os/BatteryStats$HistoryItem;)Z +Landroid/os/BatteryStats$HistoryItem;-><init>()V Landroid/os/BatteryStats$HistoryItem;->batteryLevel:B Landroid/os/BatteryStats$HistoryItem;->cmd:B -Landroid/os/BatteryStats$HistoryItem;-><init>()V Landroid/os/BatteryStats$HistoryItem;->states:I Landroid/os/BatteryStats$HistoryItem;->time:J Landroid/os/BatteryStats$Timer;->getCountLocked(I)I -Landroid/os/BatteryStats$Uid;->getWifiRunningTime(JI)J -Landroid/os/BatteryStats$Uid;-><init>()V Landroid/os/BatteryStats$Uid$Wakelock;->getWakeTime(I)Landroid/os/BatteryStats$Timer; +Landroid/os/BatteryStats$Uid;-><init>()V +Landroid/os/BatteryStats$Uid;->getWifiRunningTime(JI)J +Landroid/os/BatteryStats;->getNextHistoryLocked(Landroid/os/BatteryStats$HistoryItem;)Z +Landroid/os/Broadcaster;-><init>()V Landroid/os/Broadcaster;->broadcast(Landroid/os/Message;)V Landroid/os/Broadcaster;->cancelRequest(ILandroid/os/Handler;I)V -Landroid/os/Broadcaster;-><init>()V Landroid/os/Broadcaster;->request(ILandroid/os/Handler;I)V Landroid/os/Environment;->getLegacyExternalStorageDirectory()Ljava/io/File; -Landroid/os/Handler;->getMain()Landroid/os/Handler; Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V +Landroid/os/Handler;->getMain()Landroid/os/Handler; Landroid/os/HwBinder;->reportSyspropChanged()V +Landroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService; Landroid/os/INetworkManagementService;->clearInterfaceAddresses(Ljava/lang/String;)V Landroid/os/INetworkManagementService;->disableIpv6(Ljava/lang/String;)V Landroid/os/INetworkManagementService;->enableIpv6(Ljava/lang/String;)V @@ -349,7 +347,6 @@ Landroid/os/INetworkManagementService;->registerObserver(Landroid/net/INetworkMa Landroid/os/INetworkManagementService;->setInterfaceConfig(Ljava/lang/String;Landroid/net/InterfaceConfiguration;)V Landroid/os/INetworkManagementService;->setInterfaceIpv6PrivacyExtensions(Ljava/lang/String;Z)V Landroid/os/INetworkManagementService;->setIPv6AddrGenMode(Ljava/lang/String;I)V -Landroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService; Landroid/os/INetworkManagementService;->unregisterObserver(Landroid/net/INetworkManagementEventObserver;)V Landroid/os/IPowerManager;->goToSleep(JII)V Landroid/os/IPowerManager;->reboot(ZLjava/lang/String;Z)V @@ -360,17 +357,17 @@ Landroid/os/Parcel;->readStringArray()[Ljava/lang/String; Landroid/os/Parcel;->writeBlob([B)V Landroid/os/PowerManager;->goToSleep(J)V Landroid/os/PowerManager;->isScreenBrightnessBoosted()Z -Landroid/os/Registrant;->clear()V Landroid/os/Registrant;-><init>(Landroid/os/Handler;ILjava/lang/Object;)V +Landroid/os/Registrant;->clear()V +Landroid/os/Registrant;->notifyRegistrant()V +Landroid/os/Registrant;->notifyRegistrant(Landroid/os/AsyncResult;)V +Landroid/os/RegistrantList;-><init>()V Landroid/os/RegistrantList;->add(Landroid/os/Registrant;)V Landroid/os/RegistrantList;->addUnique(Landroid/os/Handler;ILjava/lang/Object;)V -Landroid/os/RegistrantList;-><init>()V -Landroid/os/RegistrantList;->notifyRegistrants(Landroid/os/AsyncResult;)V Landroid/os/RegistrantList;->notifyRegistrants()V -Landroid/os/RegistrantList;->removeCleared()V +Landroid/os/RegistrantList;->notifyRegistrants(Landroid/os/AsyncResult;)V Landroid/os/RegistrantList;->remove(Landroid/os/Handler;)V -Landroid/os/Registrant;->notifyRegistrant(Landroid/os/AsyncResult;)V -Landroid/os/Registrant;->notifyRegistrant()V +Landroid/os/RegistrantList;->removeCleared()V Landroid/os/RemoteException;->rethrowFromSystemServer()Ljava/lang/RuntimeException; Landroid/os/ServiceSpecificException;->errorCode:I Landroid/os/storage/DiskInfo;->getId()Ljava/lang/String; @@ -430,8 +427,8 @@ Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V Landroid/telephony/ims/compat/ImsService;-><init>()V Landroid/telephony/ims/compat/ImsService;->mImsServiceController:Landroid/os/IBinder; Landroid/telephony/ims/compat/stub/ImsCallSessionImplBase;-><init>()V -Landroid/telephony/ims/compat/stub/ImsConfigImplBase;->getIImsConfig()Lcom/android/ims/internal/IImsConfig; Landroid/telephony/ims/compat/stub/ImsConfigImplBase;-><init>(Landroid/content/Context;)V +Landroid/telephony/ims/compat/stub/ImsConfigImplBase;->getIImsConfig()Lcom/android/ims/internal/IImsConfig; Landroid/telephony/ims/compat/stub/ImsUtListenerImplBase;-><init>()V Landroid/telephony/ims/ImsCallForwardInfo;-><init>()V Landroid/telephony/ims/ImsCallForwardInfo;->mCondition:I @@ -459,21 +456,21 @@ Landroid/telephony/ims/ImsStreamMediaProfile;->mVideoDirection:I Landroid/telephony/ims/ImsVideoCallProvider;->getInterface()Lcom/android/ims/internal/IImsVideoCallProvider; Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V +Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService; Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri; Landroid/telephony/mbms/vendor/IMbmsStreamingService;->initialize(Landroid/telephony/mbms/IMbmsStreamingSessionCallback;I)I Landroid/telephony/mbms/vendor/IMbmsStreamingService;->requestUpdateStreamingServices(ILjava/util/List;)I Landroid/telephony/mbms/vendor/IMbmsStreamingService;->startStreaming(ILjava/lang/String;Landroid/telephony/mbms/IStreamingServiceCallback;)I -Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService; Landroid/telephony/PhoneNumberUtils;->formatNumber(Ljava/lang/String;I)Ljava/lang/String; Landroid/telephony/PhoneNumberUtils;->isEmergencyNumber(ILjava/lang/String;)Z Landroid/telephony/PhoneNumberUtils;->isPotentialEmergencyNumber(ILjava/lang/String;)Z Landroid/telephony/PhoneNumberUtils;->isPotentialLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z -Landroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;Landroid/os/Looper;)V Landroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;)V +Landroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;Landroid/os/Looper;)V Landroid/telephony/PreciseCallState;->getBackgroundCallState()I Landroid/telephony/PreciseCallState;->getForegroundCallState()I -Landroid/telephony/RadioAccessFamily;->getRafFromNetworkType(I)I Landroid/telephony/RadioAccessFamily;-><init>(II)V +Landroid/telephony/RadioAccessFamily;->getRafFromNetworkType(I)I Landroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I @@ -499,10 +496,12 @@ Landroid/telephony/SubscriptionManager;->isUsableSubIdValue(I)Z Landroid/telephony/SubscriptionManager;->isValidPhoneId(I)Z Landroid/telephony/SubscriptionManager;->isValidSlotIndex(I)Z Landroid/telephony/SubscriptionManager;->isValidSubscriptionId(I)Z -Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;II)V Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;I)V +Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;II)V Landroid/telephony/SubscriptionManager;->setDisplayName(Ljava/lang/String;IJ)I Landroid/telephony/SubscriptionManager;->setIconTint(II)I +Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants; +Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants; Landroid/telephony/TelephonyManager;->getIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;I)I Landroid/telephony/TelephonyManager;->getIsimDomain()Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkTypeName()Ljava/lang/String; @@ -511,8 +510,6 @@ Landroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/te Landroid/telephony/TelephonyManager;->getVoiceMessageCount()I Landroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I Landroid/telephony/TelephonyManager;->isImsRegistered()Z -Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants; -Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants; Landroid/telephony/TelephonyManager;->nvResetConfig(I)Z Landroid/telephony/TelephonyManager;->putIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;II)Z Landroid/telephony/TelephonyManager;->setPreferredNetworkType(II)Z @@ -525,13 +522,13 @@ Landroid/util/FloatMath;->sin(F)F Landroid/util/FloatMath;->sqrt(F)F Landroid/util/IconDrawableFactory;->getBadgedIcon(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/ApplicationInfo;I)Landroid/graphics/drawable/Drawable; Landroid/util/IconDrawableFactory;->newInstance(Landroid/content/Context;)Landroid/util/IconDrawableFactory; +Landroid/util/LocalLog$ReadOnlyLocalLog;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V Landroid/util/LocalLog;-><init>(I)V Landroid/util/LocalLog;->log(Ljava/lang/String;)V -Landroid/util/LocalLog$ReadOnlyLocalLog;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V Landroid/util/LocalLog;->readOnlyLocalLog()Landroid/util/LocalLog$ReadOnlyLocalLog; +Landroid/util/LongArray;-><init>()V Landroid/util/LongArray;->add(IJ)V Landroid/util/LongArray;->get(I)J -Landroid/util/LongArray;-><init>()V Landroid/util/LongArray;->size()I Landroid/util/RecurrenceRule;->buildRecurringMonthly(ILjava/time/ZoneId;)Landroid/util/RecurrenceRule; Landroid/util/RecurrenceRule;->start:Ljava/time/ZonedDateTime; @@ -548,14 +545,14 @@ Landroid/view/InputEventReceiver;->onInputEvent(Landroid/view/InputEvent;I)V Landroid/view/IRecentsAnimationController;->finish(Z)V Landroid/view/IRecentsAnimationController;->screenshotTask(I)Landroid/app/ActivityManager$TaskSnapshot; Landroid/view/IRecentsAnimationController;->setInputConsumerEnabled(Z)V +Landroid/view/IRecentsAnimationRunner$Stub;-><init>()V Landroid/view/IRecentsAnimationRunner;->onAnimationCanceled()V Landroid/view/IRecentsAnimationRunner;->onAnimationStart(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;)V Landroid/view/IRecentsAnimationRunner;->onAnimationStart_New(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;Landroid/graphics/Rect;Landroid/graphics/Rect;)V -Landroid/view/IRecentsAnimationRunner$Stub;-><init>()V Landroid/view/IRemoteAnimationFinishedCallback;->onAnimationFinished()V +Landroid/view/IRemoteAnimationRunner$Stub;-><init>()V Landroid/view/IRemoteAnimationRunner;->onAnimationCancelled()V Landroid/view/IRemoteAnimationRunner;->onAnimationStart([Landroid/view/RemoteAnimationTarget;Landroid/view/IRemoteAnimationFinishedCallback;)V -Landroid/view/IRemoteAnimationRunner$Stub;-><init>()V Landroid/view/IWindowManager;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;)V Landroid/view/IWindowManager;->destroyInputConsumer(Ljava/lang/String;)Z Landroid/view/IWindowManager;->endProlongedAnimations()V @@ -564,19 +561,20 @@ Landroid/view/IWindowManager;->overridePendingAppTransitionMultiThumbFuture(Land Landroid/view/IWindowManager;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;)V Landroid/view/IWindowManager;->setNavBarVirtualKeyHapticFeedbackEnabled(Z)V Landroid/view/RemoteAnimationAdapter;-><init>(Landroid/view/IRemoteAnimationRunner;JJ)V -Landroid/view/RemoteAnimationDefinition;->addRemoteAnimation(ILandroid/view/RemoteAnimationAdapter;)V Landroid/view/RemoteAnimationDefinition;-><init>()V +Landroid/view/RemoteAnimationDefinition;->addRemoteAnimation(ILandroid/view/RemoteAnimationAdapter;)V Landroid/view/RenderNode;->create(Ljava/lang/String;Landroid/view/View;)Landroid/view/RenderNode; Landroid/view/RenderNode;->end(Landroid/view/DisplayListCanvas;)V Landroid/view/RenderNode;->isValid()Z Landroid/view/RenderNode;->setClipToBounds(Z)Z Landroid/view/RenderNode;->setLeftTopRightBottom(IIII)Z Landroid/view/RenderNode;->start(II)Landroid/view/DisplayListCanvas; +Landroid/view/Surface;->getNextFrameNumber()J +Landroid/view/SurfaceControl$Transaction;-><init>()V Landroid/view/SurfaceControl$Transaction;->apply()V Landroid/view/SurfaceControl$Transaction;->deferTransactionUntil(Landroid/view/SurfaceControl;Landroid/os/IBinder;J)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->deferTransactionUntilSurface(Landroid/view/SurfaceControl;Landroid/view/Surface;J)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->hide(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction; -Landroid/view/SurfaceControl$Transaction;-><init>()V Landroid/view/SurfaceControl$Transaction;->setAlpha(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->setColor(Landroid/view/SurfaceControl;[F)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->setFinalCrop(Landroid/view/SurfaceControl;Landroid/graphics/Rect;)Landroid/view/SurfaceControl$Transaction; @@ -587,7 +585,6 @@ Landroid/view/SurfaceControl$Transaction;->setPosition(Landroid/view/SurfaceCont Landroid/view/SurfaceControl$Transaction;->setSize(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->setWindowCrop(Landroid/view/SurfaceControl;Landroid/graphics/Rect;)Landroid/view/SurfaceControl$Transaction; Landroid/view/SurfaceControl$Transaction;->show(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction; -Landroid/view/Surface;->getNextFrameNumber()J Landroid/view/ThreadedRenderer;->createHardwareBitmap(Landroid/view/RenderNode;II)Landroid/graphics/Bitmap; Landroid/view/View;->hideTooltip()V Landroid/view/View;->setTooltip(Ljava/lang/CharSequence;)V @@ -601,8 +598,8 @@ Landroid/webkit/WebView;->refreshPlugins(Z)V Landroid/widget/ListView;->lookForSelectablePosition(IZ)I Lcom/android/ims/ImsConfigListener;->onSetFeatureResponse(IIII)V Lcom/android/ims/internal/IImsCallSessionListener;->callSessionConferenceStateUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsConferenceState;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandoverFailed(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandover(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V +Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandoverFailed(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHeld(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V @@ -658,8 +655,8 @@ Lcom/android/ims/internal/uce/common/CapInfo;->isSpSupported()Z Lcom/android/ims/internal/uce/common/CapInfo;->isVsDuringCSSupported()Z Lcom/android/ims/internal/uce/common/CapInfo;->isVsSupported()Z Lcom/android/ims/internal/uce/common/StatusCode;->getStatusCode()I -Lcom/android/ims/internal/uce/common/UceLong;->getClientId()I Lcom/android/ims/internal/uce/common/UceLong;-><init>()V +Lcom/android/ims/internal/uce/common/UceLong;->getClientId()I Lcom/android/ims/internal/uce/common/UceLong;->setClientId(I)V Lcom/android/ims/internal/uce/options/IOptionsListener;->cmdStatus(Lcom/android/ims/internal/uce/options/OptionsCmdStatus;)V Lcom/android/ims/internal/uce/options/IOptionsListener;->getVersionCb(Ljava/lang/String;)V @@ -667,6 +664,7 @@ Lcom/android/ims/internal/uce/options/IOptionsListener;->incomingOptions(Ljava/l Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceUnavailable(Lcom/android/ims/internal/uce/common/StatusCode;)V Lcom/android/ims/internal/uce/options/IOptionsListener;->sipResponseReceived(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsSipResponse;Lcom/android/ims/internal/uce/options/OptionsCapInfo;)V +Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V Lcom/android/ims/internal/uce/options/IOptionsService;->addListener(ILcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/options/IOptionsService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/options/IOptionsService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; @@ -675,10 +673,9 @@ Lcom/android/ims/internal/uce/options/IOptionsService;->getVersion(I)Lcom/androi Lcom/android/ims/internal/uce/options/IOptionsService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/options/IOptionsService;->responseIncomingOptions(IIILjava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;Z)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/options/IOptionsService;->setMyInfo(ILcom/android/ims/internal/uce/common/CapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V +Lcom/android/ims/internal/uce/options/OptionsCapInfo;-><init>()V Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo; Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getSdp()Ljava/lang/String; -Lcom/android/ims/internal/uce/options/OptionsCapInfo;-><init>()V Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setCapInfo(Lcom/android/ims/internal/uce/common/CapInfo;)V Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setSdp(Ljava/lang/String;)V Lcom/android/ims/internal/uce/options/OptionsCmdId;-><init>()V @@ -703,6 +700,7 @@ Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceAvailable(Lcom Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceUnAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V Lcom/android/ims/internal/uce/presence/IPresenceListener;->sipResponseReceived(Lcom/android/ims/internal/uce/presence/PresSipResponse;)V Lcom/android/ims/internal/uce/presence/IPresenceListener;->unpublishMessageSent()V +Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V Lcom/android/ims/internal/uce/presence/IPresenceService;->addListener(ILcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; @@ -711,7 +709,6 @@ Lcom/android/ims/internal/uce/presence/IPresenceService;->publishMyCap(ILcom/and Lcom/android/ims/internal/uce/presence/IPresenceService;->reenableService(II)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/presence/IPresenceService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/presence/IPresenceService;->setNewFeatureTag(ILjava/lang/String;Lcom/android/ims/internal/uce/presence/PresServiceInfo;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V Lcom/android/ims/internal/uce/presence/PresCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo; Lcom/android/ims/internal/uce/presence/PresCapInfo;->getContactUri()Ljava/lang/String; Lcom/android/ims/internal/uce/presence/PresCapInfo;->mContactUri:Ljava/lang/String; @@ -725,6 +722,7 @@ Lcom/android/ims/internal/uce/presence/PresSipResponse;->getRequestId()I Lcom/android/ims/internal/uce/presence/PresSipResponse;->getRetryAfter()I Lcom/android/ims/internal/uce/presence/PresSipResponse;->getSipResponseCode()I Lcom/android/ims/internal/uce/uceservice/IUceListener;->setStatus(I)V +Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V Lcom/android/ims/internal/uce/uceservice/IUceService;->createOptionsService(Lcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)I Lcom/android/ims/internal/uce/uceservice/IUceService;->createPresenceService(Lcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)I Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyOptionsService(I)V @@ -735,7 +733,6 @@ Lcom/android/ims/internal/uce/uceservice/IUceService;->getServiceStatus()Z Lcom/android/ims/internal/uce/uceservice/IUceService;->isServiceStarted()Z Lcom/android/ims/internal/uce/uceservice/IUceService;->startService(Lcom/android/ims/internal/uce/uceservice/IUceListener;)Z Lcom/android/ims/internal/uce/uceservice/IUceService;->stopService()Z -Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V Lcom/android/internal/app/AlertController$AlertParams;->mIconId:I Lcom/android/internal/app/AlertController$AlertParams;->mMessage:Ljava/lang/CharSequence; Lcom/android/internal/app/AlertController$AlertParams;->mNegativeButtonListener:Landroid/content/DialogInterface$OnClickListener; @@ -749,6 +746,7 @@ Lcom/android/internal/app/IAppOpsService;->finishOperation(Landroid/os/IBinder;I Lcom/android/internal/content/PackageMonitor;-><init>()V Lcom/android/internal/content/PackageMonitor;->register(Landroid/content/Context;Landroid/os/Looper;Landroid/os/UserHandle;Z)V Lcom/android/internal/content/PackageMonitor;->unregister()V +Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider; Lcom/android/internal/location/ILocationProvider;->disable()V Lcom/android/internal/location/ILocationProvider;->enable()V Lcom/android/internal/location/ILocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties; @@ -756,7 +754,6 @@ Lcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle; Lcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V -Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider; Lcom/android/internal/location/ProviderRequest;-><init>()V Lcom/android/internal/location/ProviderRequest;->interval:J Lcom/android/internal/location/ProviderRequest;->locationRequests:Ljava/util/List; @@ -768,7 +765,6 @@ Lcom/android/internal/os/BatteryStatsImpl;->getPhoneSignalScanningTime(JI)J Lcom/android/internal/os/BatteryStatsImpl;->getPhoneSignalStrengthTime(IJI)J Lcom/android/internal/os/BatteryStatsImpl;->getScreenBrightnessTime(IJI)J Lcom/android/internal/os/BatteryStatsImpl;->getWifiOnTime(JI)J -Lcom/android/internal/os/SomeArgs;->arg1:Ljava/lang/Object; Lcom/android/internal/os/SomeArgs;->arg2:Ljava/lang/Object; Lcom/android/internal/os/SomeArgs;->arg3:Ljava/lang/Object; Lcom/android/internal/os/SomeArgs;->obtain()Lcom/android/internal/os/SomeArgs; @@ -778,20 +774,20 @@ Lcom/android/internal/R$styleable;->TwoLineListItem:[I Lcom/android/internal/telephony/GsmAlphabet;->gsm7BitPackedToString([BII)Ljava/lang/String; Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm7BitPacked(Ljava/lang/String;)[B Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z +Lcom/android/internal/telephony/OperatorInfo$State;->CURRENT:Lcom/android/internal/telephony/OperatorInfo$State; +Lcom/android/internal/telephony/OperatorInfo$State;->FORBIDDEN:Lcom/android/internal/telephony/OperatorInfo$State; +Lcom/android/internal/telephony/OperatorInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V Lcom/android/internal/telephony/OperatorInfo;->CREATOR:Landroid/os/Parcelable$Creator; Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaLong()Ljava/lang/String; Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaShort()Ljava/lang/String; Lcom/android/internal/telephony/OperatorInfo;->getOperatorNumeric()Ljava/lang/String; Lcom/android/internal/telephony/OperatorInfo;->getState()Lcom/android/internal/telephony/OperatorInfo$State; -Lcom/android/internal/telephony/OperatorInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -Lcom/android/internal/telephony/OperatorInfo$State;->CURRENT:Lcom/android/internal/telephony/OperatorInfo$State; -Lcom/android/internal/telephony/OperatorInfo$State;->FORBIDDEN:Lcom/android/internal/telephony/OperatorInfo$State; -Lcom/android/internal/util/AsyncChannel;->connect(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Messenger;)V Lcom/android/internal/util/AsyncChannel;-><init>()V +Lcom/android/internal/util/AsyncChannel;->connect(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Messenger;)V Lcom/android/internal/util/AsyncChannel;->sendMessage(Landroid/os/Message;)V +Lcom/android/internal/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;)V Lcom/android/internal/util/IndentingPrintWriter;->decreaseIndent()Lcom/android/internal/util/IndentingPrintWriter; Lcom/android/internal/util/IndentingPrintWriter;->increaseIndent()Lcom/android/internal/util/IndentingPrintWriter; -Lcom/android/internal/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;)V Lcom/android/internal/util/XmlUtils;->beginDocument(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V Ljava/lang/System;->arraycopy([BI[BII)V diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index 452225cd7da0..ed684d7a5901 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -302,7 +302,16 @@ public class AccessibilityServiceInfo implements Parcelable { /** * This flag requests that all fingerprint gestures be sent to the accessibility service. - * It is handled in {@link FingerprintGestureController} + * <p> + * Services that want to set this flag have to declare the capability + * to retrieve window content in their meta-data by setting the attribute + * {@link android.R.attr#canRequestFingerprintGestures} to + * true, otherwise this flag will be ignored. For how to declare the meta-data + * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}. + * </p> + * + * @see android.R.styleable#AccessibilityService_canRequestFingerprintGestures + * @see AccessibilityService#getFingerprintGestureController() */ public static final int FLAG_REQUEST_FINGERPRINT_GESTURES = 0x00000200; diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 289a4dd77723..539a01043657 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -2102,18 +2102,24 @@ public class ActivityManager { private final GraphicBuffer mSnapshot; private final int mOrientation; private final Rect mContentInsets; + // Whether this snapshot is a down-sampled version of the full resolution, used mainly for + // low-ram devices private final boolean mReducedResolution; + // Whether or not the snapshot is a real snapshot or an app-theme generated snapshot due to + // the task having a secure window or having previews disabled private final boolean mIsRealSnapshot; + private final int mWindowingMode; private final float mScale; public TaskSnapshot(GraphicBuffer snapshot, int orientation, Rect contentInsets, - boolean reducedResolution, float scale, boolean isRealSnapshot) { + boolean reducedResolution, float scale, boolean isRealSnapshot, int windowingMode) { mSnapshot = snapshot; mOrientation = orientation; mContentInsets = new Rect(contentInsets); mReducedResolution = reducedResolution; mScale = scale; mIsRealSnapshot = isRealSnapshot; + mWindowingMode = windowingMode; } private TaskSnapshot(Parcel source) { @@ -2123,6 +2129,7 @@ public class ActivityManager { mReducedResolution = source.readBoolean(); mScale = source.readFloat(); mIsRealSnapshot = source.readBoolean(); + mWindowingMode = source.readInt(); } /** @@ -2163,6 +2170,13 @@ public class ActivityManager { } /** + * @return The windowing mode of the task when this snapshot was taken. + */ + public int getWindowingMode() { + return mWindowingMode; + } + + /** * @return The scale this snapshot was taken in. */ public float getScale() { @@ -2182,14 +2196,18 @@ public class ActivityManager { dest.writeBoolean(mReducedResolution); dest.writeFloat(mScale); dest.writeBoolean(mIsRealSnapshot); + dest.writeInt(mWindowingMode); } @Override public String toString() { - return "TaskSnapshot{mSnapshot=" + mSnapshot + " mOrientation=" + mOrientation + final int width = mSnapshot != null ? mSnapshot.getWidth() : 0; + final int height = mSnapshot != null ? mSnapshot.getHeight() : 0; + return "TaskSnapshot{mSnapshot=" + mSnapshot + " (" + width + "x" + height + ")" + + " mOrientation=" + mOrientation + " mContentInsets=" + mContentInsets.toShortString() + " mReducedResolution=" + mReducedResolution + " mScale=" + mScale - + " mIsRealSnapshot=" + mIsRealSnapshot; + + " mIsRealSnapshot=" + mIsRealSnapshot + " mWindowingMode=" + mWindowingMode; } public static final Creator<TaskSnapshot> CREATOR = new Creator<TaskSnapshot>() { diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java index a44bd0305875..07b4b9c39e1e 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -16,8 +16,6 @@ package android.app; -import com.android.internal.app.AlertController; - import android.annotation.ArrayRes; import android.annotation.AttrRes; import android.annotation.DrawableRes; @@ -30,17 +28,19 @@ import android.database.Cursor; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Message; +import android.text.Layout; +import android.text.method.MovementMethod; import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.View; -import android.view.WindowManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListAdapter; import android.widget.ListView; import com.android.internal.R; +import com.android.internal.app.AlertController; /** * A subclass of Dialog that can display one, two or three buttons. If you only want to @@ -54,7 +54,7 @@ import com.android.internal.R; * </pre> * * <p>The AlertDialog class takes care of automatically setting - * {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM + * {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM * WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} for you based on whether * any views in the dialog return true from {@link View#onCheckIsTextEditor() * View.onCheckIsTextEditor()}. Generally you want this set for a Dialog @@ -266,6 +266,17 @@ public class AlertDialog extends Dialog implements DialogInterface { mAlert.setMessage(message); } + /** @hide */ + public void setMessageMovementMethod(MovementMethod movementMethod) { + mAlert.setMessageMovementMethod(movementMethod); + } + + /** @hide */ + public void setMessageHyphenationFrequency( + @Layout.HyphenationFrequency int hyphenationFrequency) { + mAlert.setMessageHyphenationFrequency(hyphenationFrequency); + } + /** * Set the view to display in that dialog. */ diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index ab0001ca8c3c..dcf4eec80e69 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -109,6 +109,48 @@ public class AppOpsManager { */ public static final int MODE_DEFAULT = 3; + /** + * Metrics about an op when its uid is persistent. + * @hide + */ + public static final int UID_STATE_PERSISTENT = 0; + + /** + * Metrics about an op when its uid is at the top. + * @hide + */ + public static final int UID_STATE_TOP = 1; + + /** + * Metrics about an op when its uid is running a foreground service. + * @hide + */ + public static final int UID_STATE_FOREGROUND_SERVICE = 2; + + /** + * Metrics about an op when its uid is in the foreground for any other reasons. + * @hide + */ + public static final int UID_STATE_FOREGROUND = 3; + + /** + * Metrics about an op when its uid is in the background for any reason. + * @hide + */ + public static final int UID_STATE_BACKGROUND = 4; + + /** + * Metrics about an op when its uid is cached. + * @hide + */ + public static final int UID_STATE_CACHED = 5; + + /** + * Number of uid states we track. + * @hide + */ + public static final int _NUM_UID_STATE = 6; + // when adding one of these: // - increment _NUM_OP // - define an OPSTR_* constant (marked as @SystemApi) @@ -1471,8 +1513,8 @@ public class AppOpsManager { public static class OpEntry implements Parcelable { private final int mOp; private final int mMode; - private final long mTime; - private final long mRejectTime; + private final long[] mTimes; + private final long[] mRejectTimes; private final int mDuration; private final int mProxyUid; private final String mProxyPackageName; @@ -1481,8 +1523,23 @@ public class AppOpsManager { int proxyUid, String proxyPackage) { mOp = op; mMode = mode; - mTime = time; - mRejectTime = rejectTime; + mTimes = new long[_NUM_UID_STATE]; + mRejectTimes = new long[_NUM_UID_STATE]; + mTimes[0] = time; + mRejectTimes[0] = rejectTime; + mDuration = duration; + mProxyUid = proxyUid; + mProxyPackageName = proxyPackage; + } + + public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, + int proxyUid, String proxyPackage) { + mOp = op; + mMode = mode; + mTimes = new long[_NUM_UID_STATE]; + mRejectTimes = new long[_NUM_UID_STATE]; + System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE); + System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE); mDuration = duration; mProxyUid = proxyUid; mProxyPackageName = proxyPackage; @@ -1497,11 +1554,31 @@ public class AppOpsManager { } public long getTime() { - return mTime; + long time = 0; + for (int i = 0; i < _NUM_UID_STATE; i++) { + if (mTimes[i] > time) { + time = mTimes[i]; + } + } + return time; + } + + public long getTimeFor(int uidState) { + return mTimes[uidState]; } public long getRejectTime() { - return mRejectTime; + long time = 0; + for (int i = 0; i < _NUM_UID_STATE; i++) { + if (mRejectTimes[i] > time) { + time = mRejectTimes[i]; + } + } + return time; + } + + public long getRejectTimeFor(int uidState) { + return mRejectTimes[uidState]; } public boolean isRunning() { @@ -1509,7 +1586,7 @@ public class AppOpsManager { } public int getDuration() { - return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; + return mDuration; } public int getProxyUid() { @@ -1529,8 +1606,8 @@ public class AppOpsManager { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mOp); dest.writeInt(mMode); - dest.writeLong(mTime); - dest.writeLong(mRejectTime); + dest.writeLongArray(mTimes); + dest.writeLongArray(mRejectTimes); dest.writeInt(mDuration); dest.writeInt(mProxyUid); dest.writeString(mProxyPackageName); @@ -1539,8 +1616,8 @@ public class AppOpsManager { OpEntry(Parcel source) { mOp = source.readInt(); mMode = source.readInt(); - mTime = source.readLong(); - mRejectTime = source.readLong(); + mTimes = source.createLongArray(); + mRejectTimes = source.createLongArray(); mDuration = source.readInt(); mProxyUid = source.readInt(); mProxyPackageName = source.readString(); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 4f88a03db435..c5b80196cf26 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -972,6 +972,18 @@ public class Notification implements Parcelable public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory"; /** + * {@link #extras} key: boolean as supplied to + * {@link Builder#setShowRemoteInputSpinner(boolean)}. + * + * If set to true, then the view displaying the remote input history from + * {@link Builder#setRemoteInputHistory(CharSequence[])} will have a progress spinner. + * + * @see Builder#setShowRemoteInputSpinner(boolean) + * @hide + */ + public static final String EXTRA_SHOW_REMOTE_INPUT_SPINNER = "android.remoteInputSpinner"; + + /** * {@link #extras} key: this is a small piece of additional text as supplied to * {@link Builder#setContentInfo(CharSequence)}. */ @@ -3142,10 +3154,14 @@ public class Notification implements Parcelable private int mCachedContrastColor = COLOR_INVALID; private int mCachedContrastColorIsFor = COLOR_INVALID; /** - * Caches a ambient version of {@link #mCachedContrastColorIsFor}. + * Caches a ambient version of {@link #mCachedAmbientColorIsFor}. */ private int mCachedAmbientColor = COLOR_INVALID; private int mCachedAmbientColorIsFor = COLOR_INVALID; + /** + * A neutral color color that can be used for icons. + */ + private int mNeutralColor = COLOR_INVALID; /** * Caches an instance of StandardTemplateParams. Note that this may have been used before, @@ -3537,6 +3553,15 @@ public class Notification implements Parcelable } /** + * Sets whether remote history entries view should have a spinner. + * @hide + */ + public Builder setShowRemoteInputSpinner(boolean showSpinner) { + mN.extras.putBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER, showSpinner); + return this; + } + + /** * Sets the number of items this notification represents. May be displayed as a badge count * for Launchers that support badging. */ @@ -4278,7 +4303,6 @@ public class Notification implements Parcelable private void resetStandardTemplate(RemoteViews contentView) { resetNotificationHeader(contentView); - resetContentMargins(contentView); contentView.setViewVisibility(R.id.right_icon, View.GONE); contentView.setViewVisibility(R.id.title, View.GONE); contentView.setTextViewText(R.id.title, null); @@ -4310,24 +4334,23 @@ public class Notification implements Parcelable mN.mUsesStandardHeader = false; } - private void resetContentMargins(RemoteViews contentView) { - contentView.setViewLayoutMarginEndDimen(R.id.line1, 0); - contentView.setViewLayoutMarginEndDimen(R.id.text, 0); - } - - private RemoteViews applyStandardTemplate(int resId) { - return applyStandardTemplate(resId, mParams.reset().fillTextsFrom(this)); + private RemoteViews applyStandardTemplate(int resId, TemplateBindResult result) { + return applyStandardTemplate(resId, mParams.reset().fillTextsFrom(this), + result); } /** * @param hasProgress whether the progress bar should be shown and set + * @param result */ - private RemoteViews applyStandardTemplate(int resId, boolean hasProgress) { + private RemoteViews applyStandardTemplate(int resId, boolean hasProgress, + TemplateBindResult result) { return applyStandardTemplate(resId, mParams.reset().hasProgress(hasProgress) - .fillTextsFrom(this)); + .fillTextsFrom(this), result); } - private RemoteViews applyStandardTemplate(int resId, StandardTemplateParams p) { + private RemoteViews applyStandardTemplate(int resId, StandardTemplateParams p, + TemplateBindResult result) { RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId); resetStandardTemplate(contentView); @@ -4335,7 +4358,7 @@ public class Notification implements Parcelable final Bundle ex = mN.extras; updateBackgroundColor(contentView); bindNotificationHeader(contentView, p.ambient, p.headerTextSecondary); - bindLargeIcon(contentView, p.hideLargeIcon || p.ambient, p.alwaysShowReply); + bindLargeIconAndReply(contentView, p, result); boolean showProgress = handleProgressBar(p.hasProgress, contentView, ex); if (p.title != null) { contentView.setViewVisibility(R.id.title, View.VISIBLE); @@ -4531,8 +4554,58 @@ public class Notification implements Parcelable } } - private void bindLargeIcon(RemoteViews contentView, boolean hideLargeIcon, - boolean alwaysShowReply) { + private void bindLargeIconAndReply(RemoteViews contentView, StandardTemplateParams p, + TemplateBindResult result) { + boolean largeIconShown = bindLargeIcon(contentView, p.hideLargeIcon || p.ambient); + boolean replyIconShown = bindReplyIcon(contentView, p.hideReplyIcon || p.ambient); + contentView.setViewVisibility(R.id.right_icon_container, + largeIconShown || replyIconShown ? View.VISIBLE : View.GONE); + int marginEnd = calculateMarginEnd(largeIconShown, replyIconShown); + contentView.setViewLayoutMarginEnd(R.id.line1, marginEnd); + contentView.setViewLayoutMarginEnd(R.id.text, marginEnd); + contentView.setViewLayoutMarginEnd(R.id.progress, marginEnd); + if (result != null) { + result.setIconMarginEnd(marginEnd); + } + } + + private int calculateMarginEnd(boolean largeIconShown, boolean replyIconShown) { + int marginEnd = 0; + int contentMargin = mContext.getResources().getDimensionPixelSize( + R.dimen.notification_content_margin_end); + int iconSize = mContext.getResources().getDimensionPixelSize( + R.dimen.notification_right_icon_size); + if (replyIconShown) { + // The size of the reply icon + marginEnd += iconSize; + + int replyInset = mContext.getResources().getDimensionPixelSize( + R.dimen.notification_reply_inset); + // We're subtracting the inset of the reply icon to make sure it's + // aligned nicely on the right, and remove it from the following padding + marginEnd -= replyInset * 2; + } + if (largeIconShown) { + // adding size of the right icon + marginEnd += iconSize; + + if (replyIconShown) { + // We also add some padding to the reply icon if it's around + marginEnd += contentMargin; + } + } + if (replyIconShown || largeIconShown) { + // The padding to the content + marginEnd += contentMargin; + } + return marginEnd; + } + + /** + * Bind the large icon. + * @return if the largeIcon is visible + */ + private boolean bindLargeIcon(RemoteViews contentView, boolean hideLargeIcon) { if (mN.mLargeIcon == null && mN.largeIcon != null) { mN.mLargeIcon = Icon.createWithBitmap(mN.largeIcon); } @@ -4541,51 +4614,35 @@ public class Notification implements Parcelable contentView.setViewVisibility(R.id.right_icon, View.VISIBLE); contentView.setImageViewIcon(R.id.right_icon, mN.mLargeIcon); processLargeLegacyIcon(mN.mLargeIcon, contentView); - int endMargin = R.dimen.notification_content_picture_margin; - contentView.setViewLayoutMarginEndDimen(R.id.line1, endMargin); - contentView.setViewLayoutMarginEndDimen(R.id.text, endMargin); - contentView.setViewLayoutMarginEndDimen(R.id.progress, endMargin); } - // Bind the reply action - Action action = findReplyAction(); + return showLargeIcon; + } - boolean actionVisible = action != null && (showLargeIcon || alwaysShowReply); - int replyId = showLargeIcon ? R.id.reply_icon_action : R.id.right_icon; + /** + * Bind the reply icon. + * @return if the reply icon is visible + */ + private boolean bindReplyIcon(RemoteViews contentView, boolean hideReplyIcon) { + boolean actionVisible = !hideReplyIcon; + Action action = null; if (actionVisible) { - // We're only showing the icon as big if we're hiding the large icon - int contrastColor = resolveContrastColor(); - int iconColor; - if (showLargeIcon) { - contentView.setDrawableTint(R.id.reply_icon_action, - true /* targetBackground */, - contrastColor, PorterDuff.Mode.SRC_ATOP); - contentView.setOnClickPendingIntent(R.id.right_icon, - action.actionIntent); - contentView.setRemoteInputs(R.id.right_icon, action.mRemoteInputs); - iconColor = NotificationColorUtil.isColorLight(contrastColor) - ? Color.BLACK : Color.WHITE; - } else { - contentView.setImageViewResource(R.id.right_icon, - R.drawable.ic_reply_notification_large); - contentView.setViewVisibility(R.id.right_icon, View.VISIBLE); - iconColor = contrastColor; - } - contentView.setDrawableTint(replyId, + action = findReplyAction(); + actionVisible = action != null; + } + if (actionVisible) { + contentView.setViewVisibility(R.id.reply_icon_action, View.VISIBLE); + contentView.setDrawableTint(R.id.reply_icon_action, false /* targetBackground */, - iconColor, + getNeutralColor(), PorterDuff.Mode.SRC_ATOP); - contentView.setOnClickPendingIntent(replyId, - action.actionIntent); - contentView.setRemoteInputs(replyId, action.mRemoteInputs); + contentView.setOnClickPendingIntent(R.id.reply_icon_action, action.actionIntent); + contentView.setRemoteInputs(R.id.reply_icon_action, action.mRemoteInputs); } else { - contentView.setRemoteInputs(R.id.right_icon, null); + contentView.setRemoteInputs(R.id.reply_icon_action, null); } - contentView.setViewVisibility(R.id.reply_icon_action, actionVisible && showLargeIcon - ? View.VISIBLE - : View.GONE); - contentView.setViewVisibility(R.id.right_icon_container, actionVisible || showLargeIcon - ? View.VISIBLE - : View.GONE); + contentView.setViewVisibility(R.id.reply_icon_action, + actionVisible ? View.VISIBLE : View.GONE); + return actionVisible; } private Action findReplyAction() { @@ -4620,8 +4677,7 @@ public class Notification implements Parcelable } private void bindActivePermissions(RemoteViews contentView, boolean ambient) { - int color = ambient ? resolveAmbientColor() - : isColorized() ? getPrimaryTextColor() : resolveContrastColor(); + int color = ambient ? resolveAmbientColor() : getNeutralColor(); contentView.setDrawableTint(R.id.camera, false, color, PorterDuff.Mode.SRC_ATOP); contentView.setDrawableTint(R.id.mic, false, color, PorterDuff.Mode.SRC_ATOP); contentView.setDrawableTint(R.id.overlay, false, color, PorterDuff.Mode.SRC_ATOP); @@ -4760,6 +4816,8 @@ public class Notification implements Parcelable big.setViewVisibility(R.id.notification_material_reply_container, View.GONE); big.setTextViewText(R.id.notification_material_reply_text_1, null); + big.setViewVisibility(R.id.notification_material_reply_text_1_container, View.GONE); + big.setViewVisibility(R.id.notification_material_reply_progress, View.GONE); big.setViewVisibility(R.id.notification_material_reply_text_2, View.GONE); big.setTextViewText(R.id.notification_material_reply_text_2, null); @@ -4770,13 +4828,15 @@ public class Notification implements Parcelable R.dimen.notification_content_margin); } - private RemoteViews applyStandardTemplateWithActions(int layoutId) { - return applyStandardTemplateWithActions(layoutId, mParams.reset().fillTextsFrom(this)); + private RemoteViews applyStandardTemplateWithActions(int layoutId, + TemplateBindResult result) { + return applyStandardTemplateWithActions(layoutId, mParams.reset().fillTextsFrom(this), + result); } private RemoteViews applyStandardTemplateWithActions(int layoutId, - StandardTemplateParams p) { - RemoteViews big = applyStandardTemplate(layoutId, p); + StandardTemplateParams p, TemplateBindResult result) { + RemoteViews big = applyStandardTemplate(layoutId, p, result); resetStandardTemplateWithActions(big); @@ -4810,10 +4870,19 @@ public class Notification implements Parcelable CharSequence[] replyText = mN.extras.getCharSequenceArray(EXTRA_REMOTE_INPUT_HISTORY); if (!p.ambient && validRemoteInput && replyText != null && replyText.length > 0 && !TextUtils.isEmpty(replyText[0])) { + boolean showSpinner = mN.extras.getBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER); big.setViewVisibility(R.id.notification_material_reply_container, View.VISIBLE); + big.setViewVisibility(R.id.notification_material_reply_text_1_container, + View.VISIBLE); big.setTextViewText(R.id.notification_material_reply_text_1, processTextSpans(replyText[0])); setTextViewColorSecondary(big, R.id.notification_material_reply_text_1); + big.setViewVisibility(R.id.notification_material_reply_progress, + showSpinner ? View.VISIBLE : View.GONE); + big.setProgressIndeterminateTintList( + R.id.notification_material_reply_progress, + ColorStateList.valueOf( + isColorized() ? getPrimaryTextColor() : resolveContrastColor())); if (replyText.length > 1 && !TextUtils.isEmpty(replyText[1])) { big.setViewVisibility(R.id.notification_material_reply_text_2, View.VISIBLE); @@ -4883,7 +4952,7 @@ public class Notification implements Parcelable return styleView; } } - return applyStandardTemplate(getBaseLayoutResource()); + return applyStandardTemplate(getBaseLayoutResource(), null /* result */); } private boolean useExistingRemoteView() { @@ -4902,7 +4971,8 @@ public class Notification implements Parcelable result = mStyle.makeBigContentView(); hideLine1Text(result); } else if (mActions.size() != 0) { - result = applyStandardTemplateWithActions(getBigBaseLayoutResource()); + result = applyStandardTemplateWithActions(getBigBaseLayoutResource(), + null /* result */); } makeHeaderExpanded(result); return result; @@ -4939,7 +5009,8 @@ public class Notification implements Parcelable public RemoteViews makeAmbientNotification() { RemoteViews ambient = applyStandardTemplateWithActions( R.layout.notification_template_material_ambient, - mParams.reset().ambient(true).fillTextsFrom(this).hasProgress(false)); + mParams.reset().ambient(true).fillTextsFrom(this).hasProgress(false), + null /* result */); return ambient; } @@ -4982,7 +5053,7 @@ public class Notification implements Parcelable return null; } - return applyStandardTemplateWithActions(getBigBaseLayoutResource()); + return applyStandardTemplateWithActions(getBigBaseLayoutResource(), null /* result */); } /** @@ -5330,6 +5401,20 @@ public class Notification implements Parcelable return mCachedContrastColor = color; } + int resolveNeutralColor() { + if (mNeutralColor != COLOR_INVALID) { + return mNeutralColor; + } + int background = mContext.getColor( + com.android.internal.R.color.notification_material_background_color); + mNeutralColor = NotificationColorUtil.resolveDefaultColor(mContext, background); + if (Color.alpha(mNeutralColor) < 255) { + // alpha doesn't go well for color filters, so let's blend it manually + mNeutralColor = NotificationColorUtil.compositeColors(mNeutralColor, background); + } + return mNeutralColor; + } + int resolveAmbientColor() { if (mCachedAmbientColorIsFor == mN.color && mCachedAmbientColorIsFor != COLOR_INVALID) { return mCachedAmbientColor; @@ -5468,7 +5553,8 @@ public class Notification implements Parcelable * * @hide */ - public static Notification maybeCloneStrippedForDelivery(Notification n, boolean isLowRam) { + public static Notification maybeCloneStrippedForDelivery(Notification n, boolean isLowRam, + Context context) { String templateClass = n.extras.getString(EXTRA_TEMPLATE); // Only strip views for known Styles because we won't know how to @@ -5510,9 +5596,13 @@ public class Notification implements Parcelable clone.extras.remove(EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT); } if (isLowRam) { - clone.extras.remove(Notification.TvExtender.EXTRA_TV_EXTENDER); - clone.extras.remove(WearableExtender.EXTRA_WEARABLE_EXTENSIONS); - clone.extras.remove(CarExtender.EXTRA_CAR_EXTENDER); + String[] allowedServices = context.getResources().getStringArray( + R.array.config_allowedManagedServicesOnLowRamDevices); + if (allowedServices.length == 0) { + clone.extras.remove(Notification.TvExtender.EXTRA_TV_EXTENDER); + clone.extras.remove(WearableExtender.EXTRA_WEARABLE_EXTENSIONS); + clone.extras.remove(CarExtender.EXTRA_CAR_EXTENDER); + } } return clone; } @@ -5562,6 +5652,17 @@ public class Notification implements Parcelable } /** + * Gets a neutral color that can be used for icons or similar that should not stand out. + */ + private int getNeutralColor() { + if (isColorized()) { + return getSecondaryTextColor(); + } else { + return resolveNeutralColor(); + } + } + + /** * Same as getBackgroundColor but also resolved the default color to the background. */ private int resolveBackgroundColor() { @@ -5863,6 +5964,18 @@ public class Notification implements Parcelable } protected RemoteViews getStandardView(int layoutId) { + return getStandardView(layoutId, null); + } + + /** + * Get the standard view for this style. + * + * @param layoutId The layout id to use + * @param result The result where template bind information is saved. + * @return A remoteView for this style. + * @hide + */ + protected RemoteViews getStandardView(int layoutId, TemplateBindResult result) { checkBuilder(); // Nasty. @@ -5872,7 +5985,7 @@ public class Notification implements Parcelable mBuilder.setContentTitle(mBigContentTitle); } - RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(layoutId); + RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(layoutId, result); mBuilder.getAllExtras().putCharSequence(EXTRA_TITLE, oldBuilderContentTitle); @@ -6169,7 +6282,8 @@ public class Notification implements Parcelable mBuilder.mN.largeIcon = null; } - RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource()); + RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource(), + null /* result */); if (mSummaryTextSet) { contentView.setTextViewText(R.id.text, mBuilder.processTextSpans( mBuilder.processLegacyText(mSummaryText))); @@ -6356,7 +6470,9 @@ public class Notification implements Parcelable CharSequence text = mBuilder.getAllExtras().getCharSequence(EXTRA_TEXT); mBuilder.getAllExtras().putCharSequence(EXTRA_TEXT, null); - RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource()); + TemplateBindResult result = new TemplateBindResult(); + RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), result); + contentView.setInt(R.id.big_text, "setImageEndMargin", result.getIconMarginEnd()); mBuilder.getAllExtras().putCharSequence(EXTRA_TEXT, text); @@ -6739,7 +6855,7 @@ public class Notification implements Parcelable mBuilder.mOriginalActions = mBuilder.mActions; mBuilder.mActions = new ArrayList<>(); RemoteViews remoteViews = makeMessagingView(true /* displayImagesAtEnd */, - true /* showReplyIcon */); + false /* hideLargeIcon */); mBuilder.mActions = mBuilder.mOriginalActions; mBuilder.mOriginalActions = null; return remoteViews; @@ -6826,7 +6942,7 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeBigContentView() { - return makeMessagingView(false /* displayImagesAtEnd */, false /* showReplyIcon */); + return makeMessagingView(false /* displayImagesAtEnd */, true /* hideLargeIcon */); } /** @@ -6834,11 +6950,11 @@ public class Notification implements Parcelable * * @param displayImagesAtEnd should images be displayed at the end of the content instead * of inline. - * @param showReplyIcon Should the reply affordance be shown at the end of the notification + * @param hideRightIcons Should the reply affordance be shown at the end of the notification * @return the created remoteView. */ @NonNull - private RemoteViews makeMessagingView(boolean displayImagesAtEnd, boolean showReplyIcon) { + private RemoteViews makeMessagingView(boolean displayImagesAtEnd, boolean hideRightIcons) { CharSequence conversationTitle = !TextUtils.isEmpty(super.mBigContentTitle) ? super.mBigContentTitle : mConversationTitle; @@ -6849,20 +6965,18 @@ public class Notification implements Parcelable nameReplacement = conversationTitle; conversationTitle = null; } - boolean hideLargeIcon = !showReplyIcon || isOneToOne; + TemplateBindResult bindResult = new TemplateBindResult(); RemoteViews contentView = mBuilder.applyStandardTemplateWithActions( mBuilder.getMessagingLayoutResource(), mBuilder.mParams.reset().hasProgress(false).title(conversationTitle).text(null) - .hideLargeIcon(hideLargeIcon) - .headerTextSecondary(conversationTitle) - .alwaysShowReply(showReplyIcon)); + .hideLargeIcon(hideRightIcons || isOneToOne) + .hideReplyIcon(hideRightIcons) + .headerTextSecondary(conversationTitle), + bindResult); addExtras(mBuilder.mN.extras); // also update the end margin if there is an image - int endMargin = R.dimen.notification_content_margin_end; - if (showReplyIcon) { - endMargin = R.dimen.notification_content_plus_picture_margin_end; - } - contentView.setViewLayoutMarginEndDimen(R.id.notification_main_column, endMargin); + contentView.setViewLayoutMarginEnd(R.id.notification_messaging, + bindResult.getIconMarginEnd()); contentView.setInt(R.id.status_bar_latest_event_content, "setLayoutColor", mBuilder.resolveContrastColor()); contentView.setBoolean(R.id.status_bar_latest_event_content, "setDisplayImagesAtEnd", @@ -6934,7 +7048,7 @@ public class Notification implements Parcelable @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { RemoteViews remoteViews = makeMessagingView(true /* displayImagesAtEnd */, - false /* showReplyIcon */); + true /* hideLargeIcon */); remoteViews.setInt(R.id.notification_messaging, "setMaxDisplayedLines", 1); return remoteViews; } @@ -6953,11 +7067,16 @@ public class Notification implements Parcelable static final String KEY_DATA_MIME_TYPE = "type"; static final String KEY_DATA_URI= "uri"; static final String KEY_EXTRAS_BUNDLE = "extras"; + static final String KEY_REMOTE_INPUT_HISTORY = "remote_input_history"; private final CharSequence mText; private final long mTimestamp; @Nullable private final Person mSender; + /** True if this message was generated from the extra + * {@link Notification#EXTRA_REMOTE_INPUT_HISTORY} + */ + private final boolean mRemoteInputHistory; private Bundle mExtras = new Bundle(); private String mDataMimeType; @@ -6996,9 +7115,33 @@ public class Notification implements Parcelable * </p> */ public Message(@NonNull CharSequence text, long timestamp, @Nullable Person sender) { + this(text, timestamp, sender, false /* remoteHistory */); + } + + /** + * Constructor + * @param text A {@link CharSequence} to be displayed as the message content + * @param timestamp Time at which the message arrived + * @param sender The {@link Person} who sent the message. + * Should be <code>null</code> for messages by the current user, in which case + * the platform will insert the user set in {@code MessagingStyle(Person)}. + * @param remoteInputHistory True if the messages was generated from the extra + * {@link Notification#EXTRA_REMOTE_INPUT_HISTORY}. + * <p> + * The person provided should contain an Icon, set with + * {@link Person.Builder#setIcon(Icon)} and also have a name provided + * with {@link Person.Builder#setName(CharSequence)}. If multiple users have the same + * name, consider providing a key with {@link Person.Builder#setKey(String)} in order + * to differentiate between the different users. + * </p> + * @hide + */ + public Message(@NonNull CharSequence text, long timestamp, @Nullable Person sender, + boolean remoteInputHistory) { mText = text; mTimestamp = timestamp; mSender = sender; + mRemoteInputHistory = remoteInputHistory; } /** @@ -7088,6 +7231,15 @@ public class Notification implements Parcelable return mDataUri; } + /** + * @return True if the message was generated from + * {@link Notification#EXTRA_REMOTE_INPUT_HISTORY}. + * @hide + */ + public boolean isRemoteInputHistory() { + return mRemoteInputHistory; + } + private Bundle toBundle() { Bundle bundle = new Bundle(); if (mText != null) { @@ -7108,6 +7260,9 @@ public class Notification implements Parcelable if (mExtras != null) { bundle.putBundle(KEY_EXTRAS_BUNDLE, mExtras); } + if (mRemoteInputHistory) { + bundle.putBoolean(KEY_REMOTE_INPUT_HISTORY, mRemoteInputHistory); + } return bundle; } @@ -7159,7 +7314,8 @@ public class Notification implements Parcelable } Message message = new Message(bundle.getCharSequence(KEY_TEXT), bundle.getLong(KEY_TIMESTAMP), - senderPerson); + senderPerson, + bundle.getBoolean(KEY_REMOTE_INPUT_HISTORY, false)); if (bundle.containsKey(KEY_DATA_MIME_TYPE) && bundle.containsKey(KEY_DATA_URI)) { message.setData(bundle.getString(KEY_DATA_MIME_TYPE), @@ -7275,7 +7431,8 @@ public class Notification implements Parcelable CharSequence oldBuilderContentText = mBuilder.mN.extras.getCharSequence(EXTRA_TEXT); mBuilder.getAllExtras().putCharSequence(EXTRA_TEXT, null); - RemoteViews contentView = getStandardView(mBuilder.getInboxLayoutResource()); + TemplateBindResult result = new TemplateBindResult(); + RemoteViews contentView = getStandardView(mBuilder.getInboxLayoutResource(), result); mBuilder.getAllExtras().putCharSequence(EXTRA_TEXT, oldBuilderContentText); @@ -7304,7 +7461,8 @@ public class Notification implements Parcelable mBuilder.processTextSpans(mBuilder.processLegacyText(str))); mBuilder.setTextViewColorSecondary(contentView, rowIds[i]); contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0); - handleInboxImageMargin(contentView, rowIds[i], first); + handleInboxImageMargin(contentView, rowIds[i], first, + result.getIconMarginEnd()); if (first) { onlyViewId = rowIds[i]; } else { @@ -7336,17 +7494,18 @@ public class Notification implements Parcelable return !Objects.equals(getLines(), newS.getLines()); } - private void handleInboxImageMargin(RemoteViews contentView, int id, boolean first) { + private void handleInboxImageMargin(RemoteViews contentView, int id, boolean first, + int marginEndValue) { int endMargin = 0; if (first) { final int max = mBuilder.mN.extras.getInt(EXTRA_PROGRESS_MAX, 0); final boolean ind = mBuilder.mN.extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE); boolean hasProgress = max != 0 || ind; - if (mBuilder.mN.hasLargeIcon() && !hasProgress) { - endMargin = R.dimen.notification_content_picture_margin; + if (!hasProgress) { + endMargin = marginEndValue; } } - contentView.setViewLayoutMarginEndDimen(id, endMargin); + contentView.setViewLayoutMarginEnd(id, endMargin); } } @@ -7535,7 +7694,8 @@ public class Notification implements Parcelable private RemoteViews makeMediaContentView() { RemoteViews view = mBuilder.applyStandardTemplate( - R.layout.notification_template_material_media, false /* hasProgress */); + R.layout.notification_template_material_media, false, /* hasProgress */ + null /* result */); final int numActions = mBuilder.mActions.size(); final int N = mActionsToShowInCompact == null @@ -7559,7 +7719,7 @@ public class Notification implements Parcelable // handle the content margin int endMargin = R.dimen.notification_content_margin_end; if (mBuilder.mN.hasLargeIcon()) { - endMargin = R.dimen.notification_content_plus_picture_margin_end; + endMargin = R.dimen.notification_media_image_margin_end; } view.setViewLayoutMarginEndDimen(R.id.notification_main_column, endMargin); return view; @@ -7580,8 +7740,7 @@ public class Notification implements Parcelable return null; } RemoteViews big = mBuilder.applyStandardTemplate( - R.layout.notification_template_material_big_media, - false); + R.layout.notification_template_material_big_media, false, null /* result */); if (actionCount > 0) { big.removeAllViews(com.android.internal.R.id.media_actions); @@ -7677,16 +7836,18 @@ public class Notification implements Parcelable if (mBuilder.mActions.size() == 0) { return makeStandardTemplateWithCustomContent(headsUpContentView); } + TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions( - mBuilder.getBigBaseLayoutResource()); - buildIntoRemoteViewContent(remoteViews, headsUpContentView); + mBuilder.getBigBaseLayoutResource(), result); + buildIntoRemoteViewContent(remoteViews, headsUpContentView, result); return remoteViews; } private RemoteViews makeStandardTemplateWithCustomContent(RemoteViews customContent) { + TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplate( - mBuilder.getBaseLayoutResource()); - buildIntoRemoteViewContent(remoteViews, customContent); + mBuilder.getBaseLayoutResource(), result); + buildIntoRemoteViewContent(remoteViews, customContent, result); return remoteViews; } @@ -7697,14 +7858,15 @@ public class Notification implements Parcelable if (mBuilder.mActions.size() == 0) { return makeStandardTemplateWithCustomContent(bigContentView); } + TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions( - mBuilder.getBigBaseLayoutResource()); - buildIntoRemoteViewContent(remoteViews, bigContentView); + mBuilder.getBigBaseLayoutResource(), result); + buildIntoRemoteViewContent(remoteViews, bigContentView, result); return remoteViews; } private void buildIntoRemoteViewContent(RemoteViews remoteViews, - RemoteViews customContent) { + RemoteViews customContent, TemplateBindResult result) { if (customContent != null) { // Need to clone customContent before adding, because otherwise it can no longer be // parceled independently of remoteViews. @@ -7714,11 +7876,10 @@ public class Notification implements Parcelable remoteViews.setReapplyDisallowed(); } // also update the end margin if there is an image - int endMargin = R.dimen.notification_content_margin_end; - if (mBuilder.mN.hasLargeIcon()) { - endMargin = R.dimen.notification_content_plus_picture_margin_end; - } - remoteViews.setViewLayoutMarginEndDimen(R.id.notification_main_column, endMargin); + Resources resources = mBuilder.mContext.getResources(); + int endMargin = resources.getDimensionPixelSize( + R.dimen.notification_content_margin_end) + result.getIconMarginEnd(); + remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column, endMargin); } /** @@ -9322,6 +9483,25 @@ public class Notification implements Parcelable } } + /** + * A result object where information about the template that was created is saved. + */ + private static class TemplateBindResult { + int mIconMarginEnd; + + /** + * Get the margin end that needs to be added to any fields that may overlap + * with the right actions. + */ + public int getIconMarginEnd() { + return mIconMarginEnd; + } + + public void setIconMarginEnd(int iconMarginEnd) { + this.mIconMarginEnd = iconMarginEnd; + } + } + private static class StandardTemplateParams { boolean hasProgress = true; boolean ambient = false; @@ -9329,7 +9509,7 @@ public class Notification implements Parcelable CharSequence text; CharSequence headerTextSecondary; boolean hideLargeIcon; - public boolean alwaysShowReply; + boolean hideReplyIcon; final StandardTemplateParams reset() { hasProgress = true; @@ -9360,13 +9540,13 @@ public class Notification implements Parcelable return this; } - final StandardTemplateParams alwaysShowReply(boolean alwaysShowReply) { - this.alwaysShowReply = alwaysShowReply; + final StandardTemplateParams hideLargeIcon(boolean hideLargeIcon) { + this.hideLargeIcon = hideLargeIcon; return this; } - final StandardTemplateParams hideLargeIcon(boolean hideLargeIcon) { - this.hideLargeIcon = hideLargeIcon; + final StandardTemplateParams hideReplyIcon(boolean hideReplyIcon) { + this.hideReplyIcon = hideReplyIcon; return this; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 93be932b7fd0..f6dc5d15f385 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -399,7 +399,8 @@ public class NotificationManager { ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); boolean isLowRam = am.isLowRamDevice(); - final Notification copy = Builder.maybeCloneStrippedForDelivery(notification, isLowRam); + final Notification copy = Builder.maybeCloneStrippedForDelivery(notification, isLowRam, + mContext); try { service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id, copy, user.getIdentifier()); diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index 315259bdf388..bdaf80e374df 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -33,8 +33,11 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.UserHandle; import android.util.AndroidException; +import android.util.ArraySet; import android.util.proto.ProtoOutputStream; +import com.android.internal.os.IResultReceiver; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -93,7 +96,9 @@ import java.lang.annotation.RetentionPolicy; */ public final class PendingIntent implements Parcelable { private final IIntentSender mTarget; + private IResultReceiver mCancelReceiver; private IBinder mWhitelistToken; + private ArraySet<CancelListener> mCancelListeners; /** @hide */ @IntDef(flag = true, @@ -964,6 +969,74 @@ public final class PendingIntent implements Parcelable { } /** + * Register a listener to when this pendingIntent is cancelled. There are no guarantees on which + * thread a listener will be called and it's up to the caller to synchronize. This may + * trigger a synchronous binder call so should therefore usually be called on a background + * thread. + * + * @hide + */ + public void registerCancelListener(CancelListener cancelListener) { + synchronized (this) { + if (mCancelReceiver == null) { + mCancelReceiver = new IResultReceiver.Stub() { + @Override + public void send(int resultCode, Bundle resultData) throws RemoteException { + notifyCancelListeners(); + } + }; + } + if (mCancelListeners == null) { + mCancelListeners = new ArraySet<>(); + } + boolean wasEmpty = mCancelListeners.isEmpty(); + mCancelListeners.add(cancelListener); + if (wasEmpty) { + try { + ActivityManager.getService().registerIntentSenderCancelListener(mTarget, + mCancelReceiver); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + } + + private void notifyCancelListeners() { + ArraySet<CancelListener> cancelListeners; + synchronized (this) { + cancelListeners = new ArraySet<>(mCancelListeners); + } + int size = cancelListeners.size(); + for (int i = 0; i < size; i++) { + cancelListeners.valueAt(i).onCancelled(this); + } + } + + /** + * Un-register a listener to when this pendingIntent is cancelled. + * + * @hide + */ + public void unregisterCancelListener(CancelListener cancelListener) { + synchronized (this) { + if (mCancelListeners == null) { + return; + } + boolean wasEmpty = mCancelListeners.isEmpty(); + mCancelListeners.remove(cancelListener); + if (mCancelListeners.isEmpty() && !wasEmpty) { + try { + ActivityManager.getService().unregisterIntentSenderCancelListener(mTarget, + mCancelReceiver); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + } + + /** * Return the user handle of the application that created this * PendingIntent, that is the user under which you will actually be * sending the Intent. The returned UserHandle is supplied by the system, so @@ -1184,4 +1257,18 @@ public final class PendingIntent implements Parcelable { public IBinder getWhitelistToken() { return mWhitelistToken; } + + /** + * A listener to when a pending intent is cancelled + * + * @hide + */ + public interface CancelListener { + /** + * Called when a Pending Intent is cancelled. + * + * @param intent The intent that was cancelled. + */ + void onCancelled(PendingIntent intent); + } } diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 46566e79d99c..21d6762666a0 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -495,7 +495,15 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu * @hide */ public boolean tasksAreFloating() { - return mWindowingMode == WINDOWING_MODE_FREEFORM || mWindowingMode == WINDOWING_MODE_PINNED; + return isFloating(mWindowingMode); + } + + /** + * Returns true if the windowingMode represents a floating window. + * @hide + */ + public static boolean isFloating(int windowingMode) { + return windowingMode == WINDOWING_MODE_FREEFORM || windowingMode == WINDOWING_MODE_PINNED; } /** diff --git a/core/java/android/app/admin/SystemUpdatePolicy.java b/core/java/android/app/admin/SystemUpdatePolicy.java index 20eef6cc01d8..2a451ff07672 100644 --- a/core/java/android/app/admin/SystemUpdatePolicy.java +++ b/core/java/android/app/admin/SystemUpdatePolicy.java @@ -48,7 +48,37 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** - * A class that represents a local system update policy set by the device owner. + * Determines when over-the-air system updates are installed on a device. Only a device policy + * controller (DPC) running in device owner mode can set an update policy for the device—by calling + * the {@code DevicePolicyManager} method + * {@link DevicePolicyManager#setSystemUpdatePolicy setSystemUpdatePolicy()}. An update + * policy affects the pending system update (if there is one) and any future updates for the device. + * + * <p>If a policy is set on a device, the system doesn't notify the user about updates.</p> + * <h3>Example</h3> + * + * <p>The example below shows how a DPC might set a maintenance window for system updates:</p> + * <pre><code> + * private final MAINTENANCE_WINDOW_START = 1380; // 11pm + * private final MAINTENANCE_WINDOW_END = 120; // 2am + * + * // ... + * + * // Create the system update policy + * SystemUpdatePolicy policy = SystemUpdatePolicy.createWindowedInstallPolicy( + * MAINTENANCE_WINDOW_START, MAINTENANCE_WINDOW_END); + * + * // Get a DevicePolicyManager instance to set the policy on the device + * DevicePolicyManager dpm = + * (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); + * ComponentName adminComponent = getComponentName(context); + * dpm.setSystemUpdatePolicy(adminComponent, policy); + * </code></pre> + * + * <h3>Developer guide</h3> + * To learn more about managing system updates, read + * <a href="{@docRoot}/work/dpc/security.html#control_remote_software_updates">Control remote + * software updates</a>. * * @see DevicePolicyManager#setSystemUpdatePolicy * @see DevicePolicyManager#getSystemUpdatePolicy @@ -71,44 +101,37 @@ public final class SystemUpdatePolicy implements Parcelable { private static final int TYPE_UNKNOWN = -1; /** - * Install system update automatically as soon as one is available. + * Installs system updates (without user interaction) as soon as they become available. Setting + * this policy type immediately installs any pending updates that might be postponed or waiting + * for a maintenance window. */ public static final int TYPE_INSTALL_AUTOMATIC = 1; /** - * Install system update automatically within a daily maintenance window. An update can be - * delayed for a maximum of 30 days, after which the policy will no longer be effective and the - * system will revert back to its normal behavior as if no policy were set. - * - * <p>After this policy expires, resetting it to any policy other than - * {@link #TYPE_INSTALL_AUTOMATIC} will produce no effect, as the 30-day maximum delay has - * already been used up. - * The {@link #TYPE_INSTALL_AUTOMATIC} policy will still take effect to install the delayed - * system update immediately. + * Installs system updates (without user interaction) during a daily maintenance window. Set the + * start and end of the daily maintenance window, as minutes of the day, when creating a new + * {@code TYPE_INSTALL_WINDOWED} policy. See + * {@link #createWindowedInstallPolicy createWindowedInstallPolicy()}. * - * <p>Re-applying this policy or changing it to {@link #TYPE_POSTPONE} within the 30-day period - * will <i>not</i> extend policy expiration. - * However, the expiration will be recalculated when a new system update is made available. + * <p>No connectivity, not enough disk space, or a low battery are typical reasons Android might + * not install a system update in the daily maintenance window. After 30 days trying to install + * an update in the maintenance window (regardless of policy changes in this period), the system + * prompts the device user to install the update. */ public static final int TYPE_INSTALL_WINDOWED = 2; /** - * Incoming system updates (except for security updates) will be blocked for a maximum of 30 - * days, after which the policy will no longer be effective and the system will revert back to - * its normal behavior as if no policy were set. + * Postpones the installation of system updates for 30 days. After the 30-day period has ended, + * the system prompts the device user to install the update. * - * <p><b>Note:</b> security updates (e.g. monthly security patches) may <i>not</i> be affected - * by this policy, depending on the policy set by the device manufacturer and carrier. + * <p>The system limits each update to one 30-day postponement. The period begins when the + * system first postpones the update and setting new {@code TYPE_POSTPONE} policies won’t extend + * the period. If, after 30 days the update isn’t installed (through policy changes), the system + * prompts the user to install the update. * - * <p>After this policy expires, resetting it to any policy other than - * {@link #TYPE_INSTALL_AUTOMATIC} will produce no effect, as the 30-day maximum delay has - * already been used up. - * The {@link #TYPE_INSTALL_AUTOMATIC} policy will still take effect to install the delayed - * system update immediately. - * - * <p>Re-applying this policy or changing it to {@link #TYPE_INSTALL_WINDOWED} within the 30-day - * period will <i>not</i> extend policy expiration. - * However, the expiration will be recalculated when a new system update is made available. + * <p><strong>Note</strong>: Device manufacturers or carriers might choose to exempt important + * security updates from a postponement policy. Exempted updates notify the device user when + * they become available. */ public static final int TYPE_POSTPONE = 3; @@ -303,16 +326,20 @@ public final class SystemUpdatePolicy implements Parcelable { * Create a policy object and set it to: new system update will only be installed automatically * when the system clock is inside a daily maintenance window. If the start and end times are * the same, the window is considered to include the <i>whole 24 hours</i>. That is, updates can - * install at any time. If the given window in invalid, an {@link IllegalArgumentException} - * will be thrown. If start time is later than end time, the window is considered spanning + * install at any time. If start time is later than end time, the window is considered spanning * midnight (i.e. the end time denotes a time on the next day). The maintenance window will last - * for 30 days, after which the system will revert back to its normal behavior as if no policy - * were set. + * for 30 days for any given update, after which the window will no longer be effective and + * the pending update will be made available for manual installation as if no system update + * policy were set on the device. See {@link #TYPE_INSTALL_WINDOWED} for the details of this + * policy's behavior. * * @param startTime the start of the maintenance window, measured as the number of minutes from * midnight in the device's local time. Must be in the range of [0, 1440). * @param endTime the end of the maintenance window, measured as the number of minutes from * midnight in the device's local time. Must be in the range of [0, 1440). + * @throws IllegalArgumentException If the {@code startTime} or {@code endTime} isn't in the + * accepted range. + * @return The configured policy. * @see #TYPE_INSTALL_WINDOWED */ public static SystemUpdatePolicy createWindowedInstallPolicy(int startTime, int endTime) { @@ -329,8 +356,7 @@ public final class SystemUpdatePolicy implements Parcelable { /** * Create a policy object and set it to block installation for a maximum period of 30 days. - * After expiration the system will revert back to its normal behavior as if no policy were - * set. + * To learn more about this policy's behavior, see {@link #TYPE_POSTPONE}. * * <p><b>Note: </b> security updates (e.g. monthly security patches) will <i>not</i> be affected * by this policy. @@ -344,10 +370,9 @@ public final class SystemUpdatePolicy implements Parcelable { } /** - * Returns the type of system update policy. + * Returns the type of system update policy, or -1 if no policy has been set. * - * @return an integer, either one of {@link #TYPE_INSTALL_AUTOMATIC}, - * {@link #TYPE_INSTALL_WINDOWED} and {@link #TYPE_POSTPONE}, or -1 if no policy has been set. + @return The policy type or -1 if the type isn't set. */ @SystemUpdatePolicyType public int getPolicyType() { @@ -423,24 +448,16 @@ public final class SystemUpdatePolicy implements Parcelable { * be blocked and cannot be installed. When the device is outside the freeze periods, the normal * policy behavior will apply. * <p> - * Each freeze period is defined by a starting and finishing date (both inclusive). Since the - * freeze period repeats annually, both of these dates are simply represented by integers - * counting the number of days since year start, similar to {@link LocalDate#getDayOfYear()}. We - * do not consider leap year when handling freeze period so the valid range of the integer is - * always [1,365] (see last section for more details on leap year). If the finishing date is - * smaller than the starting date, the freeze period is considered to be spanning across - * year-end. - * <p> * Each individual freeze period is allowed to be at most 90 days long, and adjacent freeze * periods need to be at least 60 days apart. Also, the list of freeze periods should not * contain duplicates or overlap with each other. If any of these conditions is not met, a * {@link ValidationFailedException} will be thrown. * <p> - * Handling of leap year: we do not consider leap year when handling freeze period, in - * particular, + * Handling of leap year: we ignore leap years in freeze period calculations, in particular, * <ul> - * <li>When a freeze period is defined by the day of year, February 29th does not count as one - * day, so day 59 is February 28th while day 60 is March 1st.</li> + * <li>When a freeze period is defined, February 29th is disregarded so even though a freeze + * period can be specified to start or end on February 29th, it will be treated as if the period + * started or ended on February 28th.</li> * <li>When applying freeze period behavior to the device, a system clock of February 29th is * treated as if it were February 28th</li> * <li>When calculating the number of days of a freeze period or separation between two freeze diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index debc32bd83eb..30f340c50e32 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -387,7 +387,7 @@ public class BackupManager { @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(UserHandle user) { - mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "isBackupServiceActive"); checkServiceBinder(); if (sService != null) { diff --git a/core/java/android/app/usage/EventList.java b/core/java/android/app/usage/EventList.java new file mode 100644 index 000000000000..aaae57e526a0 --- /dev/null +++ b/core/java/android/app/usage/EventList.java @@ -0,0 +1,106 @@ +/* + * 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 android.app.usage; + +import java.util.ArrayList; + +/** + * A container to keep {@link UsageEvents.Event usage events} in non-descending order of their + * {@link UsageEvents.Event#mTimeStamp timestamps}. + * + * @hide + */ +public class EventList { + + private final ArrayList<UsageEvents.Event> mEvents; + + /** + * Create a new event list with default capacity + */ + public EventList() { + mEvents = new ArrayList<>(); + } + + /** + * Returns the size of the list + * @return the number of events in the list + */ + public int size() { + return mEvents.size(); + } + + /** + * Removes all events from the list + */ + public void clear() { + mEvents.clear(); + } + + /** + * Returns the {@link UsageEvents.Event event} at the specified position in this list. + * @param index the index of the event to return, such that {@code 0 <= index < size()} + * @return The {@link UsageEvents.Event event} at position {@code index} + */ + public UsageEvents.Event get(int index) { + return mEvents.get(index); + } + + /** + * Inserts the given {@link UsageEvents.Event event} into the list while keeping the list sorted + * based on the event {@link UsageEvents.Event#mTimeStamp timestamps}. + * + * @param event The event to insert + */ + public void insert(UsageEvents.Event event) { + final int size = mEvents.size(); + // fast case: just append if this is the latest event + if (size == 0 || event.mTimeStamp >= mEvents.get(size - 1).mTimeStamp) { + mEvents.add(event); + return; + } + // To minimize number of elements being shifted, insert at the first occurrence of the next + // greatest timestamp in the list. + final int insertIndex = firstIndexOnOrAfter(event.mTimeStamp + 1); + mEvents.add(insertIndex, event); + } + + /** + * Finds the index of the first event whose timestamp is greater than or equal to the given + * timestamp. + * + * @param timeStamp The timestamp for which to search the list. + * @return The smallest {@code index} for which {@code (get(index).mTimeStamp >= timeStamp)} is + * {@code true}, or {@link #size() size} if no such {@code index} exists. + */ + public int firstIndexOnOrAfter(long timeStamp) { + final int size = mEvents.size(); + int result = size; + int lo = 0; + int hi = size - 1; + while (lo <= hi) { + final int mid = (lo + hi) >>> 1; + final long midTimeStamp = mEvents.get(mid).mTimeStamp; + if (midTimeStamp >= timeStamp) { + hi = mid - 1; + result = mid; + } else { + lo = mid + 1; + } + } + return result; + } +} diff --git a/core/java/android/app/usage/TimeSparseArray.java b/core/java/android/app/usage/TimeSparseArray.java index 4ec0e9e4a1bb..2bd6b2417472 100644 --- a/core/java/android/app/usage/TimeSparseArray.java +++ b/core/java/android/app/usage/TimeSparseArray.java @@ -27,14 +27,12 @@ import android.util.Slog; public class TimeSparseArray<E> extends LongSparseArray<E> { private static final String TAG = TimeSparseArray.class.getSimpleName(); + private boolean mWtfReported; + public TimeSparseArray() { super(); } - public TimeSparseArray(int initialCapacity) { - super(initialCapacity); - } - /** * Finds the index of the first element whose timestamp is greater or equal to * the given time. @@ -75,22 +73,16 @@ public class TimeSparseArray<E> extends LongSparseArray<E> { /** * {@inheritDoc} * - * Overridden to ensure no collisions. The key (time in milliseconds) is incremented till an - * empty place is found. + * <p> As this container is being used only to keep {@link android.util.AtomicFile files}, + * there should not be any collisions. Reporting a {@link Slog#wtf(String, String)} in case that + * happens, as that will lead to one whole file being dropped. */ @Override public void put(long key, E value) { - final long origKey = key; - int keyIndex = indexOfKey(key); - if (keyIndex >= 0) { - final long sz = size(); - while (keyIndex < sz && keyAt(keyIndex) == key) { - key++; - keyIndex++; - } - if (key >= origKey + 100) { - Slog.w(TAG, "Value " + value + " supposed to be inserted at " + origKey - + " displaced to " + key); + if (indexOfKey(key) >= 0) { + if (!mWtfReported) { + Slog.wtf(TAG, "Overwriting value " + get(key) + " by " + value); + mWtfReported = true; } } super.put(key, value); diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java index a05a8ec00e79..83a02285e720 100644 --- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java +++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java @@ -529,14 +529,32 @@ public class SurfaceTextureRenderer { private boolean swapBuffers(EGLSurface surface) throws LegacyExceptionUtils.BufferQueueAbandonedException { boolean result = EGL14.eglSwapBuffers(mEGLDisplay, surface); + int error = EGL14.eglGetError(); - if (error == EGL14.EGL_BAD_SURFACE) { - throw new LegacyExceptionUtils.BufferQueueAbandonedException(); - } else if (error != EGL14.EGL_SUCCESS) { - throw new IllegalStateException("swapBuffers: EGL error: 0x" + - Integer.toHexString(error)); + switch (error) { + case EGL14.EGL_SUCCESS: + return result; + + // Check for an abandoned buffer queue, or other error conditions out + // of the user's control. + // + // From the EGL 1.4 spec (2013-12-04), Section 3.9.4 Posting Errors: + // + // If eglSwapBuffers is called and the native window associated with + // surface is no longer valid, an EGL_BAD_NATIVE_WINDOW error is + // generated. + // + // We also interpret EGL_BAD_SURFACE as indicating an abandoned + // surface, even though the EGL spec does not document it as such, for + // backwards compatibility with older versions of this file. + case EGL14.EGL_BAD_NATIVE_WINDOW: + case EGL14.EGL_BAD_SURFACE: + throw new LegacyExceptionUtils.BufferQueueAbandonedException(); + + default: + throw new IllegalStateException( + "swapBuffers: EGL error: 0x" + Integer.toHexString(error)); } - return result; } private void checkEglError(String msg) { diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java index a61ea50d6f89..d4c3edca4367 100644 --- a/core/java/android/net/IpSecManager.java +++ b/core/java/android/net/IpSecManager.java @@ -26,6 +26,9 @@ import android.content.Context; import android.os.Binder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import android.os.ServiceSpecificException; +import android.system.ErrnoException; +import android.system.OsConstants; import android.util.AndroidException; import android.util.Log; @@ -172,11 +175,16 @@ public final class IpSecManager { public void close() { try { mService.releaseSecurityParameterIndex(mResourceId); - mResourceId = INVALID_RESOURCE_ID; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); + } catch (Exception e) { + // On close we swallow all random exceptions since failure to close is not + // actionable by the user. + Log.e(TAG, "Failed to close " + this + ", Exception=" + e); + } finally { + mResourceId = INVALID_RESOURCE_ID; + mCloseGuard.close(); } - mCloseGuard.close(); } /** Check that the SPI was closed properly. */ @@ -227,7 +235,6 @@ public final class IpSecManager { throw new RuntimeException( "Invalid Resource ID returned by IpSecService: " + status); } - } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -239,6 +246,17 @@ public final class IpSecManager { public int getResourceId() { return mResourceId; } + + @Override + public String toString() { + return new StringBuilder() + .append("SecurityParameterIndex{spi=") + .append(mSpi) + .append(",resourceId=") + .append(mResourceId) + .append("}") + .toString(); + } } /** @@ -261,7 +279,11 @@ public final class IpSecManager { mService, destinationAddress, IpSecManager.INVALID_SECURITY_PARAMETER_INDEX); + } catch (ServiceSpecificException e) { + throw rethrowUncheckedExceptionFromServiceSpecificException(e); } catch (SpiUnavailableException unlikely) { + // Because this function allocates a totally random SPI, it really shouldn't ever + // fail to allocate an SPI; we simply need this because the exception is checked. throw new ResourceUnavailableException("No SPIs available"); } } @@ -274,8 +296,8 @@ public final class IpSecManager { * * @param destinationAddress the destination address for traffic bearing the requested SPI. * For inbound traffic, the destination should be an address currently assigned on-device. - * @param requestedSpi the requested SPI, or '0' to allocate a random SPI. The range 1-255 is - * reserved and may not be used. See RFC 4303 Section 2.1. + * @param requestedSpi the requested SPI. The range 1-255 is reserved and may not be used. See + * RFC 4303 Section 2.1. * @return the reserved SecurityParameterIndex * @throws {@link #ResourceUnavailableException} indicating that too many SPIs are * currently allocated for this user @@ -289,7 +311,11 @@ public final class IpSecManager { if (requestedSpi == IpSecManager.INVALID_SECURITY_PARAMETER_INDEX) { throw new IllegalArgumentException("Requested SPI must be a valid (non-zero) SPI"); } - return new SecurityParameterIndex(mService, destinationAddress, requestedSpi); + try { + return new SecurityParameterIndex(mService, destinationAddress, requestedSpi); + } catch (ServiceSpecificException e) { + throw rethrowUncheckedExceptionFromServiceSpecificException(e); + } } /** @@ -424,6 +450,8 @@ public final class IpSecManager { // constructor takes control and closes the user's FD when we exit the method. try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) { mService.applyTransportModeTransform(pfd, direction, transform.getResourceId()); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -482,6 +510,8 @@ public final class IpSecManager { public void removeTransportModeTransforms(@NonNull FileDescriptor socket) throws IOException { try (ParcelFileDescriptor pfd = ParcelFileDescriptor.dup(socket)) { mService.removeTransportModeTransforms(pfd); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -575,6 +605,13 @@ public final class IpSecManager { mResourceId = INVALID_RESOURCE_ID; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); + } catch (Exception e) { + // On close we swallow all random exceptions since failure to close is not + // actionable by the user. + Log.e(TAG, "Failed to close " + this + ", Exception=" + e); + } finally { + mResourceId = INVALID_RESOURCE_ID; + mCloseGuard.close(); } try { @@ -583,7 +620,6 @@ public final class IpSecManager { Log.e(TAG, "Failed to close UDP Encapsulation Socket with Port= " + mPort); throw e; } - mCloseGuard.close(); } /** Check that the socket was closed properly. */ @@ -600,6 +636,17 @@ public final class IpSecManager { public int getResourceId() { return mResourceId; } + + @Override + public String toString() { + return new StringBuilder() + .append("UdpEncapsulationSocket{port=") + .append(mPort) + .append(",resourceId=") + .append(mResourceId) + .append("}") + .toString(); + } }; /** @@ -627,7 +674,11 @@ public final class IpSecManager { if (port == 0) { throw new IllegalArgumentException("Specified port must be a valid port number!"); } - return new UdpEncapsulationSocket(mService, port); + try { + return new UdpEncapsulationSocket(mService, port); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); + } } /** @@ -650,7 +701,11 @@ public final class IpSecManager { @NonNull public UdpEncapsulationSocket openUdpEncapsulationSocket() throws IOException, ResourceUnavailableException { - return new UdpEncapsulationSocket(mService, 0); + try { + return new UdpEncapsulationSocket(mService, 0); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); + } } /** @@ -696,6 +751,8 @@ public final class IpSecManager { try { mService.addAddressToTunnelInterface( mResourceId, new LinkAddress(address, prefixLen), mOpPackageName); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -715,6 +772,8 @@ public final class IpSecManager { try { mService.removeAddressFromTunnelInterface( mResourceId, new LinkAddress(address, prefixLen), mOpPackageName); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -767,11 +826,16 @@ public final class IpSecManager { public void close() { try { mService.deleteTunnelInterface(mResourceId, mOpPackageName); - mResourceId = INVALID_RESOURCE_ID; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); + } catch (Exception e) { + // On close we swallow all random exceptions since failure to close is not + // actionable by the user. + Log.e(TAG, "Failed to close " + this + ", Exception=" + e); + } finally { + mResourceId = INVALID_RESOURCE_ID; + mCloseGuard.close(); } - mCloseGuard.close(); } /** Check that the Interface was closed properly. */ @@ -788,6 +852,17 @@ public final class IpSecManager { public int getResourceId() { return mResourceId; } + + @Override + public String toString() { + return new StringBuilder() + .append("IpSecTunnelInterface{ifname=") + .append(mInterfaceName) + .append(",resourceId=") + .append(mResourceId) + .append("}") + .toString(); + } } /** @@ -810,8 +885,12 @@ public final class IpSecManager { public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress, @NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork) throws ResourceUnavailableException, IOException { - return new IpSecTunnelInterface( - mContext, mService, localAddress, remoteAddress, underlyingNetwork); + try { + return new IpSecTunnelInterface( + mContext, mService, localAddress, remoteAddress, underlyingNetwork); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); + } } /** @@ -838,6 +917,8 @@ public final class IpSecManager { mService.applyTunnelModeTransform( tunnel.getResourceId(), direction, transform.getResourceId(), mContext.getOpPackageName()); + } catch (ServiceSpecificException e) { + throw rethrowCheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -853,4 +934,44 @@ public final class IpSecManager { mContext = ctx; mService = checkNotNull(service, "missing service"); } + + private static void maybeHandleServiceSpecificException(ServiceSpecificException sse) { + // OsConstants are late binding, so switch statements can't be used. + if (sse.errorCode == OsConstants.EINVAL) { + throw new IllegalArgumentException(sse); + } else if (sse.errorCode == OsConstants.EAGAIN) { + throw new IllegalStateException(sse); + } else if (sse.errorCode == OsConstants.EOPNOTSUPP) { + throw new UnsupportedOperationException(sse); + } + } + + /** + * Convert an Errno SSE to the correct Unchecked exception type. + * + * This method never actually returns. + */ + // package + static RuntimeException + rethrowUncheckedExceptionFromServiceSpecificException(ServiceSpecificException sse) { + maybeHandleServiceSpecificException(sse); + throw new RuntimeException(sse); + } + + /** + * Convert an Errno SSE to the correct Checked or Unchecked exception type. + * + * This method may throw IOException, or it may throw an unchecked exception; it will never + * actually return. + */ + // package + static IOException rethrowCheckedExceptionFromServiceSpecificException( + ServiceSpecificException sse) throws IOException { + // First see if this is an unchecked exception of a type we know. + // If so, then we prefer the unchecked (specific) type of exception. + maybeHandleServiceSpecificException(sse); + // If not, then all we can do is provide the SSE in the form of an IOException. + throw new ErrnoException( + "IpSec encountered errno=" + sse.errorCode, sse.errorCode).rethrowAsIOException(); + } } diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java index 62f79965642f..a12df28eac6b 100644 --- a/core/java/android/net/IpSecTransform.java +++ b/core/java/android/net/IpSecTransform.java @@ -28,6 +28,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.ServiceSpecificException; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -136,6 +137,8 @@ public final class IpSecTransform implements AutoCloseable { mResourceId = result.resourceId; Log.d(TAG, "Added Transform with Id " + mResourceId); mCloseGuard.open("build"); + } catch (ServiceSpecificException e) { + throw IpSecManager.rethrowUncheckedExceptionFromServiceSpecificException(e); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -180,6 +183,10 @@ public final class IpSecTransform implements AutoCloseable { stopNattKeepalive(); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); + } catch (Exception e) { + // On close we swallow all random exceptions since failure to close is not + // actionable by the user. + Log.e(TAG, "Failed to close " + this + ", Exception=" + e); } finally { mResourceId = INVALID_RESOURCE_ID; mCloseGuard.close(); @@ -502,4 +509,13 @@ public final class IpSecTransform implements AutoCloseable { mConfig = new IpSecConfig(); } } + + @Override + public String toString() { + return new StringBuilder() + .append("IpSecTransform{resourceId=") + .append(mResourceId) + .append("}") + .toString(); + } } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index bd4a27c2abf2..227a4cb2c516 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -228,7 +228,7 @@ public class NetworkRequest implements Parcelable { * @param capability The capability to add to unwanted capability list. * @return The builder to facilitate chaining. * - * @removed + * @hide */ public Builder addUnwantedCapability(@NetworkCapabilities.NetCapability int capability) { mNetworkCapabilities.addUnwantedCapability(capability); @@ -436,7 +436,7 @@ public class NetworkRequest implements Parcelable { /** * @see Builder#addUnwantedCapability(int) * - * @removed + * @hide */ public boolean hasUnwantedCapability(@NetCapability int capability) { return networkCapabilities.hasUnwantedCapability(capability); diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java index f5a7433e9739..0fef78d1f4ba 100644 --- a/core/java/android/os/BaseBundle.java +++ b/core/java/android/os/BaseBundle.java @@ -40,8 +40,9 @@ public class BaseBundle { private static final String TAG = "Bundle"; static final boolean DEBUG = false; - // Keep in sync with frameworks/native/libs/binder/PersistableBundle.cpp. - static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L' + // Keep them in sync with frameworks/native/libs/binder/PersistableBundle.cpp. + private static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L' + private static final int BUNDLE_MAGIC_NATIVE = 0x4C444E44; // 'B' 'N' 'D' 'N' /** * Flag indicating that this Bundle is okay to "defuse." That is, it's okay @@ -91,6 +92,11 @@ public class BaseBundle { Parcel mParcelledData = null; /** + * Whether {@link #mParcelledData} was generated by native coed or not. + */ + private boolean mParcelledByNative; + + /** * The ClassLoader used when unparcelling data from mParcelledData. */ private ClassLoader mClassLoader; @@ -223,7 +229,7 @@ public class BaseBundle { synchronized (this) { final Parcel source = mParcelledData; if (source != null) { - initializeFromParcelLocked(source, /*recycleParcel=*/ true); + initializeFromParcelLocked(source, /*recycleParcel=*/ true, mParcelledByNative); } else { if (DEBUG) { Log.d(TAG, "unparcel " @@ -234,7 +240,8 @@ public class BaseBundle { } } - private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean recycleParcel) { + private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean recycleParcel, + boolean parcelledByNative) { if (LOG_DEFUSABLE && sShouldDefuse && (mFlags & FLAG_DEFUSABLE) == 0) { Slog.wtf(TAG, "Attempting to unparcel a Bundle while in transit; this may " + "clobber all data inside!", new Throwable()); @@ -251,6 +258,7 @@ public class BaseBundle { mMap.erase(); } mParcelledData = null; + mParcelledByNative = false; return; } @@ -270,7 +278,15 @@ public class BaseBundle { map.ensureCapacity(count); } try { - parcelledData.readArrayMapInternal(map, count, mClassLoader); + if (parcelledByNative) { + // If it was parcelled by native code, then the array map keys aren't sorted + // by their hash codes, so use the safe (slow) one. + parcelledData.readArrayMapSafelyInternal(map, count, mClassLoader); + } else { + // If parcelled by Java, we know the contents are sorted properly, + // so we can use ArrayMap.append(). + parcelledData.readArrayMapInternal(map, count, mClassLoader); + } } catch (BadParcelableException e) { if (sShouldDefuse) { Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e); @@ -284,6 +300,7 @@ public class BaseBundle { recycleParcel(parcelledData); } mParcelledData = null; + mParcelledByNative = false; } if (DEBUG) { Log.d(TAG, "unparcel " + Integer.toHexString(System.identityHashCode(this)) @@ -403,14 +420,17 @@ public class BaseBundle { if (from.mParcelledData != null) { if (from.isEmptyParcel()) { mParcelledData = NoImagePreloadHolder.EMPTY_PARCEL; + mParcelledByNative = false; } else { mParcelledData = Parcel.obtain(); mParcelledData.appendFrom(from.mParcelledData, 0, from.mParcelledData.dataSize()); mParcelledData.setDataPosition(0); + mParcelledByNative = from.mParcelledByNative; } } else { mParcelledData = null; + mParcelledByNative = false; } if (from.mMap != null) { @@ -1538,7 +1558,7 @@ public class BaseBundle { } else { int length = mParcelledData.dataSize(); parcel.writeInt(length); - parcel.writeInt(BUNDLE_MAGIC); + parcel.writeInt(mParcelledByNative ? BUNDLE_MAGIC_NATIVE : BUNDLE_MAGIC); parcel.appendFrom(mParcelledData, 0, length); } return; @@ -1585,11 +1605,14 @@ public class BaseBundle { } else if (length == 0) { // Empty Bundle or end of data. mParcelledData = NoImagePreloadHolder.EMPTY_PARCEL; + mParcelledByNative = false; return; } final int magic = parcel.readInt(); - if (magic != BUNDLE_MAGIC) { + final boolean isJavaBundle = magic == BUNDLE_MAGIC; + final boolean isNativeBundle = magic == BUNDLE_MAGIC_NATIVE; + if (!isJavaBundle && !isNativeBundle) { throw new IllegalStateException("Bad magic number for Bundle: 0x" + Integer.toHexString(magic)); } @@ -1598,7 +1621,7 @@ public class BaseBundle { // If the parcel has a read-write helper, then we can't lazily-unparcel it, so just // unparcel right away. synchronized (this) { - initializeFromParcelLocked(parcel, /*recycleParcel=*/ false); + initializeFromParcelLocked(parcel, /*recycleParcel=*/ false, isNativeBundle); } return; } @@ -1616,6 +1639,7 @@ public class BaseBundle { p.setDataPosition(0); mParcelledData = p; + mParcelledByNative = isNativeBundle; } /** {@hide} */ diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index e9b48535a34e..4d238c0c7723 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -349,6 +349,26 @@ public abstract class VibrationEffect implements Parcelable { return new OneShot(mDuration, newAmplitude); } + /** + * Resolve default values into integer amplitude numbers. + * + * @param defaultAmplitude the default amplitude to apply, must be between 0 and + * MAX_AMPLITUDE + * @return A {@link OneShot} effect with same physical meaning but explicitly set amplitude + * + * @hide + */ + public OneShot resolve(int defaultAmplitude) { + if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude < 0) { + throw new IllegalArgumentException( + "Amplitude is negative or greater than MAX_AMPLITUDE"); + } + if (mAmplitude == DEFAULT_AMPLITUDE) { + return new OneShot(mDuration, defaultAmplitude); + } + return this; + } + @Override public void validate() { if (mAmplitude < -1 || mAmplitude == 0 || mAmplitude > 255) { @@ -470,6 +490,30 @@ public abstract class VibrationEffect implements Parcelable { return new Waveform(mTimings, scaledAmplitudes, mRepeat); } + /** + * Resolve default values into integer amplitude numbers. + * + * @param defaultAmplitude the default amplitude to apply, must be between 0 and + * MAX_AMPLITUDE + * @return A {@link Waveform} effect with same physical meaning but explicitly set + * amplitude + * + * @hide + */ + public Waveform resolve(int defaultAmplitude) { + if (defaultAmplitude > MAX_AMPLITUDE || defaultAmplitude < 0) { + throw new IllegalArgumentException( + "Amplitude is negative or greater than MAX_AMPLITUDE"); + } + int[] resolvedAmplitudes = Arrays.copyOf(mAmplitudes, mAmplitudes.length); + for (int i = 0; i < resolvedAmplitudes.length; i++) { + if (resolvedAmplitudes[i] == DEFAULT_AMPLITUDE) { + resolvedAmplitudes[i] = defaultAmplitude; + } + } + return new Waveform(mTimings, resolvedAmplitudes, mRepeat); + } + @Override public void validate() { if (mTimings.length != mAmplitudes.length) { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index c5fc06751e0e..fdae19157569 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -86,6 +86,7 @@ import android.util.MemoryIntArray; import android.view.textservice.TextServicesManager; import com.android.internal.annotations.GuardedBy; +import com.android.internal.app.ColorDisplayController; import com.android.internal.widget.ILockSettings; import java.io.IOException; @@ -3147,7 +3148,9 @@ public final class Settings { public static final String DISPLAY_COLOR_MODE = "display_color_mode"; private static final Validator DISPLAY_COLOR_MODE_VALIDATOR = - new SettingsValidators.InclusiveIntegerRangeValidator(0, 2); + new SettingsValidators.InclusiveIntegerRangeValidator( + ColorDisplayController.COLOR_MODE_NATURAL, + ColorDisplayController.COLOR_MODE_AUTOMATIC); /** * The amount of time in milliseconds before the device goes to sleep or begins @@ -10775,6 +10778,8 @@ public final class Settings { * track_cpu_active_cluster_time (boolean) * read_binary_cpu_time (boolean) * proc_state_cpu_times_read_delay_ms (long) + * external_stats_collection_rate_limit_ms (long) + * battery_level_collection_delay_ms (long) * </pre> * * <p> @@ -10795,15 +10800,28 @@ public final class Settings { public static final String SYNC_MANAGER_CONSTANTS = "sync_manager_constants"; /** - * Whether or not App Standby feature is enabled. This controls throttling of apps - * based on usage patterns and predictions. + * Whether or not App Standby feature is enabled by system. This controls throttling of apps + * based on usage patterns and predictions. Platform will turn on this feature if both this + * flag and {@link #ADAPTIVE_BATTERY_MANAGEMENT_ENABLED} is on. * Type: int (0 for false, 1 for true) * Default: 1 * @hide + * @see #ADAPTIVE_BATTERY_MANAGEMENT_ENABLED */ public static final String APP_STANDBY_ENABLED = "app_standby_enabled"; /** + * Whether or not adaptive battery feature is enabled by user. Platform will turn on this + * feature if both this flag and {@link #APP_STANDBY_ENABLED} is on. + * Type: int (0 for false, 1 for true) + * Default: 1 + * @hide + * @see #APP_STANDBY_ENABLED + */ + public static final String ADAPTIVE_BATTERY_MANAGEMENT_ENABLED = + "adaptive_battery_management_enabled"; + + /** * Whether or not app auto restriction is enabled. When it is enabled, settings app will * auto restrict the app if it has bad behavior(e.g. hold wakelock for long time). * diff --git a/core/java/android/service/autofill/BatchUpdates.java b/core/java/android/service/autofill/BatchUpdates.java index 90acc881e171..2ba03762ec29 100644 --- a/core/java/android/service/autofill/BatchUpdates.java +++ b/core/java/android/service/autofill/BatchUpdates.java @@ -82,6 +82,9 @@ public final class BatchUpdates implements Parcelable { * {@link #transformChild(int, Transformation) transformations} are applied to the children * views. * + * <p>Theme does not work with RemoteViews layout. Avoid hardcoded text color + * or background color: Autofill on different platforms may have different themes. + * * @param updates a {@link RemoteViews} with the updated actions to be applied in the * underlying presentation template. * diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java index ccec483d046b..521176797657 100644 --- a/core/java/android/service/autofill/Dataset.java +++ b/core/java/android/service/autofill/Dataset.java @@ -336,6 +336,9 @@ public final class Dataset implements Parcelable { * higher, datasets that require authentication can be also be filtered by passing a * {@link AutofillValue#forText(CharSequence) text value} as the {@code value} parameter. * + * <p>Theme does not work with RemoteViews layout. Avoid hardcoded text color + * or background color: Autofill on different platforms may have different themes. + * * @param id id returned by {@link * android.app.assist.AssistStructure.ViewNode#getAutofillId()}. * @param value the value to be autofilled. Pass {@code null} if you do not have the value diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java index 2bc4b8f7baf2..7bf1f83f6bd8 100644 --- a/core/java/android/service/autofill/FillResponse.java +++ b/core/java/android/service/autofill/FillResponse.java @@ -241,6 +241,9 @@ public final class FillResponse implements Parcelable { * immutable by using {@link android.app.PendingIntent#FLAG_IMMUTABLE} as the * platform needs to fill in the authentication arguments. * + * <p>Theme does not work with RemoteViews layout. Avoid hardcoded text color + * or background color: Autofill on different platforms may have different themes. + * * @param authentication Intent to an activity with your authentication flow. * @param presentation The presentation to visualize the response. * @param ids id of Views that when focused will display the authentication UI. @@ -449,6 +452,9 @@ public final class FillResponse implements Parcelable { * authentication (as the header could have been set directly in the main presentation in * these cases). * + * <p>Theme does not work with RemoteViews layout. Avoid hardcoded text color + * or background color: Autofill on different platforms may have different themes. + * * @param header a presentation to represent the header. This presentation is not clickable * —calling * {@link RemoteViews#setOnClickPendingIntent(int, android.app.PendingIntent)} on it would @@ -477,6 +483,9 @@ public final class FillResponse implements Parcelable { * authentication (as the footer could have been set directly in the main presentation in * these cases). * + * <p>Theme does not work with RemoteViews layout. Avoid hardcoded text color + * or background color: Autofill on different platforms may have different themes. + * * @param footer a presentation to represent the footer. This presentation is not clickable * —calling * {@link RemoteViews#setOnClickPendingIntent(int, android.app.PendingIntent)} on it would diff --git a/core/java/android/util/apk/ApkSigningBlockUtils.java b/core/java/android/util/apk/ApkSigningBlockUtils.java index 1c67434b2609..e247c87fdb4c 100644 --- a/core/java/android/util/apk/ApkSigningBlockUtils.java +++ b/core/java/android/util/apk/ApkSigningBlockUtils.java @@ -92,6 +92,8 @@ final class ApkSigningBlockUtils { throw new SecurityException("No digests provided"); } + boolean neverVerified = true; + Map<Integer, byte[]> expected1MbChunkDigests = new ArrayMap<>(); if (expectedDigests.containsKey(CONTENT_DIGEST_CHUNKED_SHA256)) { expected1MbChunkDigests.put(CONTENT_DIGEST_CHUNKED_SHA256, @@ -101,18 +103,23 @@ final class ApkSigningBlockUtils { expected1MbChunkDigests.put(CONTENT_DIGEST_CHUNKED_SHA512, expectedDigests.get(CONTENT_DIGEST_CHUNKED_SHA512)); } - - if (expectedDigests.containsKey(CONTENT_DIGEST_VERITY_CHUNKED_SHA256)) { - verifyIntegrityForVerityBasedAlgorithm( - expectedDigests.get(CONTENT_DIGEST_VERITY_CHUNKED_SHA256), apk, signatureInfo); - } else if (!expected1MbChunkDigests.isEmpty()) { + if (!expected1MbChunkDigests.isEmpty()) { try { verifyIntegrityFor1MbChunkBasedAlgorithm(expected1MbChunkDigests, apk.getFD(), signatureInfo); + neverVerified = false; } catch (IOException e) { throw new SecurityException("Cannot get FD", e); } - } else { + } + + if (expectedDigests.containsKey(CONTENT_DIGEST_VERITY_CHUNKED_SHA256)) { + verifyIntegrityForVerityBasedAlgorithm( + expectedDigests.get(CONTENT_DIGEST_VERITY_CHUNKED_SHA256), apk, signatureInfo); + neverVerified = false; + } + + if (neverVerified) { throw new SecurityException("No known digest exists for integrity check"); } } diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl index c0b40c8ceb3b..94b9bc099d56 100644 --- a/core/java/android/view/IRecentsAnimationController.aidl +++ b/core/java/android/view/IRecentsAnimationController.aidl @@ -64,4 +64,9 @@ interface IRecentsAnimationController { * Informs the system that the primary split-screen stack should be minimized. */ void setSplitScreenMinimized(boolean minimized); + + /** + * Hides the current input method if one is showing. + */ + void hideCurrentInputMethod(); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 19ead600e2dc..4bd6fc8b665f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3272,7 +3272,8 @@ public final class ViewRootImpl implements ViewParent, // eglTerminate() for instance. if (mAttachInfo.mThreadedRenderer != null && !mAttachInfo.mThreadedRenderer.isEnabled() && - mAttachInfo.mThreadedRenderer.isRequested()) { + mAttachInfo.mThreadedRenderer.isRequested() && + mSurface.isValid()) { try { mAttachInfo.mThreadedRenderer.initializeIfNeeded( diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 03f1c1243755..1c2e43e1a562 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -2413,11 +2413,16 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Returns whether node represents a heading. + * <p><strong>Note:</strong> Returns {@code true} if either {@link #setHeading(boolean)} + * marks this node as a heading or if the node has a {@link CollectionItemInfo} that marks + * it as such, to accomodate apps that use the now-deprecated API.</p> * * @return {@code true} if the node is a heading, {@code false} otherwise. */ public boolean isHeading() { - return getBooleanProperty(BOOLEAN_PROPERTY_IS_HEADING); + if (getBooleanProperty(BOOLEAN_PROPERTY_IS_HEADING)) return true; + CollectionItemInfo itemInfo = getCollectionItemInfo(); + return ((itemInfo != null) && itemInfo.mHeading); } /** @@ -3437,6 +3442,7 @@ public class AccessibilityNodeInfo implements Parcelable { mPackageName = other.mPackageName; mClassName = other.mClassName; mText = other.mText; + mOriginalText = other.mOriginalText; mHintText = other.mHintText; mError = other.mError; mContentDescription = other.mContentDescription; diff --git a/core/java/android/view/autofill/AutofillPopupWindow.java b/core/java/android/view/autofill/AutofillPopupWindow.java index a6495d154941..826620710b18 100644 --- a/core/java/android/view/autofill/AutofillPopupWindow.java +++ b/core/java/android/view/autofill/AutofillPopupWindow.java @@ -19,6 +19,7 @@ package android.view.autofill; import static android.view.autofill.Helper.sVerbose; import android.annotation.NonNull; +import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.IBinder; @@ -79,11 +80,6 @@ public class AutofillPopupWindow extends PopupWindow { public AutofillPopupWindow(@NonNull IAutofillWindowPresenter presenter) { mWindowPresenter = new WindowPresenter(presenter); - // We want to show the window as system controlled one so it covers app windows, but it has - // to be an application type (so it's contained inside the application area). - // Hence, we set it to the application type with the highest z-order, which currently - // is TYPE_APPLICATION_ABOVE_SUB_PANEL. - setWindowLayoutType(WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL); setTouchModal(false); setOutsideTouchable(true); setInputMethodMode(INPUT_METHOD_NOT_NEEDED); @@ -110,7 +106,16 @@ public class AutofillPopupWindow extends PopupWindow { */ public void update(View anchor, int offsetX, int offsetY, int width, int height, Rect virtualBounds) { - mFullScreen = width == LayoutParams.MATCH_PARENT && height == LayoutParams.MATCH_PARENT; + mFullScreen = width == LayoutParams.MATCH_PARENT; + // For no fullscreen autofill window, we want to show the window as system controlled one + // so it covers app windows, but it has to be an application type (so it's contained inside + // the application area). Hence, we set it to the application type with the highest z-order, + // which currently is TYPE_APPLICATION_ABOVE_SUB_PANEL. + // For fullscreen mode, autofill window is at the bottom of screen, it should not be + // clipped by app activity window. Fullscreen autofill window does not need to follow app + // anchor view position. + setWindowLayoutType(mFullScreen ? WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG + : WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL); // If we are showing the popup for a virtual view we use a fake view which // delegates to the anchor but present itself with the same bounds as the // virtual view. This ensures that the location logic in popup works @@ -119,6 +124,15 @@ public class AutofillPopupWindow extends PopupWindow { if (mFullScreen) { offsetX = 0; offsetY = 0; + // If it is not fullscreen height, put window at bottom. Computes absolute position. + // Note that we cannot easily change default gravity from Gravity.TOP to + // Gravity.BOTTOM because PopupWindow base class does not expose computeGravity(). + final Point outPoint = new Point(); + anchor.getContext().getDisplay().getSize(outPoint); + width = outPoint.x; + if (height != LayoutParams.MATCH_PARENT) { + offsetY = outPoint.y - height; + } actualAnchor = anchor; } else if (virtualBounds != null) { final int[] mLocationOnScreen = new int[] {virtualBounds.left, virtualBounds.top}; @@ -202,6 +216,16 @@ public class AutofillPopupWindow extends PopupWindow { actualAnchor = anchor; } + if (!mFullScreen) { + // No fullscreen window animation is controlled by PopupWindow. + setAnimationStyle(-1); + } else if (height == LayoutParams.MATCH_PARENT) { + // Complete fullscreen autofill window has no animation. + setAnimationStyle(0); + } else { + // Slide half screen height autofill window from bottom. + setAnimationStyle(com.android.internal.R.style.AutofillHalfScreenAnimation); + } if (!isShowing()) { setWidth(width); setHeight(height); @@ -223,7 +247,12 @@ public class AutofillPopupWindow extends PopupWindow { protected boolean findDropDownPosition(View anchor, LayoutParams outParams, int xOffset, int yOffset, int width, int height, int gravity, boolean allowScroll) { if (mFullScreen) { - // Do not patch LayoutParams if force full screen + // In fullscreen mode, don't need consider the anchor view. + outParams.x = xOffset; + outParams.y = yOffset; + outParams.width = width; + outParams.height = height; + outParams.gravity = gravity; return false; } return super.findDropDownPosition(anchor, outParams, xOffset, yOffset, @@ -316,11 +345,6 @@ public class AutofillPopupWindow extends PopupWindow { } @Override - public void setAnimationStyle(int animationStyle) { - throw new IllegalStateException("You can't call this!"); - } - - @Override public void setBackgroundDrawable(Drawable background) { throw new IllegalStateException("You can't call this!"); } diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java index 490c389037e5..da86b559c5db 100644 --- a/core/java/android/view/textclassifier/SystemTextClassifier.java +++ b/core/java/android/view/textclassifier/SystemTextClassifier.java @@ -55,7 +55,8 @@ public final class SystemTextClassifier implements TextClassifier { mManagerService = ITextClassifierService.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.TEXT_CLASSIFICATION_SERVICE)); mSettings = Preconditions.checkNotNull(settings); - mFallback = new TextClassifierImpl(context, settings); + mFallback = context.getSystemService(TextClassificationManager.class) + .getTextClassifier(TextClassifier.LOCAL); mPackageName = Preconditions.checkNotNull(context.getPackageName()); } diff --git a/core/java/android/view/textclassifier/TextClassificationManager.java b/core/java/android/view/textclassifier/TextClassificationManager.java index 262d9b852b82..1737861ee716 100644 --- a/core/java/android/view/textclassifier/TextClassificationManager.java +++ b/core/java/android/view/textclassifier/TextClassificationManager.java @@ -191,10 +191,11 @@ public final class TextClassificationManager { synchronized (mLock) { if (mLocalTextClassifier == null) { if (mSettings.isLocalTextClassifierEnabled()) { - mLocalTextClassifier = new TextClassifierImpl(mContext, mSettings); + mLocalTextClassifier = + new TextClassifierImpl(mContext, mSettings, TextClassifier.NO_OP); } else { Log.d(LOG_TAG, "Local TextClassifier disabled"); - mLocalTextClassifier = TextClassifierImpl.NO_OP; + mLocalTextClassifier = TextClassifier.NO_OP; } } return mLocalTextClassifier; diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 910fcaace159..2cf265d58b74 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -21,6 +21,7 @@ import static java.time.temporal.ChronoUnit.MILLIS; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.WorkerThread; +import android.app.PendingIntent; import android.app.RemoteAction; import android.app.SearchManager; import android.content.ComponentName; @@ -98,13 +99,18 @@ public final class TextClassifierImpl implements TextClassifier { private final TextClassificationConstants mSettings; - public TextClassifierImpl(Context context, TextClassificationConstants settings) { + public TextClassifierImpl( + Context context, TextClassificationConstants settings, TextClassifier fallback) { mContext = Preconditions.checkNotNull(context); - mFallback = TextClassifier.NO_OP; + mFallback = Preconditions.checkNotNull(fallback); mSettings = Preconditions.checkNotNull(settings); mGenerateLinksLogger = new GenerateLinksLogger(mSettings.getGenerateLinksLogSampleRate()); } + public TextClassifierImpl(Context context, TextClassificationConstants settings) { + this(context, settings, TextClassifier.NO_OP); + } + /** @inheritDoc */ @Override @WorkerThread @@ -413,6 +419,9 @@ public final class TextClassifierImpl implements TextClassifier { for (LabeledIntent labeledIntent : IntentFactory.create( mContext, referenceTime, highestScoringResult, classifiedText)) { final RemoteAction action = labeledIntent.asRemoteAction(mContext); + if (action == null) { + continue; + } if (isPrimaryAction) { // For O backwards compatibility, the first RemoteAction is also written to the // legacy API fields. @@ -601,6 +610,7 @@ public final class TextClassifierImpl implements TextClassifier { return mRequestCode; } + @Nullable RemoteAction asRemoteAction(Context context) { final PackageManager pm = context.getPackageManager(); final ResolveInfo resolveInfo = pm.resolveActivity(mIntent, 0); @@ -622,8 +632,12 @@ public final class TextClassifierImpl implements TextClassifier { icon = Icon.createWithResource("android", com.android.internal.R.drawable.ic_more_items); } - final RemoteAction action = new RemoteAction(icon, mTitle, mDescription, - TextClassification.createPendingIntent(context, mIntent, mRequestCode)); + final PendingIntent pendingIntent = + TextClassification.createPendingIntent(context, mIntent, mRequestCode); + if (pendingIntent == null) { + return null; + } + final RemoteAction action = new RemoteAction(icon, mTitle, mDescription, pendingIntent); action.setShouldShowIcon(shouldShowIcon); return action; } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index f6ac1cc84f43..10de4497c05c 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -123,6 +123,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; import com.android.internal.util.GrowingArrayUtils; import com.android.internal.util.Preconditions; +import com.android.internal.view.FloatingActionMode; import com.android.internal.widget.EditableInputConnection; import java.lang.annotation.Retention; @@ -2215,6 +2216,15 @@ public class Editor { ActionMode.Callback actionModeCallback = new TextActionModeCallback(actionMode); mTextActionMode = mTextView.startActionMode(actionModeCallback, ActionMode.TYPE_FLOATING); + final boolean selectableText = mTextView.isTextEditable() || mTextView.isTextSelectable(); + if (actionMode == TextActionMode.TEXT_LINK && !selectableText + && mTextActionMode instanceof FloatingActionMode) { + // Make the toolbar outside-touchable so that it can be dismissed when the user clicks + // outside of it. + ((FloatingActionMode) mTextActionMode).setOutsideTouchable(true, + () -> stopTextActionMode()); + } + final boolean selectionStarted = mTextActionMode != null; if (selectionStarted && mTextView.isTextEditable() && !mTextView.isTextSelectable() diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index cb362e65911d..f1a1457e9d5c 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -170,7 +170,7 @@ public final class Magnifier { if (mWindow == null) { synchronized (mLock) { mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(), - getValidViewSurface(), + getValidParentSurfaceForMagnifier(), mWindowWidth, mWindowHeight, mWindowElevation, mWindowCornerRadius, Handler.getMain() /* draw the magnifier on the UI thread */, mLock, mCallback); @@ -245,18 +245,20 @@ public final class Magnifier { } @Nullable - private Surface getValidViewSurface() { - // TODO: deduplicate this against the first part of #performPixelCopy - final Surface surface; + private Surface getValidParentSurfaceForMagnifier() { + if (mView.getViewRootImpl() != null) { + final Surface mainWindowSurface = mView.getViewRootImpl().mSurface; + if (mainWindowSurface != null && mainWindowSurface.isValid()) { + return mainWindowSurface; + } + } if (mView instanceof SurfaceView) { - surface = ((SurfaceView) mView).getHolder().getSurface(); - } else if (mView.getViewRootImpl() != null) { - surface = mView.getViewRootImpl().mSurface; - } else { - surface = null; + final Surface surfaceViewSurface = ((SurfaceView) mView).getHolder().getSurface(); + if (surfaceViewSurface != null && surfaceViewSurface.isValid()) { + return surfaceViewSurface; + } } - - return (surface != null && surface.isValid()) ? surface : null; + return null; } private void configureCoordinates(final float xPosInView, final float yPosInView) { @@ -264,12 +266,12 @@ public final class Magnifier { // magnifier. These are relative to the surface the content is copied from. final float posX; final float posY; + mView.getLocationInSurface(mViewCoordinatesInSurface); if (mView instanceof SurfaceView) { // No offset required if the backing Surface matches the size of the SurfaceView. posX = xPosInView; posY = yPosInView; } else { - mView.getLocationInSurface(mViewCoordinatesInSurface); posX = xPosInView + mViewCoordinatesInSurface[0]; posY = yPosInView + mViewCoordinatesInSurface[1]; } @@ -282,6 +284,14 @@ public final class Magnifier { R.dimen.magnifier_offset); mWindowCoords.x = mCenterZoomCoords.x - mWindowWidth / 2; mWindowCoords.y = mCenterZoomCoords.y - mWindowHeight / 2 - verticalOffset; + if (mView instanceof SurfaceView && mView.getViewRootImpl() != null) { + // TODO: deduplicate against the first part of #getValidParentSurfaceForMagnifier() + final Surface mainWindowSurface = mView.getViewRootImpl().mSurface; + if (mainWindowSurface != null && mainWindowSurface.isValid()) { + mWindowCoords.x += mViewCoordinatesInSurface[0]; + mWindowCoords.y += mViewCoordinatesInSurface[1]; + } + } } private void performPixelCopy(final int startXInSurface, final int startYInSurface, @@ -361,6 +371,9 @@ public final class Magnifier { // The alpha set on the magnifier's content, which defines how // prominent the white background is. private static final int CONTENT_BITMAP_ALPHA = 242; + // The z of the magnifier surface, defining its z order in the list of + // siblings having the same parent surface (usually the main app surface). + private static final int SURFACE_Z = 5; // Display associated to the view the magnifier is attached to. private final Display mDisplay; @@ -602,6 +615,7 @@ public final class Magnifier { mSurfaceControl.setPosition(pendingX, pendingY); } if (firstDraw) { + mSurfaceControl.setLayer(SURFACE_Z); mSurfaceControl.show(); } SurfaceControl.closeTransaction(); diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index b6bd14ed5efd..4865dab6056a 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.ColorInt; import android.annotation.DimenRes; import android.annotation.NonNull; +import android.annotation.StyleRes; import android.app.ActivityOptions; import android.app.ActivityThread; import android.app.Application; @@ -56,6 +57,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.LayoutInflater.Filter; import android.view.RemotableViewMethod; @@ -182,6 +184,12 @@ public class RemoteViews implements Parcelable, Filter { private boolean mIsRoot = true; /** + * Optional theme resource id applied in inflateView(). When 0, Theme.DeviceDefault will be + * used. + */ + private int mApplyThemeResId; + + /** * Whether reapply is disallowed on this remoteview. This maybe be true if some actions modify * the layout in a way that isn't recoverable, since views are being removed. */ @@ -946,6 +954,7 @@ public class RemoteViews implements Parcelable, Filter { } }; } + target.setTagInternal(R.id.pending_intent_tag, pendingIntent); target.setOnClickListener(listener); } @@ -1999,6 +2008,7 @@ public class RemoteViews implements Parcelable, Filter { /** Set width */ public static final int LAYOUT_WIDTH = 2; public static final int LAYOUT_MARGIN_BOTTOM_DIMEN = 3; + public static final int LAYOUT_MARGIN_END = 4; final int mProperty; final int mValue; @@ -2036,11 +2046,14 @@ public class RemoteViews implements Parcelable, Filter { if (layoutParams == null) { return; } + int value = mValue; switch (mProperty) { case LAYOUT_MARGIN_END_DIMEN: + value = resolveDimenPixelOffset(target, mValue); + // fall-through + case LAYOUT_MARGIN_END: if (layoutParams instanceof ViewGroup.MarginLayoutParams) { - int resolved = resolveDimenPixelOffset(target, mValue); - ((ViewGroup.MarginLayoutParams) layoutParams).setMarginEnd(resolved); + ((ViewGroup.MarginLayoutParams) layoutParams).setMarginEnd(value); target.setLayoutParams(layoutParams); } break; @@ -2980,6 +2993,20 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Equivalent to calling {@link android.view.ViewGroup.MarginLayoutParams#setMarginEnd(int)}. + * Only works if the {@link View#getLayoutParams()} supports margins. + * Hidden for now since we don't want to support this for all different layout margins yet. + * + * @param viewId The id of the view to change + * @param endMargin a value in pixels for the end margin. + * @hide + */ + public void setViewLayoutMarginEnd(int viewId, @DimenRes int endMargin) { + addAction(new LayoutParamAction(viewId, LayoutParamAction.LAYOUT_MARGIN_END, + endMargin)); + } + + /** * Equivalent to setting {@link android.view.ViewGroup.MarginLayoutParams#bottomMargin}. * * @param bottomMarginDimen a dimen resource to read the margin from or 0 to clear the margin. @@ -3248,6 +3275,14 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Set the theme used in apply() and applyASync(). + * @hide + */ + public void setApplyTheme(@StyleRes int themeResId) { + mApplyThemeResId = themeResId; + } + + /** * Inflates the view hierarchy represented by this object and applies * all of the actions. * @@ -3282,6 +3317,10 @@ public class RemoteViews implements Parcelable, Filter { final Context contextForResources = getContextForResources(context); Context inflationContext = new RemoteViewsContextWrapper(context, contextForResources); + // If mApplyThemeResId is not given, Theme.DeviceDefault will be used. + if (mApplyThemeResId != 0) { + inflationContext = new ContextThemeWrapper(inflationContext, mApplyThemeResId); + } LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index 1b9055ce33ab..6cc86b9b871c 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -28,7 +28,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; -import android.graphics.Region; import android.graphics.TableMaskFilter; import android.os.Bundle; import android.util.AttributeSet; @@ -550,8 +549,8 @@ public class StackView extends AdapterViewAnimator { // We only expand the clip bounds if necessary. if (expandClipRegion) { - canvas.save(Canvas.CLIP_SAVE_FLAG); - canvas.clipRect(stackInvalidateRect, Region.Op.UNION); + canvas.save(); + canvas.clipRectUnion(stackInvalidateRect); super.dispatchDraw(canvas); canvas.restore(); } else { diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java index 46cb5461b682..732172111b80 100644 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -30,7 +30,10 @@ import android.database.Cursor; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; +import android.text.Layout; import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.method.MovementMethod; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; @@ -101,6 +104,9 @@ public class AlertController { private ImageView mIconView; private TextView mTitleView; protected TextView mMessageView; + private MovementMethod mMessageMovementMethod; + @Layout.HyphenationFrequency + private Integer mMessageHyphenationFrequency; private View mCustomTitleView; private boolean mForceInverseBackground; @@ -290,6 +296,21 @@ public class AlertController { } } + public void setMessageMovementMethod(MovementMethod movementMethod) { + mMessageMovementMethod = movementMethod; + if (mMessageView != null) { + mMessageView.setMovementMethod(movementMethod); + } + } + + public void setMessageHyphenationFrequency( + @Layout.HyphenationFrequency int hyphenationFrequency) { + mMessageHyphenationFrequency = hyphenationFrequency; + if (mMessageView != null) { + mMessageView.setHyphenationFrequency(hyphenationFrequency); + } + } + /** * Set the view resource to display in the dialog. */ @@ -676,6 +697,12 @@ public class AlertController { if (mMessage != null) { mMessageView.setText(mMessage); + if (mMessageMovementMethod != null) { + mMessageView.setMovementMethod(mMessageMovementMethod); + } + if (mMessageHyphenationFrequency != null) { + mMessageView.setHyphenationFrequency(mMessageHyphenationFrequency); + } } else { mMessageView.setVisibility(View.GONE); mScrollView.removeView(mMessageView); diff --git a/core/java/com/android/internal/app/ColorDisplayController.java b/core/java/com/android/internal/app/ColorDisplayController.java index f1539eeb1260..6cc964bf16ed 100644 --- a/core/java/com/android/internal/app/ColorDisplayController.java +++ b/core/java/com/android/internal/app/ColorDisplayController.java @@ -82,7 +82,7 @@ public final class ColorDisplayController { public static final int AUTO_MODE_TWILIGHT = 2; @Retention(RetentionPolicy.SOURCE) - @IntDef({ COLOR_MODE_NATURAL, COLOR_MODE_BOOSTED, COLOR_MODE_SATURATED }) + @IntDef({ COLOR_MODE_NATURAL, COLOR_MODE_BOOSTED, COLOR_MODE_SATURATED, COLOR_MODE_AUTOMATIC }) public @interface ColorMode {} /** @@ -103,12 +103,12 @@ public final class ColorDisplayController { * @see #setColorMode(int) */ public static final int COLOR_MODE_SATURATED = 2; - /** - * See com.android.server.display.DisplayTransformManager. + * Color mode with automatic colors. + * + * @see #setColorMode(int) */ - private static final String PERSISTENT_PROPERTY_SATURATION = "persist.sys.sf.color_saturation"; - private static final String PERSISTENT_PROPERTY_NATIVE_MODE = "persist.sys.sf.native_mode"; + public static final int COLOR_MODE_AUTOMATIC = 3; private final Context mContext; private final int mUserId; @@ -362,6 +362,41 @@ public final class ColorDisplayController { } /** + * Get the current color mode from system properties, or return -1. + * + * See com.android.server.display.DisplayTransformManager. + */ + private @ColorMode int getCurrentColorModeFromSystemProperties() { + int displayColorSetting = SystemProperties.getInt("persist.sys.sf.native_mode", 0); + if (displayColorSetting == 0) { + return "1.0".equals(SystemProperties.get("persist.sys.sf.color_saturation")) + ? COLOR_MODE_NATURAL : COLOR_MODE_BOOSTED; + } else if (displayColorSetting == 1) { + return COLOR_MODE_SATURATED; + } else if (displayColorSetting == 2) { + return COLOR_MODE_AUTOMATIC; + } else { + return -1; + } + } + + private boolean isColorModeAvailable(@ColorMode int colorMode) { + // SATURATED is always allowed + if (colorMode == COLOR_MODE_SATURATED) { + return true; + } + + final int[] availableColorModes = mContext.getResources().getIntArray( + R.array.config_availableColorModes); + for (int mode : availableColorModes) { + if (mode == colorMode) { + return true; + } + } + return false; + } + + /** * Get the current color mode. */ public int getColorMode() { @@ -369,17 +404,27 @@ public final class ColorDisplayController { return COLOR_MODE_SATURATED; } - final int colorMode = System.getIntForUser(mContext.getContentResolver(), + int colorMode = System.getIntForUser(mContext.getContentResolver(), System.DISPLAY_COLOR_MODE, -1, mUserId); - if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) { + if (colorMode == -1) { // There still might be a legacy system property controlling color mode that we need to // respect. - if ("1".equals(SystemProperties.get(PERSISTENT_PROPERTY_NATIVE_MODE))) { - return COLOR_MODE_SATURATED; + colorMode = getCurrentColorModeFromSystemProperties(); + } + + // This happens when a color mode is no longer available (e.g., after system update or B&R) + // or the device does not support any color mode. + if (!isColorModeAvailable(colorMode)) { + if (colorMode == COLOR_MODE_BOOSTED && isColorModeAvailable(COLOR_MODE_NATURAL)) { + colorMode = COLOR_MODE_NATURAL; + } else if (colorMode == COLOR_MODE_SATURATED + && isColorModeAvailable(COLOR_MODE_AUTOMATIC)) { + colorMode = COLOR_MODE_AUTOMATIC; + } else { + colorMode = COLOR_MODE_SATURATED; } - return "1.0".equals(SystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) - ? COLOR_MODE_NATURAL : COLOR_MODE_BOOSTED; } + return colorMode; } @@ -389,7 +434,7 @@ public final class ColorDisplayController { * @param colorMode the color mode */ public void setColorMode(@ColorMode int colorMode) { - if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) { + if (!isColorModeAvailable(colorMode)) { throw new IllegalArgumentException("Invalid colorMode: " + colorMode); } System.putIntForUser(mContext.getContentResolver(), System.DISPLAY_COLOR_MODE, colorMode, diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 5da3874dbcec..be834987e73f 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -196,6 +196,7 @@ public class BatteryStatsImpl extends BatteryStats { static final int MSG_REPORT_CPU_UPDATE_NEEDED = 1; static final int MSG_REPORT_POWER_CHANGE = 2; static final int MSG_REPORT_CHARGING = 3; + static final int MSG_REPORT_RESET_STATS = 4; static final long DELAY_UPDATE_WAKELOCKS = 5*1000; private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); @@ -319,6 +320,7 @@ public class BatteryStatsImpl extends BatteryStats { public void batteryNeedsCpuUpdate(); public void batteryPowerChanged(boolean onBattery); public void batterySendBroadcast(Intent intent); + public void batteryStatsReset(); } public interface PlatformIdleStateCallback { @@ -373,7 +375,11 @@ public class BatteryStatsImpl extends BatteryStats { cb.batterySendBroadcast(intent); } break; - } + case MSG_REPORT_RESET_STATS: + if (cb != null) { + cb.batteryStatsReset(); + } + } } } @@ -579,6 +585,7 @@ public class BatteryStatsImpl extends BatteryStats { boolean onBatteryScreenOff); Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis); void cancelCpuSyncDueToWakelockChange(); + Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis); } public Handler mHandler; @@ -10939,6 +10946,7 @@ public class BatteryStatsImpl extends BatteryStats { initDischarge(); clearHistoryLocked(); + mHandler.sendEmptyMessage(MSG_REPORT_RESET_STATS); } private void initActiveHistoryEventsLocked(long elapsedRealtimeMs, long uptimeMs) { @@ -12607,7 +12615,8 @@ public class BatteryStatsImpl extends BatteryStats { // TODO(adamlesinski): Schedule the creation of a HistoryStepDetails record // which will pull external stats. - scheduleSyncExternalStatsLocked("battery-level", ExternalStatsSync.UPDATE_ALL); + mExternalSync.scheduleSyncDueToBatteryLevelChange( + mConstants.BATTERY_LEVEL_COLLECTION_DELAY_MS); } if (mHistoryCur.batteryStatus != status) { mHistoryCur.batteryStatus = (byte)status; @@ -13261,18 +13270,28 @@ public class BatteryStatsImpl extends BatteryStats { = "kernel_uid_readers_throttle_time"; public static final String KEY_UID_REMOVE_DELAY_MS = "uid_remove_delay_ms"; + public static final String KEY_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS + = "external_stats_collection_rate_limit_ms"; + public static final String KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS + = "battery_level_collection_delay_ms"; private static final boolean DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE = true; private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true; private static final long DEFAULT_PROC_STATE_CPU_TIMES_READ_DELAY_MS = 5_000; private static final long DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME = 10_000; private static final long DEFAULT_UID_REMOVE_DELAY_MS = 5L * 60L * 1000L; + private static final long DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS = 600_000; + private static final long DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS = 300_000; public boolean TRACK_CPU_TIMES_BY_PROC_STATE = DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE; public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME; public long PROC_STATE_CPU_TIMES_READ_DELAY_MS = DEFAULT_PROC_STATE_CPU_TIMES_READ_DELAY_MS; public long KERNEL_UID_READERS_THROTTLE_TIME = DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME; public long UID_REMOVE_DELAY_MS = DEFAULT_UID_REMOVE_DELAY_MS; + public long EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS + = DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS; + public long BATTERY_LEVEL_COLLECTION_DELAY_MS + = DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS; private ContentResolver mResolver; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -13318,6 +13337,12 @@ public class BatteryStatsImpl extends BatteryStats { DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME)); updateUidRemoveDelay( mParser.getLong(KEY_UID_REMOVE_DELAY_MS, DEFAULT_UID_REMOVE_DELAY_MS)); + EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS = mParser.getLong( + KEY_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS, + DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS); + BATTERY_LEVEL_COLLECTION_DELAY_MS = mParser.getLong( + KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS, + DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS); } } @@ -13367,6 +13392,16 @@ public class BatteryStatsImpl extends BatteryStats { pw.println(PROC_STATE_CPU_TIMES_READ_DELAY_MS); pw.print(KEY_KERNEL_UID_READERS_THROTTLE_TIME); pw.print("="); pw.println(KERNEL_UID_READERS_THROTTLE_TIME); + pw.print(KEY_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS); pw.print("="); + pw.println(EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS); + pw.print(KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS); pw.print("="); + pw.println(BATTERY_LEVEL_COLLECTION_DELAY_MS); + } + } + + public long getExternalStatsCollectionRateLimitMs() { + synchronized (this) { + return mConstants.EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS; } } diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java index 7eefe59d4696..3315cb15d4b4 100644 --- a/core/java/com/android/internal/os/BinderCallsStats.java +++ b/core/java/com/android/internal/os/BinderCallsStats.java @@ -18,6 +18,7 @@ package com.android.internal.os; import android.os.Binder; import android.os.SystemClock; +import android.text.format.DateFormat; import android.util.ArrayMap; import android.util.SparseArray; @@ -46,6 +47,7 @@ public class BinderCallsStats { private final SparseArray<UidEntry> mUidEntries = new SparseArray<>(); private final Queue<CallSession> mCallSessionsPool = new ConcurrentLinkedQueue<>(); private final Object mLock = new Object(); + private long mStartTime = System.currentTimeMillis(); private BinderCallsStats() { } @@ -108,6 +110,8 @@ public class BinderCallsStats { Map<Integer, Long> uidCallCountMap = new HashMap<>(); long totalCallsCount = 0; long totalCallsTime = 0; + pw.print("Start time: "); + pw.println(DateFormat.format("yyyy-MM-dd HH:mm:ss", mStartTime)); int uidEntriesSize = mUidEntries.size(); List<UidEntry> entries = new ArrayList<>(); synchronized (mLock) { @@ -126,8 +130,7 @@ public class BinderCallsStats { } } if (mDetailedTracking) { - pw.println("Binder call stats:"); - pw.println(" Raw data (uid,call_desc,time):"); + pw.println("Raw data (uid,call_desc,time):"); entries.sort((o1, o2) -> { if (o1.time < o2.time) { return 1; @@ -155,12 +158,12 @@ public class BinderCallsStats { } } pw.println(); - pw.println(" Per UID Summary(UID: time, % of total_time, calls_count):"); + pw.println("Per UID Summary(UID: time, % of total_time, calls_count):"); List<Map.Entry<Integer, Long>> uidTotals = new ArrayList<>(uidTimeMap.entrySet()); uidTotals.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue())); for (Map.Entry<Integer, Long> uidTotal : uidTotals) { Long callCount = uidCallCountMap.get(uidTotal.getKey()); - pw.println(String.format(" %7d: %11d %3.0f%% %8d", + pw.println(String.format(" %7d: %11d %3.0f%% %8d", uidTotal.getKey(), uidTotal.getValue(), 100d * uidTotal.getValue() / totalCallsTime, callCount)); } @@ -170,7 +173,7 @@ public class BinderCallsStats { totalCallsTime, totalCallsCount, (double)totalCallsTime / totalCallsCount)); } else { - pw.println(" Per UID Summary(UID: calls_count, % of total calls_count):"); + pw.println("Per UID Summary(UID: calls_count, % of total calls_count):"); List<Map.Entry<Integer, Long>> uidTotals = new ArrayList<>(uidTimeMap.entrySet()); uidTotals.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue())); for (Map.Entry<Integer, Long> uidTotal : uidTotals) { @@ -201,6 +204,7 @@ public class BinderCallsStats { public void reset() { synchronized (mLock) { mUidEntries.clear(); + mStartTime = System.currentTimeMillis(); } } diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java index 497e7b08d881..54dede6753e4 100644 --- a/core/java/com/android/internal/view/FloatingActionMode.java +++ b/core/java/com/android/internal/view/FloatingActionMode.java @@ -17,6 +17,7 @@ package com.android.internal.view; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; @@ -30,6 +31,7 @@ import android.view.ViewGroup; import android.view.ViewParent; import android.view.WindowManager; +import android.widget.PopupWindow; import com.android.internal.R; import com.android.internal.util.Preconditions; import com.android.internal.view.menu.MenuBuilder; @@ -241,6 +243,23 @@ public final class FloatingActionMode extends ActionMode { } } + /** + * If this is set to true, the action mode view will dismiss itself on touch events outside of + * its window. This only makes sense if the action mode view is a PopupWindow that is touchable + * but not focusable, which means touches outside of the window will be delivered to the window + * behind. The default is false. + * + * This is for internal use only and the approach to this may change. + * @hide + * + * @param outsideTouchable whether or not this action mode is "outside touchable" + * @param onDismiss optional. Sets a callback for when this action mode popup dismisses itself + */ + public void setOutsideTouchable( + boolean outsideTouchable, @Nullable PopupWindow.OnDismissListener onDismiss) { + mFloatingToolbar.setOutsideTouchable(outsideTouchable, onDismiss); + } + @Override public void onWindowFocusChanged(boolean hasWindowFocus) { mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus); diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 63c2e96e173c..42fb1f5c34e9 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; @@ -259,6 +260,22 @@ public final class FloatingToolbar { return mPopup.isHidden(); } + /** + * If this is set to true, the action mode view will dismiss itself on touch events outside of + * its window. If the toolbar is already showing, it will be re-shown so that this setting takes + * effect immediately. + * + * @param outsideTouchable whether or not this action mode is "outside touchable" + * @param onDismiss optional. Sets a callback for when this action mode popup dismisses itself + */ + public void setOutsideTouchable( + boolean outsideTouchable, @Nullable PopupWindow.OnDismissListener onDismiss) { + if (mPopup.setOutsideTouchable(outsideTouchable, onDismiss) && isShowing()) { + dismiss(); + doShow(); + } + } + private void doShow() { List<MenuItem> menuItems = getVisibleAndEnabledMenuItems(mMenu); menuItems.sort(mMenuItemComparator); @@ -452,7 +469,7 @@ public final class FloatingToolbar { mLineHeight = context.getResources() .getDimensionPixelSize(R.dimen.floating_toolbar_height); mIconTextSpacing = context.getResources() - .getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_side_padding); + .getDimensionPixelSize(R.dimen.floating_toolbar_icon_text_spacing); // Interpolators mLogAccelerateInterpolator = new LogAccelerateInterpolator(); @@ -481,7 +498,7 @@ public final class FloatingToolbar { mOverflowButton = createOverflowButton(); mOverflowButtonSize = measure(mOverflowButton); mMainPanel = createMainPanel(); - mOverflowPanelViewHelper = new OverflowPanelViewHelper(mContext); + mOverflowPanelViewHelper = new OverflowPanelViewHelper(mContext, mIconTextSpacing); mOverflowPanel = createOverflowPanel(); // Animation. Need views. @@ -513,6 +530,32 @@ public final class FloatingToolbar { } /** + * Makes this toolbar "outside touchable" and sets the onDismissListener. + * This will take effect the next time the toolbar is re-shown. + * + * @param outsideTouchable if true, the popup will be made "outside touchable" and + * "non focusable". The reverse will happen if false. + * @param onDismiss + * + * @return true if the "outsideTouchable" setting was modified. Otherwise returns false + * + * @see PopupWindow#setOutsideTouchable(boolean) + * @see PopupWindow#setFocusable(boolean) + * @see PopupWindow.OnDismissListener + */ + public boolean setOutsideTouchable( + boolean outsideTouchable, @Nullable PopupWindow.OnDismissListener onDismiss) { + boolean ret = false; + if (mPopupWindow.isOutsideTouchable() ^ outsideTouchable) { + mPopupWindow.setOutsideTouchable(outsideTouchable); + mPopupWindow.setFocusable(!outsideTouchable); + ret = true; + } + mPopupWindow.setOnDismissListener(onDismiss); + return ret; + } + + /** * Lays out buttons for the specified menu items. * Requires a subsequent call to {@link #show()} to show the items. */ @@ -1573,10 +1616,9 @@ public final class FloatingToolbar { private final Context mContext; - public OverflowPanelViewHelper(Context context) { + public OverflowPanelViewHelper(Context context, int iconTextSpacing) { mContext = Preconditions.checkNotNull(context); - mIconTextSpacing = context.getResources() - .getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_side_padding); + mIconTextSpacing = iconTextSpacing; mSidePadding = context.getResources() .getDimensionPixelSize(R.dimen.floating_toolbar_overflow_side_padding); mCalculator = createMenuButton(null); diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 7e63adc27c9e..591f15fd5676 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -45,6 +45,7 @@ interface ILockSettings { boolean checkVoldPassword(int userId); boolean havePattern(int userId); boolean havePassword(int userId); + byte[] getHashFactor(String currentCredential, int userId); void setSeparateProfileChallengeEnabled(int userId, boolean enabled, String managedUserPassword); boolean getSeparateProfileChallengeEnabled(int userId); void registerStrongAuthTracker(in IStrongAuthTracker tracker); diff --git a/core/java/com/android/internal/widget/ImageFloatingTextView.java b/core/java/com/android/internal/widget/ImageFloatingTextView.java index 09f7282f097a..1e7c11e75aec 100644 --- a/core/java/com/android/internal/widget/ImageFloatingTextView.java +++ b/core/java/com/android/internal/widget/ImageFloatingTextView.java @@ -47,6 +47,7 @@ public class ImageFloatingTextView extends TextView { private boolean mFirstMeasure = true; private int mLayoutMaxLines = -1; private boolean mBlockLayouts; + private int mImageEndMargin; public ImageFloatingTextView(Context context) { this(context, null); @@ -98,13 +99,11 @@ public class ImageFloatingTextView extends TextView { } // we set the endmargin on the requested number of lines. - int endMargin = getContext().getResources().getDimensionPixelSize( - R.dimen.notification_content_picture_margin); int[] margins = null; if (mIndentLines > 0) { margins = new int[mIndentLines + 1]; for (int i = 0; i < mIndentLines; i++) { - margins[i] = endMargin; + margins[i] = mImageEndMargin; } } if (mResolvedDirection == LAYOUT_DIRECTION_RTL) { @@ -116,6 +115,11 @@ public class ImageFloatingTextView extends TextView { return builder.build(); } + @RemotableViewMethod + public void setImageEndMargin(int imageEndMargin) { + mImageEndMargin = imageEndMargin; + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.getSize(heightMeasureSpec); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index d4ab4265b3fb..7c339fb6d6b1 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -66,8 +66,10 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.StringJoiner; /** * Utilities for the lock pattern and its settings. */ @@ -165,6 +167,7 @@ public class LockPatternUtils { public static final String SYNTHETIC_PASSWORD_HANDLE_KEY = "sp-handle"; public static final String SYNTHETIC_PASSWORD_ENABLED_KEY = "enable-sp"; + private static final String HISTORY_DELIMITER = ","; private final Context mContext; private final ContentResolver mContentResolver; @@ -507,31 +510,50 @@ public class LockPatternUtils { } /** + * Returns the password history hash factor, needed to check new password against password + * history with {@link #checkPasswordHistory(String, byte[], int)} + */ + public byte[] getPasswordHistoryHashFactor(String currentPassword, int userId) { + try { + return getLockSettings().getHashFactor(currentPassword, userId); + } catch (RemoteException e) { + Log.e(TAG, "failed to get hash factor", e); + return null; + } + } + + /** * Check to see if a password matches any of the passwords stored in the * password history. * - * @param password The password to check. + * @param passwordToCheck The password to check. + * @param hashFactor Hash factor of the current user returned from + * {@link ILockSettings#getHashFactor} * @return Whether the password matches any in the history. */ - public boolean checkPasswordHistory(String password, int userId) { - String passwordHashString = new String( - passwordToHash(password, userId), StandardCharsets.UTF_8); + public boolean checkPasswordHistory(String passwordToCheck, byte[] hashFactor, int userId) { + if (TextUtils.isEmpty(passwordToCheck)) { + Log.e(TAG, "checkPasswordHistory: empty password"); + return false; + } String passwordHistory = getString(PASSWORD_HISTORY_KEY, userId); - if (passwordHistory == null) { + if (TextUtils.isEmpty(passwordHistory)) { return false; } - // Password History may be too long... - int passwordHashLength = passwordHashString.length(); int passwordHistoryLength = getRequestedPasswordHistoryLength(userId); if(passwordHistoryLength == 0) { return false; } - int neededPasswordHistoryLength = passwordHashLength * passwordHistoryLength - + passwordHistoryLength - 1; - if (passwordHistory.length() > neededPasswordHistoryLength) { - passwordHistory = passwordHistory.substring(0, neededPasswordHistoryLength); + String legacyHash = legacyPasswordToHash(passwordToCheck, userId); + String passwordHash = passwordToHistoryHash(passwordToCheck, hashFactor, userId); + String[] history = passwordHistory.split(HISTORY_DELIMITER); + // Password History may be too long... + for (int i = 0; i < Math.min(passwordHistoryLength, history.length); i++) { + if (history[i].equals(legacyHash) || history[i].equals(passwordHash)) { + return true; + } } - return passwordHistory.contains(passwordHashString); + return false; } /** @@ -830,6 +852,7 @@ public class LockPatternUtils { updateEncryptionPasswordIfNeeded(password, PasswordMetrics.computeForPassword(password).quality, userHandle); updatePasswordHistory(password, userHandle); + onAfterChangingPassword(userHandle); } /** @@ -852,8 +875,15 @@ public class LockPatternUtils { } } + /** + * Store the hash of the *current* password in the password history list, if device policy + * enforces password history requirement. + */ private void updatePasswordHistory(String password, int userHandle) { - + if (TextUtils.isEmpty(password)) { + Log.e(TAG, "checkPasswordHistory: empty password"); + return; + } // Add the password to the password history. We assume all // password hashes have the same length for simplicity of implementation. String passwordHistory = getString(PASSWORD_HISTORY_KEY, userHandle); @@ -864,16 +894,25 @@ public class LockPatternUtils { if (passwordHistoryLength == 0) { passwordHistory = ""; } else { - byte[] hash = passwordToHash(password, userHandle); - passwordHistory = new String(hash, StandardCharsets.UTF_8) + "," + passwordHistory; - // Cut it to contain passwordHistoryLength hashes - // and passwordHistoryLength -1 commas. - passwordHistory = passwordHistory.substring(0, Math.min(hash.length - * passwordHistoryLength + passwordHistoryLength - 1, passwordHistory - .length())); + final byte[] hashFactor = getPasswordHistoryHashFactor(password, userHandle); + String hash = passwordToHistoryHash(password, hashFactor, userHandle); + if (hash == null) { + Log.e(TAG, "Compute new style password hash failed, fallback to legacy style"); + hash = legacyPasswordToHash(password, userHandle); + } + if (TextUtils.isEmpty(passwordHistory)) { + passwordHistory = hash; + } else { + String[] history = passwordHistory.split(HISTORY_DELIMITER); + StringJoiner joiner = new StringJoiner(HISTORY_DELIMITER); + joiner.add(hash); + for (int i = 0; i < passwordHistoryLength - 1 && i < history.length; i++) { + joiner.add(history[i]); + } + passwordHistory = joiner.toString(); + } } setString(PASSWORD_HISTORY_KEY, passwordHistory, userHandle); - onAfterChangingPassword(userHandle); } /** @@ -1098,7 +1137,7 @@ public class LockPatternUtils { return Long.toHexString(salt); } - /* + /** * Generate a hash for the given password. To avoid brute force attacks, we use a salted hash. * Not the most secure, but it is at least a second level of protection. First level is that * the file is in a location only readable by the system process. @@ -1107,7 +1146,7 @@ public class LockPatternUtils { * * @return the hash of the pattern in a byte array. */ - public byte[] passwordToHash(String password, int userId) { + public String legacyPasswordToHash(String password, int userId) { if (password == null) { return null; } @@ -1122,7 +1161,24 @@ public class LockPatternUtils { System.arraycopy(md5, 0, combined, sha1.length, md5.length); final char[] hexEncoded = HexEncoding.encode(combined); - return new String(hexEncoded).getBytes(StandardCharsets.UTF_8); + return new String(hexEncoded); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError("Missing digest algorithm: ", e); + } + } + + /** + * Hash the password for password history check purpose. + */ + private String passwordToHistoryHash(String passwordToHash, byte[] hashFactor, int userId) { + if (TextUtils.isEmpty(passwordToHash) || hashFactor == null) { + return null; + } + try { + MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); + sha256.update(hashFactor); + sha256.update((passwordToHash + getSalt(userId)).getBytes()); + return new String(HexEncoding.encode(sha256.digest())); } catch (NoSuchAlgorithmException e) { throw new AssertionError("Missing digest algorithm: ", e); } @@ -1571,6 +1627,7 @@ public class LockPatternUtils { updateEncryptionPasswordIfNeeded(credential, quality, userId); updatePasswordHistory(credential, userId); + onAfterChangingPassword(userId); } else { if (!TextUtils.isEmpty(credential)) { throw new IllegalArgumentException("password must be emtpy for NONE type"); diff --git a/core/java/com/android/internal/widget/MessagingGroup.java b/core/java/com/android/internal/widget/MessagingGroup.java index 07d78fe2abda..3f73237da12b 100644 --- a/core/java/com/android/internal/widget/MessagingGroup.java +++ b/core/java/com/android/internal/widget/MessagingGroup.java @@ -22,6 +22,8 @@ import android.annotation.Nullable; import android.annotation.StyleRes; import android.app.Person; import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Icon; @@ -29,6 +31,7 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Pools; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -36,6 +39,7 @@ import android.view.ViewParent; import android.view.ViewTreeObserver; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ProgressBar; import android.widget.RemoteViews; import com.android.internal.R; @@ -58,6 +62,7 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou private CharSequence mAvatarName = ""; private Icon mAvatarIcon; private int mTextColor; + private int mSendingTextColor; private List<MessagingMessage> mMessages; private ArrayList<MessagingMessage> mAddedMessages = new ArrayList<>(); private boolean mFirstLayout; @@ -69,6 +74,8 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou private MessagingImageMessage mIsolatedMessage; private boolean mTransformingImages; private Point mDisplaySize = new Point(); + private ProgressBar mSendingSpinner; + private View mSendingSpinnerContainer; public MessagingGroup(@NonNull Context context) { super(context); @@ -96,6 +103,8 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou mSenderName.addOnLayoutChangeListener(MessagingLayout.MESSAGING_PROPERTY_ANIMATOR); mAvatarView = findViewById(R.id.message_icon); mImageContainer = findViewById(R.id.messaging_group_icon_container); + mSendingSpinner = findViewById(R.id.messaging_group_sending_progress); + mSendingSpinnerContainer = findViewById(R.id.messaging_group_sending_progress_container); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); mDisplaySize.x = displayMetrics.widthPixels; mDisplaySize.y = displayMetrics.heightPixels; @@ -139,17 +148,37 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou mAvatarView.setVisibility(VISIBLE); mSenderName.setVisibility(VISIBLE); mTextColor = getNormalTextColor(); + mSendingTextColor = calculateSendingTextColor(); + } + + public void setSending(boolean sending) { + int visibility = sending ? View.VISIBLE : View.GONE; + if (mSendingSpinnerContainer.getVisibility() != visibility) { + mSendingSpinnerContainer.setVisibility(visibility); + updateMessageColor(); + } } private int getNormalTextColor() { return mContext.getColor(R.color.notification_secondary_text_color_light); } + private int calculateSendingTextColor() { + TypedValue alphaValue = new TypedValue(); + mContext.getResources().getValue( + R.dimen.notification_secondary_text_disabled_alpha, alphaValue, true); + float alpha = alphaValue.getFloat(); + return Color.valueOf( + Color.red(mTextColor), + Color.green(mTextColor), + Color.blue(mTextColor), + alpha).toArgb(); + } + public void setAvatar(Icon icon) { mAvatarIcon = icon; mAvatarView.setImageIcon(icon); mAvatarSymbol = ""; - mLayoutColor = 0; mAvatarName = ""; } @@ -321,13 +350,26 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou || layoutColor != mLayoutColor) { setAvatar(cachedIcon); mAvatarSymbol = avatarSymbol; - mLayoutColor = layoutColor; + setLayoutColor(layoutColor); mAvatarName = avatarName; } } public void setLayoutColor(int layoutColor) { - mLayoutColor = layoutColor; + if (layoutColor != mLayoutColor){ + mLayoutColor = layoutColor; + mSendingSpinner.setIndeterminateTintList(ColorStateList.valueOf(mLayoutColor)); + } + } + + private void updateMessageColor() { + if (mMessages != null) { + int color = mSendingSpinnerContainer.getVisibility() == View.VISIBLE + ? mSendingTextColor : mTextColor; + for (MessagingMessage message : mMessages) { + message.setColor(message.getMessage().isRemoteInputHistory() ? color : mTextColor); + } + } } public void setMessages(List<MessagingMessage> group) { @@ -336,7 +378,6 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou MessagingImageMessage isolatedMessage = null; for (int messageIndex = 0; messageIndex < group.size(); messageIndex++) { MessagingMessage message = group.get(messageIndex); - message.setColor(mTextColor); if (message.getGroup() != this) { message.setMessagingGroup(this); mAddedMessages.add(message); @@ -375,7 +416,14 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou mImageContainer.removeAllViews(); } mIsolatedMessage = isolatedMessage; + updateImageContainerVisibility(); mMessages = group; + updateMessageColor(); + } + + private void updateImageContainerVisibility() { + mImageContainer.setVisibility(mIsolatedMessage != null && mImagesAtEnd + ? View.VISIBLE : View.GONE); } /** @@ -477,7 +525,7 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou public void setDisplayImagesAtEnd(boolean atEnd) { if (mImagesAtEnd != atEnd) { mImagesAtEnd = atEnd; - mImageContainer.setVisibility(atEnd ? View.VISIBLE : View.GONE); + updateImageContainerVisibility(); } } diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java index f8236c78ac43..df20e639adf0 100644 --- a/core/java/com/android/internal/widget/MessagingLayout.java +++ b/core/java/com/android/internal/widget/MessagingLayout.java @@ -149,7 +149,9 @@ public class MessagingLayout extends FrameLayout { } addRemoteInputHistoryToMessages(newMessages, extras.getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY)); - bind(newMessages, newHistoricMessages); + boolean showSpinner = + extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false); + bind(newMessages, newHistoricMessages, showSpinner); } private void addRemoteInputHistoryToMessages( @@ -161,17 +163,18 @@ public class MessagingLayout extends FrameLayout { for (int i = remoteInputHistory.length - 1; i >= 0; i--) { CharSequence message = remoteInputHistory[i]; newMessages.add(new Notification.MessagingStyle.Message( - message, 0, (Person) null)); + message, 0, (Person) null, true /* remoteHistory */)); } } private void bind(List<Notification.MessagingStyle.Message> newMessages, - List<Notification.MessagingStyle.Message> newHistoricMessages) { + List<Notification.MessagingStyle.Message> newHistoricMessages, + boolean showSpinner) { List<MessagingMessage> historicMessages = createMessages(newHistoricMessages, true /* isHistoric */); List<MessagingMessage> messages = createMessages(newMessages, false /* isHistoric */); - addMessagesToGroups(historicMessages, messages); + addMessagesToGroups(historicMessages, messages, showSpinner); // Let's remove the remaining messages mMessages.forEach(REMOVE_MESSAGE); @@ -308,7 +311,7 @@ public class MessagingLayout extends FrameLayout { } private void addMessagesToGroups(List<MessagingMessage> historicMessages, - List<MessagingMessage> messages) { + List<MessagingMessage> messages, boolean showSpinner) { // Let's first find our groups! List<List<MessagingMessage>> groups = new ArrayList<>(); List<Person> senders = new ArrayList<>(); @@ -317,11 +320,11 @@ public class MessagingLayout extends FrameLayout { findGroups(historicMessages, messages, groups, senders); // Let's now create the views and reorder them accordingly - createGroupViews(groups, senders); + createGroupViews(groups, senders, showSpinner); } private void createGroupViews(List<List<MessagingMessage>> groups, - List<Person> senders) { + List<Person> senders, boolean showSpinner) { mGroups.clear(); for (int groupIndex = 0; groupIndex < groups.size(); groupIndex++) { List<MessagingMessage> group = groups.get(groupIndex); @@ -346,6 +349,7 @@ public class MessagingLayout extends FrameLayout { nameOverride = mNameReplacement; } newGroup.setSender(sender, nameOverride); + newGroup.setSending(groupIndex == (groups.size() - 1) && showSpinner); mGroups.add(newGroup); if (mMessagingLinearLayout.indexOfChild(newGroup) != groupIndex) { diff --git a/core/java/com/android/internal/widget/MessagingMessage.java b/core/java/com/android/internal/widget/MessagingMessage.java index a2cc7cfb856c..f0b60685b70e 100644 --- a/core/java/com/android/internal/widget/MessagingMessage.java +++ b/core/java/com/android/internal/widget/MessagingMessage.java @@ -82,6 +82,9 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild { if (!Objects.equals(message.getDataUri(), ownMessage.getDataUri())) { return false; } + if (message.isRemoteInputHistory() != ownMessage.isRemoteInputHistory()) { + return false; + } return true; } diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index 162822092af6..567bb075d746 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -1723,13 +1723,13 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image // Adjust the bad pixel coordinates to be relative to the origin of the active area DNG tag std::vector<uint32_t> v; - for (size_t i = 0; i < entry3.count; i+=2) { + for (size_t i = 0; i < entry3.count; i += 2) { int32_t x = entry3.data.i32[i]; int32_t y = entry3.data.i32[i + 1]; x -= static_cast<int32_t>(xmin); y -= static_cast<int32_t>(ymin); if (x < 0 || y < 0 || static_cast<uint32_t>(x) >= width || - static_cast<uint32_t>(y) >= width) { + static_cast<uint32_t>(y) >= height) { continue; } v.push_back(x); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index da494d49acd3..8235507e4528 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1424,6 +1424,13 @@ <permission android:name="android.permission.NETWORK_SETTINGS" android:protectionLevel="signature" /> + <!-- Allows SetupWizard to call methods in Networking services + <p>Not for use by any other third-party or privileged applications. + @hide This should only be used by SetupWizard. + --> + <permission android:name="android.permission.NETWORK_SETUP_WIZARD" + android:protectionLevel="signature|setup" /> + <!-- #SystemApi @hide Allows applications to access information about LoWPAN interfaces. <p>Not for use by third-party applications. --> <permission android:name="android.permission.ACCESS_LOWPAN_STATE" diff --git a/core/res/res/anim-ldrtl/task_close_enter.xml b/core/res/res/anim-ldrtl/task_close_enter.xml new file mode 100644 index 000000000000..7abada332fb6 --- /dev/null +++ b/core/res/res/anim-ldrtl/task_close_enter.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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 + --> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" + android:zAdjustment="top" + android:showWallpaper="true"> + + <alpha + android:fromAlpha="1" + android:toAlpha="1.0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/linear" + android:startOffset="67" + android:duration="217"/> + + <translate + android:fromXDelta="105%" + android:toXDelta="0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/aggressive_ease" + android:startOffset="50" + android:duration="383"/> + + <scale + android:fromXScale="1.0526" + android:toXScale="1" + android:fromYScale="1.0526" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:duration="283"/> + + <scale + android:fromXScale="0.95" + android:toXScale="1" + android:fromYScale="0.95" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:startOffset="283" + android:duration="317"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_close_exit.xml b/core/res/res/anim-ldrtl/task_close_exit.xml new file mode 100644 index 000000000000..a017820a4b3e --- /dev/null +++ b/core/res/res/anim-ldrtl/task_close_exit.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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 + --> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" + android:showWallpaper="true"> + + <alpha + android:fromAlpha="1.0" + android:toAlpha="1" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/linear" + android:startOffset="67" + android:duration="283"/> + + <translate + android:fromXDelta="0" + android:toXDelta="-105%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/aggressive_ease" + android:startOffset="50" + android:duration="383"/> + + <scale + android:fromXScale="1.0" + android:toXScale="0.95" + android:fromYScale="1.0" + android:toYScale="0.95" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:pivotX="50%" + android:pivotY="50%" + android:interpolator="@interpolator/fast_out_slow_in" + android:duration="283"/> + + <!-- This is needed to keep the animation running while task_open_enter completes --> + <alpha + android:fromAlpha="1.0" + android:toAlpha="1.0" + android:duration="600"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_open_enter.xml b/core/res/res/anim-ldrtl/task_open_enter.xml new file mode 100644 index 000000000000..0433664717eb --- /dev/null +++ b/core/res/res/anim-ldrtl/task_open_enter.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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 + --> +<!-- This should in sync with task_open_enter_cross_profile_apps.xml --> +<!-- This should in sync with cross_profile_apps_thumbnail_enter.xml --> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" + android:zAdjustment="top" + android:showWallpaper="true"> + + <alpha + android:fromAlpha="1" + android:toAlpha="1.0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/linear" + android:startOffset="67" + android:duration="217"/> + + <translate + android:fromXDelta="-105%" + android:toXDelta="0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/aggressive_ease" + android:startOffset="50" + android:duration="383"/> + + <scale + android:fromXScale="1.0526" + android:toXScale="1" + android:fromYScale="1.0526" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:duration="283"/> + + <scale + android:fromXScale="0.95" + android:toXScale="1" + android:fromYScale="0.95" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:startOffset="283" + android:duration="317"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml new file mode 100644 index 000000000000..45ca80e00e22 --- /dev/null +++ b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> +<!-- This should in sync with task_open_enter.xml --> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" + android:zAdjustment="top" + android:showWallpaper="true"> + + <alpha + android:fromAlpha="1" + android:toAlpha="1.0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/linear" + android:startOffset="67" + android:duration="217"/> + + <translate + android:fromXDelta="-105%" + android:toXDelta="0" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/aggressive_ease" + android:startOffset="50" + android:duration="383"/> + + <scale + android:fromXScale="1.0526" + android:toXScale="1" + android:fromYScale="1.0526" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:duration="283"/> + + <scale + android:fromXScale="0.95" + android:toXScale="1" + android:fromYScale="0.95" + android:toYScale="1" + android:pivotX="50%" + android:pivotY="50%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:startOffset="283" + android:duration="317"/> + + <!-- To keep the transition around longer for the thumbnail, should be kept in sync with + cross_profile_apps_thumbmail.xml --> + <alpha + android:fromAlpha="1.0" + android:toAlpha="1.0" + android:startOffset="717" + android:duration="200"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_open_exit.xml b/core/res/res/anim-ldrtl/task_open_exit.xml new file mode 100644 index 000000000000..f50494d81eb5 --- /dev/null +++ b/core/res/res/anim-ldrtl/task_open_exit.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ 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 + --> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false" + android:showWallpaper="true"> + + <alpha + android:fromAlpha="1.0" + android:toAlpha="1" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/linear" + android:startOffset="67" + android:duration="283"/> + + <translate + android:fromXDelta="0" + android:toXDelta="105%" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:interpolator="@interpolator/aggressive_ease" + android:startOffset="50" + android:duration="383"/> + + <scale + android:fromXScale="1.0" + android:toXScale="0.95" + android:fromYScale="1.0" + android:toYScale="0.95" + android:fillEnabled="true" + android:fillBefore="true" + android:fillAfter="true" + android:pivotX="50%" + android:pivotY="50%" + android:interpolator="@interpolator/fast_out_slow_in" + android:duration="283"/> + + <!-- This is needed to keep the animation running while task_open_enter completes --> + <alpha + android:fromAlpha="1.0" + android:toAlpha="1.0" + android:duration="600"/> +</set>
\ No newline at end of file diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml index c298b8090a01..b059aa9cb28c 100644 --- a/core/res/res/anim/task_close_enter.xml +++ b/core/res/res/anim/task_close_enter.xml @@ -31,7 +31,7 @@ android:duration="217"/> <translate - android:fromXDelta="105%" + android:fromXDelta="-105%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml index 9394c577da78..c9ade227819b 100644 --- a/core/res/res/anim/task_close_exit.xml +++ b/core/res/res/anim/task_close_exit.xml @@ -32,7 +32,7 @@ <translate android:fromXDelta="0" - android:toXDelta="-105%" + android:toXDelta="105%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml index e23201f42d3a..5c618594364f 100644 --- a/core/res/res/anim/task_open_enter.xml +++ b/core/res/res/anim/task_open_enter.xml @@ -33,7 +33,7 @@ android:duration="217"/> <translate - android:fromXDelta="-105%" + android:fromXDelta="105%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml index defea08747e9..644104721463 100644 --- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml @@ -33,7 +33,7 @@ android:duration="217"/> <translate - android:fromXDelta="-105%" + android:fromXDelta="105%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml index c9ade227819b..9394c577da78 100644 --- a/core/res/res/anim/task_open_exit.xml +++ b/core/res/res/anim/task_open_exit.xml @@ -32,7 +32,7 @@ <translate android:fromXDelta="0" - android:toXDelta="105%" + android:toXDelta="-105%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" diff --git a/core/res/res/drawable/ic_reply_notification.xml b/core/res/res/drawable/ic_reply_notification.xml index 88b8c5b7ddef..a9864b09207a 100644 --- a/core/res/res/drawable/ic_reply_notification.xml +++ b/core/res/res/drawable/ic_reply_notification.xml @@ -13,15 +13,20 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="10dp" - android:height="10dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M10.0,9.0L10.0,5.0l-7.0,7.0 7.0,7.0l0.0,-4.1c5.0,0.0 8.5,1.6 11.0,5.1 -1.0,-5.0 -4.0,-10.0 -11.0,-11.0z"/> - <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> -</vector> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:inset="@dimen/notification_reply_inset"> + <vector android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + <path + android:fillColor="#000000" + android:strokeWidth="1" + android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" /> + <path + android:fillColor="#000000" + android:strokeWidth="1" + android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" /> + </vector> +</inset> diff --git a/core/res/res/drawable/ic_reply_notification_large.xml b/core/res/res/drawable/ic_reply_notification_large.xml deleted file mode 100644 index e75afddfead3..000000000000 --- a/core/res/res/drawable/ic_reply_notification_large.xml +++ /dev/null @@ -1,29 +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 - --> -<inset xmlns:android="http://schemas.android.com/apk/res/android" - android:inset="8dp"> - <vector android:width="24dp" - android:height="24dp" - android:viewportHeight="24.0" - android:viewportWidth="24.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M10.0,9.0L10.0,5.0l-7.0,7.0 7.0,7.0l0.0,-4.1c5.0,0.0 8.5,1.6 11.0,5.1 -1.0,-5.0 -4.0,-10.0 -11.0,-11.0z"/> - <path - android:fillColor="#00000000" - android:pathData="M0 0h24v24H0z"/> - </vector> -</inset> diff --git a/core/res/res/layout-television/autofill_save.xml b/core/res/res/layout-television/autofill_save.xml new file mode 100644 index 000000000000..ebd2dec3fc0f --- /dev/null +++ b/core/res/res/layout-television/autofill_save.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<!-- NOTE: outer layout is required to provide proper shadow. --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <LinearLayout + android:orientation="horizontal" + android:id="@+id/autofill_save" + android:background="?android:attr/colorBackground" + android:layout_marginTop="32dp" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingStart="40dp" + android:paddingEnd="40dp" + android:paddingTop="40dp" + android:paddingBottom="40dp"> + + <LinearLayout + android:orientation="vertical" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_marginEnd="32dp"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="6dp"> + + <ImageView + android:id="@+id/autofill_save_icon" + android:scaleType="fitStart" + android:layout_marginEnd="10dp" + android:layout_gravity="center_vertical" + android:layout_width="48dp" + android:layout_height="48dp"/> + <TextView + android:id="@+id/autofill_save_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/autofill_save_title" + android:layout_gravity="center_vertical" + android:textSize="24sp" /> + </LinearLayout> + + <com.android.server.autofill.ui.CustomScrollView + android:id="@+id/autofill_save_custom_subtitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="4dp" + android:visibility="gone"/> + + </LinearLayout> + + <LinearLayout + android:layout_width="304dp" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <Button + android:id="@+id/autofill_save_no" + style="?attr/borderlessButtonStyle" + android:textAlignment="viewStart" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/autofill_save_no"> + </Button> + + <Button + android:id="@+id/autofill_save_yes" + style="?attr/borderlessButtonStyle" + android:textAlignment="viewStart" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/autofill_save_yes"> + </Button> + </LinearLayout> + + </LinearLayout> + +</LinearLayout> diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml index ef19f870006f..a88836eff5a0 100644 --- a/core/res/res/layout/autofill_dataset_picker.xml +++ b/core/res/res/layout/autofill_dataset_picker.xml @@ -14,8 +14,7 @@ limitations under the License. --> -<view xmlns:android="http://schemas.android.com/apk/res/android" - class="com.android.server.autofill.ui.FillUi$AutofillFrameLayout" +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/autofill_dataset_picker" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -31,4 +30,4 @@ android:visibility="gone"> </ListView> -</view> +</FrameLayout> diff --git a/core/res/res/layout/autofill_dataset_picker_fullscreen.xml b/core/res/res/layout/autofill_dataset_picker_fullscreen.xml index 07298c182269..1d2b5e5d6543 100644 --- a/core/res/res/layout/autofill_dataset_picker_fullscreen.xml +++ b/core/res/res/layout/autofill_dataset_picker_fullscreen.xml @@ -14,35 +14,73 @@ limitations under the License. --> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/autofill_dataset_picker" - style="@style/AutofillDatasetPicker" - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - - <TextView - android:layout_width="wrap_content" +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:background="?android:attr/windowBackground" + android:paddingStart="40dp" + android:paddingEnd="40dp" + android:paddingTop="40dp" + android:paddingBottom="40dp"> + + <LinearLayout + android:orientation="vertical" + android:layout_width="0dp" android:layout_height="wrap_content" - android:text="@string/autofill_window_title" - android:layout_above="@+id/autofill_dataset_container" - android:layout_alignStart="@+id/autofill_dataset_container" - android:textSize="16sp"/> + android:layout_weight="1" + android:layout_marginEnd="32dp"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="6dp" + > + <ImageView + android:id="@+id/autofill_dataset_icon" + android:scaleType="fitStart" + android:layout_marginEnd="10dp" + android:layout_gravity="center_vertical" + android:layout_width="48dp" + android:layout_height="48dp"/> + <TextView + android:id="@+id/autofill_dataset_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:textSize="24sp" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/autofill_dataset_header" + android:visibility="gone" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"/> + + </LinearLayout> <!-- autofill_container is the common parent for inserting authentication item or - autofill_dataset_list--> - <FrameLayout - android:id="@+id/autofill_dataset_container" - android:layout_width="wrap_content" + autofill_dataset_list, autofill_dataset_foolter--> + <LinearLayout + android:layout_width="304dp" android:layout_height="wrap_content" - android:layout_centerInParent="true"> + android:id="@+id/autofill_dataset_picker" + android:orientation="vertical"> <ListView android:id="@+id/autofill_dataset_list" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:divider="@null" android:drawSelectorOnTop="true" android:visibility="gone"/> - </FrameLayout> + <LinearLayout + android:id="@+id/autofill_dataset_footer" + android:visibility="gone" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"/> + </LinearLayout> -</RelativeLayout> +</LinearLayout>
\ No newline at end of file diff --git a/core/res/res/layout/autofill_dataset_picker_header_footer.xml b/core/res/res/layout/autofill_dataset_picker_header_footer.xml index 048494ac8f29..093f035ec1ea 100644 --- a/core/res/res/layout/autofill_dataset_picker_header_footer.xml +++ b/core/res/res/layout/autofill_dataset_picker_header_footer.xml @@ -14,8 +14,7 @@ limitations under the License. --> -<view xmlns:android="http://schemas.android.com/apk/res/android" - class="com.android.server.autofill.ui.FillUi$AutofillFrameLayout" +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/autofill_dataset_picker" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -54,4 +53,4 @@ </LinearLayout> -</view> +</FrameLayout> diff --git a/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml b/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml deleted file mode 100644 index 24b14a061d90..000000000000 --- a/core/res/res/layout/autofill_dataset_picker_header_footer_fullscreen.xml +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/autofill_dataset_picker" - style="@style/AutofillDatasetPicker" - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/autofill_window_title" - android:layout_above="@+id/autofill_dataset_container" - android:layout_alignStart="@+id/autofill_dataset_container" - android:textSize="16sp"/> - - <!-- autofill_container is the common parent for inserting authentication item or - autofill_dataset_list--> - <FrameLayout - android:id="@+id/autofill_dataset_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerInParent="true"> - - <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <LinearLayout - android:id="@+id/autofill_dataset_header" - android:visibility="gone" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="vertical"/> - - <ListView - android:id="@+id/autofill_dataset_list" - android:layout_weight="1" - android:layout_width="fill_parent" - android:layout_height="0dp" - android:clickable="true" - android:divider="@null" - android:drawSelectorOnTop="true" - android:visibility="gone"/> - - <LinearLayout - android:id="@+id/autofill_dataset_footer" - android:visibility="gone" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="vertical"/> - - </LinearLayout> - - </FrameLayout> - -</RelativeLayout> diff --git a/core/res/res/layout/notification_material_action_tombstone.xml b/core/res/res/layout/notification_material_action_tombstone.xml index 817f298f0c6f..9fa7c6a28020 100644 --- a/core/res/res/layout/notification_material_action_tombstone.xml +++ b/core/res/res/layout/notification_material_action_tombstone.xml @@ -27,7 +27,7 @@ android:singleLine="true" android:ellipsize="end" android:textAlignment="viewStart" - android:alpha="0.5" + android:alpha="@dimen/notification_action_disabled_alpha" android:enabled="false" android:background="@drawable/notification_material_action_background" /> diff --git a/core/res/res/layout/notification_material_reply_text.xml b/core/res/res/layout/notification_material_reply_text.xml index 84603b06604e..dbf2dd008101 100644 --- a/core/res/res/layout/notification_material_reply_text.xml +++ b/core/res/res/layout/notification_material_reply_text.xml @@ -30,6 +30,7 @@ android:id="@+id/action_divider" android:layout_marginTop="@dimen/notification_content_margin" android:layout_marginBottom="@dimen/notification_content_margin" + android:layout_marginEnd="@dimen/notification_content_margin_end" android:background="@drawable/notification_template_divider" /> <TextView @@ -50,12 +51,31 @@ android:textAppearance="@style/TextAppearance.Material.Notification.Reply" android:singleLine="true" /> - <TextView - android:id="@+id/notification_material_reply_text_1" + <LinearLayout + android:id="@+id/notification_material_reply_text_1_container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginEnd="@dimen/notification_content_margin_end"> + <TextView + android:id="@+id/notification_material_reply_text_1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_marginEnd="@dimen/notification_content_margin_end" + android:layout_gravity="center" + android:textAppearance="@style/TextAppearance.Material.Notification.Reply" + android:singleLine="true" /> + <ProgressBar + android:id="@+id/notification_material_reply_progress" + android:layout_height="@dimen/messaging_group_sending_progress_size" + android:layout_width="@dimen/messaging_group_sending_progress_size" + android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:textAppearance="@style/TextAppearance.Material.Notification.Reply" - android:singleLine="true" /> + android:layout_gravity="center" + android:indeterminate="true" + style="?android:attr/progressBarStyleSmall" /> + </LinearLayout> </LinearLayout> diff --git a/core/res/res/layout/notification_template_material_big_text.xml b/core/res/res/layout/notification_template_material_big_text.xml index 3a6f57335fed..d1861d9383d6 100644 --- a/core/res/res/layout/notification_template_material_big_text.xml +++ b/core/res/res/layout/notification_template_material_big_text.xml @@ -53,10 +53,10 @@ android:layout_marginTop="@dimen/notification_progress_margin_top" android:layout_marginBottom="6dp"/> <com.android.internal.widget.ImageFloatingTextView android:id="@+id/big_text" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/notification_text_margin_top" - android:textAppearance="@style/TextAppearance.Material.Notification" android:singleLine="false" android:gravity="top" android:visibility="gone" diff --git a/core/res/res/layout/notification_template_material_inbox.xml b/core/res/res/layout/notification_template_material_inbox.xml index 23d879912ddd..d6f0e1df430e 100644 --- a/core/res/res/layout/notification_template_material_inbox.xml +++ b/core/res/res/layout/notification_template_material_inbox.xml @@ -53,7 +53,7 @@ android:layout_marginTop="@dimen/notification_progress_margin_top" android:layout_marginBottom="2dp"/> <TextView android:id="@+id/inbox_text0" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -62,7 +62,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text1" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -71,7 +71,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text2" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -80,7 +80,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text3" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -89,7 +89,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text4" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -98,7 +98,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text5" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" @@ -107,7 +107,7 @@ android:layout_weight="1" /> <TextView android:id="@+id/inbox_text6" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="0dp" android:singleLine="true" diff --git a/core/res/res/layout/notification_template_material_messaging.xml b/core/res/res/layout/notification_template_material_messaging.xml index 53514a341504..10c750972961 100644 --- a/core/res/res/layout/notification_template_material_messaging.xml +++ b/core/res/res/layout/notification_template_material_messaging.xml @@ -52,7 +52,9 @@ <include layout="@layout/notification_template_smart_reply_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/notification_content_margin" /> + android:layout_marginTop="@dimen/notification_content_margin" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginEnd="@dimen/notification_content_margin_end" /> <include layout="@layout/notification_material_action_list" /> </com.android.internal.widget.RemeasuringLinearLayout> <include layout="@layout/notification_template_right_icon"/> diff --git a/core/res/res/layout/notification_template_messaging_group.xml b/core/res/res/layout/notification_template_messaging_group.xml index bd1030ee14f5..9bdc495d574e 100644 --- a/core/res/res/layout/notification_template_messaging_group.xml +++ b/core/res/res/layout/notification_template_messaging_group.xml @@ -41,6 +41,7 @@ android:id="@+id/group_message_container" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/notification_text_margin_top" android:spacing="2dp" android:layout_weight="1"/> </com.android.internal.widget.RemeasuringLinearLayout> @@ -50,4 +51,19 @@ android:layout_height="@dimen/messaging_avatar_size" android:layout_marginStart="12dp" android:visibility="gone"/> + <FrameLayout + android:id="@+id/messaging_group_sending_progress_container" + android:layout_width="@dimen/messaging_group_sending_progress_size" + android:layout_height="@dimen/messaging_avatar_size" + android:layout_marginStart="12dp" + android:layout_gravity="top" + android:visibility="gone"> + <ProgressBar + android:id="@+id/messaging_group_sending_progress" + android:layout_height="@dimen/messaging_group_sending_progress_size" + android:layout_width="@dimen/messaging_group_sending_progress_size" + android:layout_gravity="center" + android:indeterminate="true" + style="?android:attr/progressBarStyleSmall" /> + </FrameLayout> </com.android.internal.widget.MessagingGroup> diff --git a/core/res/res/layout/notification_template_part_line1.xml b/core/res/res/layout/notification_template_part_line1.xml index ca35de3922ed..6459bb8019b4 100644 --- a/core/res/res/layout/notification_template_part_line1.xml +++ b/core/res/res/layout/notification_template_part_line1.xml @@ -31,7 +31,7 @@ android:textAlignment="viewStart" /> <TextView android:id="@+id/text_line_1" - android:textAppearance="@style/TextAppearance.Material.Notification" + style="@style/Widget.Material.Notification.Text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="end|bottom" diff --git a/core/res/res/layout/notification_template_right_icon.xml b/core/res/res/layout/notification_template_right_icon.xml index 0b97e45b8eed..ee416ad36b8a 100644 --- a/core/res/res/layout/notification_template_right_icon.xml +++ b/core/res/res/layout/notification_template_right_icon.xml @@ -14,30 +14,29 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<!-- The view only has 8dp padding at the end instead of notification_content_margin_end, + since the reply icon has an inset of 8dp and we want it to visually start at the start of the + icon. --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/right_icon_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/notification_content_margin_top" + android:layout_marginEnd="8dp" android:layout_gravity="top|end"> <ImageView android:id="@+id/right_icon" android:layout_width="@dimen/notification_right_icon_size" android:layout_height="@dimen/notification_right_icon_size" android:layout_gravity="top|end" - android:layout_marginEnd="@dimen/notification_content_margin_end" + android:layout_marginEnd="8dp" android:scaleType="centerCrop" android:importantForAccessibility="no" /> - <ImageButton android:id="@+id/reply_icon_action" - android:layout_width="16dp" - android:layout_height="16dp" - android:layout_gravity="top|end" - android:layout_marginTop="27dp" - android:layout_marginEnd="16dp" - android:background="@drawable/notification_reply_background" - android:src="@drawable/ic_reply_notification" - android:scaleType="center" - android:contentDescription="@string/notification_reply_button_accessibility" - visiblity="gone"/> -</FrameLayout> + <ImageView android:id="@+id/reply_icon_action" + android:layout_width="@dimen/notification_right_icon_size" + android:layout_height="@dimen/notification_right_icon_size" + android:layout_gravity="top|end" + android:contentDescription="@string/notification_reply_button_accessibility" + android:scaleType="centerCrop" + android:src="@drawable/ic_reply_notification"/> +</LinearLayout> diff --git a/core/res/res/layout/notification_template_text.xml b/core/res/res/layout/notification_template_text.xml index 68f34c8e5b52..3b27666ef6ff 100644 --- a/core/res/res/layout/notification_template_text.xml +++ b/core/res/res/layout/notification_template_text.xml @@ -15,6 +15,7 @@ ~ limitations under the License --> <com.android.internal.widget.ImageFloatingTextView xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/Widget.Material.Notification.Text" android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -25,5 +26,4 @@ android:gravity="top" android:singleLine="true" android:textAlignment="viewStart" - android:textAppearance="@style/TextAppearance.Material.Notification" /> diff --git a/core/res/res/values-television/dimens.xml b/core/res/res/values-television/dimens.xml index aa5625124f29..4c25225dd50c 100644 --- a/core/res/res/values-television/dimens.xml +++ b/core/res/res/values-television/dimens.xml @@ -20,8 +20,4 @@ <item type="dimen" format="float" name="ambient_shadow_alpha">0.15</item> <item type="dimen" format="float" name="spot_shadow_alpha">0.3</item> - <!-- Max width/height of the autofill data set picker as a fraction of the screen width/height --> - <dimen name="autofill_dataset_picker_max_width">60%</dimen> - <dimen name="autofill_dataset_picker_max_height">70%</dimen> - </resources> diff --git a/core/res/res/values-television/themes_device_defaults.xml b/core/res/res/values-television/themes_device_defaults.xml index e01caa31ef4f..e380a7bb88a6 100644 --- a/core/res/res/values-television/themes_device_defaults.xml +++ b/core/res/res/values-television/themes_device_defaults.xml @@ -16,4 +16,6 @@ <resources> <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Leanback.Dialog.Alert" /> <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Leanback.Light.Dialog.Alert" /> + <style name="Theme.DeviceDefault.Autofill" parent="Theme.Material.Autofill" /> + <style name="Theme.DeviceDefault.Autofill.Save" parent="Theme.Material.Autofill.Save" /> </resources> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index da9fed080aed..095a632c4acd 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -137,6 +137,7 @@ <color name="notification_primary_text_color_light">@color/primary_text_default_material_light</color> <color name="notification_primary_text_color_dark">@color/primary_text_default_material_dark</color> <color name="notification_secondary_text_color_light">@color/primary_text_default_material_light</color> + <item name="notification_secondary_text_disabled_alpha" format="float" type="dimen">0.30</item> <color name="notification_secondary_text_color_dark">@color/primary_text_default_material_dark</color> <color name="notification_default_color_dark">@color/primary_text_default_material_light</color> <color name="notification_default_color_light">#a3202124</color> diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml index 3609fb82669a..2966aff6a9da 100644 --- a/core/res/res/values/colors_material.xml +++ b/core/res/res/values/colors_material.xml @@ -145,4 +145,8 @@ <color name="datepicker_default_view_animator_color_material_light">#fff2f2f2</color> <color name="datepicker_default_view_animator_color_material_dark">#ff303030</color> + <!-- Autofill colors --> + <color name="autofill_background_material_dark">@color/material_blue_grey_900</color> + <color name="autofill_background_material_light">@color/material_grey_50</color> + </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 909efeae600b..5c80d4d26563 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -647,6 +647,9 @@ <!-- Boolean indicating associated network selection is allowed --> <bool translatable="false" name="config_wifi_framework_enable_associated_network_selection">true</bool> + <!-- Boolean indicating whether single radio chain scan results are to be used for network selection --> + <bool translatable="false" name="config_wifi_framework_use_single_radio_chain_scan_results_network_selection">false</bool> + <!-- Boolean indicating that wifi only link configuratios that have exact same credentials (i.e PSK) --> <bool translatable="false" name="config_wifi_only_link_same_credential_configurations">true</bool> @@ -945,6 +948,16 @@ <!-- B y-intercept --> <item>-0.198650895</item> </string-array> + + <!-- Indicate available ColorDisplayController.COLOR_MODE_xxx. --> + <integer-array name="config_availableColorModes"> + <!-- Example: + <item>0</item> + <item>1</item> + <item>2</item> + --> + </integer-array> + <!-- Indicate whether to allow the device to suspend when the screen is off due to the proximity sensor. This resource should only be set to true if the sensor HAL correctly handles the proximity sensor as a wake-up source. @@ -2850,6 +2863,9 @@ <!-- For performance and storage reasons, limit the number of fingerprints per user --> <integer name="config_fingerprintMaxTemplatesPerUser">5</integer> + <!-- Specify if the fingerprint hardware support gestures--> + <bool name="config_fingerprintSupportsGestures">false</bool> + <!-- This config is used to force VoiceInteractionService to start on certain low ram devices. It declares the package name of VoiceInteractionService that should be started. --> <string translatable="false" name="config_forceVoiceInteractionServicePackage"></string> @@ -3175,6 +3191,9 @@ <!-- An array of packages for which notifications cannot be blocked. --> <string-array translatable="false" name="config_nonBlockableNotificationPackages" /> + <!-- An array of packages which can listen for notifications on low ram devices. --> + <string-array translatable="false" name="config_allowedManagedServicesOnLowRamDevices" /> + <!-- The default value for transition animation scale found in developer settings. 1.0 corresponds to 1x animator scale, 0 means that there will be no transition animations. Note that this is only a default and will be overridden by a diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index a135b28c196a..45814ea4473e 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -162,19 +162,14 @@ <!-- The margin on the start of the content view --> <dimen name="notification_content_margin_start">16dp</dimen> - <!-- The margin on the end of the content view - Keep in sync with notification_content_plus_picture_margin! --> + <!-- The margin on the end of the content view. --> <dimen name="notification_content_margin_end">16dp</dimen> - <!-- The margin on the end of the content view with a picture. - Keep in sync with notification_content_plus_picture_margin! --> - <dimen name="notification_content_picture_margin">56dp</dimen> + <!-- The inset of the reply icon. --> + <dimen name="notification_reply_inset">8dp</dimen> - <!-- The margin on the end of the content view with a picture, plus the standard - content end margin. - Keep equal to (notification_content_picture_margin + notification_content_margin_end)! - --> - <dimen name="notification_content_plus_picture_margin_end">72dp</dimen> + <!-- The margin for text at the end of the image view for media notifications --> + <dimen name="notification_media_image_margin_end">72dp</dimen> <!-- The additional margin on the sides of the ambient view. --> <dimen name="notification_extra_margin_ambient">16dp</dimen> @@ -536,7 +531,7 @@ <dimen name="floating_toolbar_menu_image_width">24dp</dimen> <dimen name="floating_toolbar_menu_image_button_width">56dp</dimen> <dimen name="floating_toolbar_menu_image_button_vertical_padding">12dp</dimen> - <dimen name="floating_toolbar_menu_button_side_padding">8dp</dimen> + <dimen name="floating_toolbar_menu_button_side_padding">11dp</dimen> <dimen name="floating_toolbar_overflow_image_button_width">60dp</dimen> <dimen name="floating_toolbar_overflow_side_padding">18dp</dimen> <dimen name="floating_toolbar_text_size">14sp</dimen> @@ -547,6 +542,7 @@ <dimen name="floating_toolbar_horizontal_margin">16dp</dimen> <dimen name="floating_toolbar_vertical_margin">8dp</dimen> <dimen name="content_rect_bottom_clip_allowance">20dp</dimen> + <dimen name="floating_toolbar_icon_text_spacing">8dp</dimen> <!-- Magnifier dimensions --> <dimen name="magnifier_width">100dp</dimen> @@ -616,7 +612,9 @@ <!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.--> <dimen name="notification_media_image_max_width">280dp</dimen> <!-- The size of the right icon --> - <dimen name="notification_right_icon_size">38dp</dimen> + <dimen name="notification_right_icon_size">36dp</dimen> + <!-- The alpha of a disabled notification button --> + <item type="dimen" format="float" name="notification_action_disabled_alpha">0.5</item> <!-- The maximum height of any image in a remote view. This is applied to all images in custom remoteviews. --> <dimen name="notification_custom_view_max_image_height_low_ram">208dp</dimen> @@ -631,10 +629,12 @@ <!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.--> <dimen name="notification_media_image_max_width_low_ram">100dp</dimen> <!-- The size of the right icon image when on low ram --> - <dimen name="notification_right_icon_size_low_ram">40dp</dimen> + <dimen name="notification_right_icon_size_low_ram">38dp</dimen> <dimen name="messaging_avatar_size">@dimen/notification_right_icon_size</dimen> + <dimen name="messaging_group_sending_progress_size">24dp</dimen> + <!-- Max width/height of the autofill data set picker as a fraction of the screen width/height --> <dimen name="autofill_dataset_picker_max_width">90%</dimen> <dimen name="autofill_dataset_picker_max_height">90%</dimen> diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml index c90a0df5d7b1..47d04edfc281 100644 --- a/core/res/res/values/ids.xml +++ b/core/res/res/values/ids.xml @@ -128,6 +128,7 @@ <item type="id" name="accessibilityActionContextClick" /> <item type="id" name="remote_input_tag" /> + <item type="id" name="pending_intent_tag" /> <item type="id" name="cross_task_transition" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 395b26935838..b92052b9ebde 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2196,8 +2196,8 @@ <!-- Text to show in the auto complete drop down list on a text view when the WebView can auto fill the entire form but the user has not configured an AutoFill profile [CHAR-LIMIT=19] --> <string name="setup_autofill">Set up Autofill</string> - <!-- Title of fullscreen autofill window [CHAR-LIMIT=80] --> - <string name="autofill_window_title">Autofill</string> + <!-- Title of fullscreen autofill window, including the name of which autofill service it is using [CHAR-LIMIT=NONE] --> + <string name="autofill_window_title">Autofill with <xliff:g id="serviceName" example="MyPass">%1$s</xliff:g></string> <!-- String used to separate FirstName and LastName when writing out a local name e.g. John<separator>Smith [CHAR-LIMIT=NONE]--> @@ -4514,7 +4514,10 @@ <!-- Notification shown when device owner silently deletes a package [CHAR LIMIT=NONE] --> <string name="package_deleted_device_owner">Deleted by your admin</string> - <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description --> + <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, with a "learn more" link. --> + <string name="battery_saver_description_with_learn_more">To extend your battery life, Battery Saver turns off some device features and restricts apps. <annotation id="url">Learn More</annotation></string> + + <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description, without a "learn more" link. --> <string name="battery_saver_description">To extend your battery life, Battery Saver turns off some device features and restricts apps.</string> <!-- [CHAR_LIMIT=NONE] Data saver: Feature description --> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 984461b06624..50a6ff313f9b 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1487,13 +1487,19 @@ please see styles_device_defaults.xml. <item name="successColor">@color/lock_pattern_view_success_color</item> </style> - <!-- @hide --> + <!-- @hide Autofill background for popup window (not for fullscreen) --> <style name="AutofillDatasetPicker"> <item name="elevation">4dp</item> <item name="background">@drawable/autofill_dataset_picker_background</item> </style> <!-- @hide --> + <style name="AutofillHalfScreenAnimation"> + <item name="android:windowEnterAnimation">@anim/slide_in_up</item> + <item name="android:windowExitAnimation">@anim/slide_out_down</item> + </style> + + <!-- @hide --> <style name="AutofillSaveAnimation"> <item name="android:windowEnterAnimation">@anim/slide_in_up</item> <item name="android:windowExitAnimation">@anim/slide_out_down</item> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index b8a046f79371..2d97db03d152 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -500,11 +500,15 @@ please see styles_device_defaults.xml. <style name="Widget.Material.Notification.ProgressBar" parent="Widget.Material.Light.ProgressBar.Horizontal" /> - <style name="Widget.Material.Notification.MessagingText" parent="Widget.Material.Light.TextView"> + <style name="Widget.Material.Notification.Text" parent="Widget.Material.Light.TextView"> + <item name="lineHeight">20sp</item> + <item name="textAppearance">@style/TextAppearance.Material.Notification</item> + </style> + + <style name="Widget.Material.Notification.MessagingText" parent="Widget.Material.Notification.Text"> <item name="layout_width">wrap_content</item> <item name="layout_height">wrap_content</item> - <item name="ellipsize">end</item> - <item name="textAppearance">@style/TextAppearance.Material.Notification</item> + <item name="ellipsize">end</item>z </style> <style name="Widget.Material.Notification.MessagingName" parent="Widget.Material.Light.TextView"> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 590f98800874..5298e5b66d5a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -334,6 +334,7 @@ <java-symbol type="bool" name="config_windowShowCircularMask" /> <java-symbol type="bool" name="config_windowEnableCircularEmulatorDisplayOverlay" /> <java-symbol type="bool" name="config_wifi_framework_enable_associated_network_selection" /> + <java-symbol type="bool" name="config_wifi_framework_use_single_radio_chain_scan_results_network_selection" /> <java-symbol type="bool" name="config_wifi_only_link_same_credential_configurations" /> <java-symbol type="bool" name="config_wifi_framework_enable_voice_call_sar_tx_power_limit" /> <java-symbol type="bool" name="config_wifi_enable_disconnection_debounce" /> @@ -662,6 +663,7 @@ <java-symbol type="string" name="autofill_state_re" /> <java-symbol type="string" name="autofill_this_form" /> <java-symbol type="string" name="autofill_username_re" /> + <java-symbol type="string" name="autofill_window_title" /> <java-symbol type="string" name="autofill_zip_4_re" /> <java-symbol type="string" name="autofill_zip_code" /> <java-symbol type="string" name="autofill_zip_code_re" /> @@ -2406,6 +2408,7 @@ <!-- Fingerprint config --> <java-symbol type="integer" name="config_fingerprintMaxTemplatesPerUser"/> + <java-symbol type="bool" name="config_fingerprintSupportsGestures"/> <!-- From various Material changes --> <java-symbol type="attr" name="titleTextAppearance" /> @@ -2574,6 +2577,7 @@ <java-symbol type="dimen" name="floating_toolbar_maximum_overflow_height" /> <java-symbol type="dimen" name="floating_toolbar_horizontal_margin" /> <java-symbol type="dimen" name="floating_toolbar_vertical_margin" /> + <java-symbol type="dimen" name="floating_toolbar_icon_text_spacing" /> <java-symbol type="dimen" name="content_rect_bottom_clip_allowance" /> <java-symbol type="drawable" name="ft_avd_tooverflow" /> <java-symbol type="drawable" name="ft_avd_toarrow" /> @@ -2615,6 +2619,7 @@ <java-symbol type="id" name="actions_container" /> <java-symbol type="id" name="smart_reply_container" /> <java-symbol type="id" name="remote_input_tag" /> + <java-symbol type="id" name="pending_intent_tag" /> <java-symbol type="attr" name="seekBarDialogPreferenceStyle" /> <java-symbol type="string" name="ext_media_status_removed" /> @@ -2668,8 +2673,10 @@ <java-symbol type="id" name="notification_material_reply_container" /> <java-symbol type="id" name="notification_material_reply_text_1" /> + <java-symbol type="id" name="notification_material_reply_text_1_container" /> <java-symbol type="id" name="notification_material_reply_text_2" /> <java-symbol type="id" name="notification_material_reply_text_3" /> + <java-symbol type="id" name="notification_material_reply_progress" /> <java-symbol type="string" name="notification_hidden_text" /> <java-symbol type="id" name="app_name_text" /> @@ -2689,7 +2696,7 @@ <java-symbol type="dimen" name="notification_header_shrink_min_width" /> <java-symbol type="dimen" name="notification_content_margin_start" /> <java-symbol type="dimen" name="notification_content_margin_end" /> - <java-symbol type="dimen" name="notification_content_picture_margin" /> + <java-symbol type="dimen" name="notification_reply_inset" /> <java-symbol type="dimen" name="notification_content_margin_top" /> <java-symbol type="dimen" name="notification_content_margin" /> <java-symbol type="dimen" name="notification_header_background_height" /> @@ -2873,8 +2880,9 @@ <java-symbol type="bool" name="config_supportPreRebootSecurityLogs" /> - <java-symbol type="dimen" name="notification_content_plus_picture_margin_end" /> + <java-symbol type="dimen" name="notification_media_image_margin_end" /> <java-symbol type="id" name="notification_action_list_margin_target" /> + <java-symbol type="dimen" name="notification_action_disabled_alpha" /> <!-- Pinner Service --> <java-symbol type="array" name="config_defaultPinnerServiceFiles" /> @@ -2956,6 +2964,7 @@ <java-symbol type="integer" name="config_nightDisplayColorTemperatureMax" /> <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficients" /> <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficientsNative" /> + <java-symbol type="array" name="config_availableColorModes" /> <!-- Default first user restrictions --> <java-symbol type="array" name="config_defaultFirstUserRestrictions" /> @@ -2972,6 +2981,8 @@ <java-symbol type="array" name="config_nonBlockableNotificationPackages" /> + <java-symbol type="array" name="config_allowedManagedServicesOnLowRamDevices" /> + <!-- Screen-size-dependent modes for picker dialogs. --> <java-symbol type="integer" name="time_picker_mode" /> <java-symbol type="integer" name="date_picker_mode" /> @@ -2999,6 +3010,7 @@ <java-symbol type="color" name="notification_secondary_text_color_dark" /> <java-symbol type="color" name="notification_default_color_light" /> <java-symbol type="color" name="notification_default_color_dark" /> + <java-symbol type="dimen" name="notification_secondary_text_disabled_alpha" /> <java-symbol type="string" name="app_category_game" /> <java-symbol type="string" name="app_category_audio" /> @@ -3045,13 +3057,13 @@ <java-symbol type="layout" name="autofill_dataset_picker"/> <java-symbol type="layout" name="autofill_dataset_picker_fullscreen"/> <java-symbol type="layout" name="autofill_dataset_picker_header_footer"/> - <java-symbol type="layout" name="autofill_dataset_picker_header_footer_fullscreen"/> <java-symbol type="id" name="autofill" /> - <java-symbol type="id" name="autofill_dataset_container"/> <java-symbol type="id" name="autofill_dataset_footer"/> <java-symbol type="id" name="autofill_dataset_header"/> + <java-symbol type="id" name="autofill_dataset_icon" /> <java-symbol type="id" name="autofill_dataset_list"/> <java-symbol type="id" name="autofill_dataset_picker"/> + <java-symbol type="id" name="autofill_dataset_title" /> <java-symbol type="id" name="autofill_save_custom_subtitle" /> <java-symbol type="id" name="autofill_save_icon" /> <java-symbol type="id" name="autofill_save_no" /> @@ -3076,6 +3088,7 @@ <java-symbol type="string" name="autofill_save_type_email_address" /> <java-symbol type="drawable" name="autofill_dataset_picker_background" /> <java-symbol type="style" name="AutofillDatasetPicker" /> + <java-symbol type="style" name="AutofillHalfScreenAnimation" /> <java-symbol type="style" name="AutofillSaveAnimation" /> <java-symbol type="dimen" name="autofill_dataset_picker_max_width"/> <java-symbol type="dimen" name="autofill_dataset_picker_max_height"/> @@ -3083,6 +3096,9 @@ <java-symbol type="dimen" name="autofill_save_icon_max_size"/> <java-symbol type="integer" name="autofill_max_visible_datasets" /> + <java-symbol type="style" name="Theme.DeviceDefault.Autofill" /> + <java-symbol type="style" name="Theme.DeviceDefault.Autofill.Save" /> + <java-symbol type="dimen" name="notification_big_picture_max_height"/> <java-symbol type="dimen" name="notification_big_picture_max_width"/> <java-symbol type="dimen" name="notification_media_image_max_width"/> @@ -3252,13 +3268,15 @@ <java-symbol type="id" name="clip_children_set_tag" /> <java-symbol type="id" name="clip_to_padding_tag" /> <java-symbol type="id" name="clip_children_tag" /> - <java-symbol type="drawable" name="ic_reply_notification_large" /> <java-symbol type="dimen" name="messaging_avatar_size" /> + <java-symbol type="dimen" name="messaging_group_sending_progress_size" /> <java-symbol type="dimen" name="messaging_image_rounding" /> <java-symbol type="dimen" name="messaging_image_min_size" /> <java-symbol type="dimen" name="messaging_image_max_height" /> <java-symbol type="dimen" name="messaging_image_extra_spacing" /> <java-symbol type="id" name="messaging_group_icon_container" /> + <java-symbol type="id" name="messaging_group_sending_progress" /> + <java-symbol type="id" name="messaging_group_sending_progress_container" /> <java-symbol type="integer" name="config_stableDeviceDisplayWidth" /> <java-symbol type="integer" name="config_stableDeviceDisplayHeight" /> @@ -3361,4 +3379,5 @@ <java-symbol type="id" name="user_loading_avatar" /> <java-symbol type="id" name="user_loading" /> + <java-symbol type="string" name="battery_saver_description_with_learn_more" /> </resources> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 92b2f3341ddd..14e5082bdebb 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1673,6 +1673,15 @@ easier. <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item> </style> + + <!-- @hide DeviceDefault theme for the autofill FillUi --> + <style name="Theme.DeviceDefault.Autofill" parent="Theme.Material.Autofill.Light"> + </style> + + <!-- @hide DeviceDefault theme for the autofill SaveUi --> + <style name="Theme.DeviceDefault.Autofill.Save" parent="Theme.Material.Autofill.Save.Light"> + </style> + <!-- DeviceDefault theme for the default system theme. --> <style name="Theme.DeviceDefault.System" parent="Theme.DeviceDefault.Light.DarkActionBar" /> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index 9b633fc94a8f..b3e33d5c4ee4 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -1417,4 +1417,25 @@ please see themes_device_defaults.xml. <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> <item name="colorSecondary">@color/secondary_material_settings</item> </style> + + <!-- @hide --> + <style name="Theme.Material.Autofill" parent="Theme.Material"> + <item name="colorBackground">@color/autofill_background_material_dark</item> + </style> + + <!-- @hide --> + <style name="Theme.Material.Autofill.Light" parent="Theme.Material.Light"> + <item name="colorBackground">@color/autofill_background_material_light</item> + </style> + + <!-- @hide --> + <style name="Theme.Material.Autofill.Save" parent="Theme.Material.Panel"> + <item name="colorBackground">@color/autofill_background_material_dark</item> + </style> + + <!-- @hide --> + <style name="Theme.Material.Autofill.Save.Light" parent="Theme.Material.Light.Panel"> + <item name="colorBackground">@color/autofill_background_material_light</item> + </style> + </resources> diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java index 370659eb99d9..fdaba089490e 100644 --- a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java +++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java @@ -123,6 +123,7 @@ public class RadioTunerTest { private void resetCallback() { verify(mCallback, atLeast(0)).onMetadataChanged(any()); verify(mCallback, atLeast(0)).onProgramInfoChanged(any()); + verify(mCallback, atLeast(0)).onProgramListChanged(); verifyNoMoreInteractions(mCallback); Mockito.reset(mCallback); } diff --git a/core/tests/coretests/res/layout/activity_text_view.xml b/core/tests/coretests/res/layout/activity_text_view.xml index d5be87dbae6b..056868392949 100644 --- a/core/tests/coretests/res/layout/activity_text_view.xml +++ b/core/tests/coretests/res/layout/activity_text_view.xml @@ -31,6 +31,8 @@ <TextView android:id="@+id/nonselectable_textview" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:focusable="false" + android:focusableInTouchMode="false" /> </LinearLayout> diff --git a/core/tests/coretests/src/android/app/usage/EventListTest.java b/core/tests/coretests/src/android/app/usage/EventListTest.java new file mode 100644 index 000000000000..9dc0d4309a8f --- /dev/null +++ b/core/tests/coretests/src/android/app/usage/EventListTest.java @@ -0,0 +1,130 @@ +/* + * 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 android.app.usage; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.Log; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Random; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class EventListTest { + private static final String TAG = EventListTest.class.getSimpleName(); + + private UsageEvents.Event getUsageEvent(long timeStamp) { + final UsageEvents.Event event = new UsageEvents.Event(); + event.mTimeStamp = timeStamp; + return event; + } + + private static String getListTimeStamps(EventList list) { + final StringBuilder builder = new StringBuilder("["); + for (int i = 0; i < list.size() - 1; i++) { + builder.append(list.get(i).mTimeStamp); + builder.append(", "); + } + builder.append(list.get(list.size() - 1).mTimeStamp); + builder.append("]"); + return builder.toString(); + } + + private static void assertSorted(EventList eventList) { + for (int i = 1; i < eventList.size(); i++) { + final long lastTimeStamp = eventList.get(i - 1).mTimeStamp; + if (eventList.get(i).mTimeStamp < lastTimeStamp) { + Log.e(TAG, "Unsorted timestamps in list: " + getListTimeStamps(eventList)); + fail("Timestamp " + eventList.get(i).mTimeStamp + " at " + i + + " follows larger timestamp " + lastTimeStamp); + } + } + } + + @Test + public void testInsertsSortedRandom() { + final Random random = new Random(128); + final EventList listUnderTest = new EventList(); + for (int i = 0; i < 100; i++) { + listUnderTest.insert(getUsageEvent(random.nextLong())); + } + assertSorted(listUnderTest); + } + + @Test + public void testInsertsSortedWithDuplicates() { + final Random random = new Random(256); + final EventList listUnderTest = new EventList(); + for (int i = 0; i < 10; i++) { + final long randomTimeStamp = random.nextLong(); + for (int j = 0; j < 10; j++) { + listUnderTest.insert(getUsageEvent(randomTimeStamp)); + } + } + assertSorted(listUnderTest); + } + + @Test + public void testFirstIndexOnOrAfter() { + final EventList listUnderTest = new EventList(); + listUnderTest.insert(getUsageEvent(2)); + listUnderTest.insert(getUsageEvent(5)); + listUnderTest.insert(getUsageEvent(5)); + listUnderTest.insert(getUsageEvent(5)); + listUnderTest.insert(getUsageEvent(8)); + assertTrue(listUnderTest.firstIndexOnOrAfter(1) == 0); + assertTrue(listUnderTest.firstIndexOnOrAfter(2) == 0); + assertTrue(listUnderTest.firstIndexOnOrAfter(3) == 1); + assertTrue(listUnderTest.firstIndexOnOrAfter(4) == 1); + assertTrue(listUnderTest.firstIndexOnOrAfter(5) == 1); + assertTrue(listUnderTest.firstIndexOnOrAfter(6) == 4); + assertTrue(listUnderTest.firstIndexOnOrAfter(7) == 4); + assertTrue(listUnderTest.firstIndexOnOrAfter(8) == 4); + assertTrue(listUnderTest.firstIndexOnOrAfter(9) == listUnderTest.size()); + assertTrue(listUnderTest.firstIndexOnOrAfter(100) == listUnderTest.size()); + + listUnderTest.clear(); + assertTrue(listUnderTest.firstIndexOnOrAfter(5) == 0); + assertTrue(listUnderTest.firstIndexOnOrAfter(100) == 0); + } + + @Test + public void testClear() { + final EventList listUnderTest = new EventList(); + for (int i = 1; i <= 100; i++) { + listUnderTest.insert(getUsageEvent(i)); + } + listUnderTest.clear(); + assertEquals(0, listUnderTest.size()); + } + + @Test + public void testSize() { + final EventList listUnderTest = new EventList(); + for (int i = 1; i <= 100; i++) { + listUnderTest.insert(getUsageEvent(i)); + } + assertEquals(100, listUnderTest.size()); + } +} diff --git a/core/tests/coretests/src/android/app/usage/TimeSparseArrayTest.java b/core/tests/coretests/src/android/app/usage/TimeSparseArrayTest.java deleted file mode 100644 index db4674070f1d..000000000000 --- a/core/tests/coretests/src/android/app/usage/TimeSparseArrayTest.java +++ /dev/null @@ -1,47 +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 android.app.usage; - -import static org.junit.Assert.assertTrue; - -import android.os.SystemClock; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class TimeSparseArrayTest { - @Test - public void testDuplicateKeysNotDropped() { - final TimeSparseArray<Integer> testTimeSparseArray = new TimeSparseArray<>(); - final long key = SystemClock.elapsedRealtime(); - for (int i = 0; i < 5; i++) { - testTimeSparseArray.put(key, i); - } - for (int i = 0; i < 5; i++) { - final int valueIndex = testTimeSparseArray.indexOfValue(i); - assertTrue("Value " + i + " not found; intended key: " + key , valueIndex >= 0); - final long keyForValue = testTimeSparseArray.keyAt(valueIndex); - assertTrue("Value " + i + " stored too far (at " + keyForValue + ") from intended key " - + key, Math.abs(keyForValue - key) < 100); - } - } -} diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 43e980e681db..dafd475700a8 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -98,6 +98,7 @@ public class SettingsBackupTest { private static final Set<String> BACKUP_BLACKLISTED_GLOBAL_SETTINGS = newHashSet( Settings.Global.ACTIVITY_MANAGER_CONSTANTS, + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, Settings.Global.ADB_ENABLED, Settings.Global.ADD_USERS_WHEN_LOCKED, Settings.Global.AIRPLANE_MODE_ON, diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java index a3c24cbe3fbd..c8a53cc86347 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java @@ -18,11 +18,22 @@ package android.view.textclassifier; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; import android.os.LocaleList; import android.service.textclassifier.TextClassifierService; import android.support.test.InstrumentationRegistry; @@ -35,6 +46,7 @@ import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; import java.util.Arrays; import java.util.Collections; @@ -305,7 +317,6 @@ public class TextClassificationManagerTest { public void testGetLocalTextClassifier() { assertTrue(mTcm.getTextClassifier(TextClassifier.LOCAL) instanceof TextClassifierImpl); } - @Test public void testGetSystemTextClassifier() { assertTrue( @@ -313,6 +324,48 @@ public class TextClassificationManagerTest { || mTcm.getTextClassifier(TextClassifier.SYSTEM) instanceof SystemTextClassifier); } + @Test + public void testCannotResolveIntent() { + final PackageManager fakePackageMgr = mock(PackageManager.class); + + ResolveInfo validInfo = mContext.getPackageManager().resolveActivity( + new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:+12122537077")), 0); + // Make packageManager fail when it gets the following intent: + ArgumentMatcher<Intent> toFailIntent = + intent -> intent.getAction().equals(Intent.ACTION_INSERT_OR_EDIT); + + when(fakePackageMgr.resolveActivity(any(Intent.class), anyInt())).thenReturn(validInfo); + when(fakePackageMgr.resolveActivity(argThat(toFailIntent), anyInt())).thenReturn(null); + + ContextWrapper fakeContext = new ContextWrapper(mContext) { + @Override + public PackageManager getPackageManager() { + return fakePackageMgr; + } + }; + + TextClassifier fallback = TextClassifier.NO_OP; + TextClassifier classifier = new TextClassifierImpl( + fakeContext, TextClassificationConstants.loadFromString(null), fallback); + + String text = "Contact me at +12122537077"; + String classifiedText = "+12122537077"; + int startIndex = text.indexOf(classifiedText); + int endIndex = startIndex + classifiedText.length(); + TextClassification.Request request = new TextClassification.Request.Builder( + text, startIndex, endIndex) + .setDefaultLocales(LOCALES) + .build(); + + TextClassification result = classifier.classifyText(request); + TextClassification fallbackResult = fallback.classifyText(request); + + // classifier should not totally fail in which case it returns a fallback result. + // It should skip the failing intent and return a result for non-failing intents. + assertFalse(result.getActions().isEmpty()); + assertNotSame(result, fallbackResult); + } + private boolean isTextClassifierDisabled() { return mClassifier == TextClassifier.NO_OP; } diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index 320a7acdb47c..bcb7cf393f33 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -318,40 +318,52 @@ public class TextViewActivityTest { onView(withId(R.id.textview)).perform(clickOnTextAtIndex(position)); sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); - } @Test public void testToolbarAppearsAfterLinkClickedNonselectable() throws Throwable { - TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview); - int position = (textLink.getStart() + textLink.getEnd()) / 2; + final TextView textView = mActivity.findViewById(R.id.nonselectable_textview); + final TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview); + final int position = (textLink.getStart() + textLink.getEnd()) / 2; + + onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position)); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarIsDisplayed(); + assertTrue(textView.hasSelection()); + + // toggle + onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position)); + sleepForFloatingToolbarPopup(); + assertFalse(textView.hasSelection()); + onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position)); sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); + assertTrue(textView.hasSelection()); + + // click outside + onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(0)); + sleepForFloatingToolbarPopup(); + assertFalse(textView.hasSelection()); } @Test public void testSelectionRemovedWhenNonselectableTextLosesFocus() throws Throwable { - // Add a link to both selectable and nonselectable TextViews: - TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.textview); - int selectablePosition = (textLink.getStart() + textLink.getEnd()) / 2; - textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview); - int nonselectablePosition = (textLink.getStart() + textLink.getEnd()) / 2; - TextView selectableTextView = mActivity.findViewById(R.id.textview); - TextView nonselectableTextView = mActivity.findViewById(R.id.nonselectable_textview); + final TextLinks.TextLink textLink = addLinkifiedTextToTextView(R.id.nonselectable_textview); + final int position = (textLink.getStart() + textLink.getEnd()) / 2; + final TextView textView = mActivity.findViewById(R.id.nonselectable_textview); + mActivityRule.runOnUiThread(() -> textView.setFocusableInTouchMode(true)); - onView(withId(R.id.nonselectable_textview)) - .perform(clickOnTextAtIndex(nonselectablePosition)); + onView(withId(R.id.nonselectable_textview)).perform(clickOnTextAtIndex(position)); sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); - assertTrue(nonselectableTextView.hasSelection()); + assertTrue(textView.hasSelection()); - onView(withId(R.id.textview)).perform(clickOnTextAtIndex(selectablePosition)); + mActivityRule.runOnUiThread(() -> textView.clearFocus()); + mInstrumentation.waitForIdleSync(); sleepForFloatingToolbarPopup(); - assertFloatingToolbarIsDisplayed(); - assertTrue(selectableTextView.hasSelection()); - assertFalse(nonselectableTextView.hasSelection()); + assertFalse(textView.hasSelection()); } @Test diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index 36e54adc4ff1..b68f6b1273b9 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -190,6 +190,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { @Override public void cancelCpuSyncDueToWakelockChange() { } + + @Override + public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) { + return null; + } } } diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 3cc92bcb6956..a465eeafa287 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -829,6 +829,17 @@ public class Canvas extends BaseCanvas { } /** + * DON'T USE THIS METHOD. It exists only to support a particular legacy behavior in + * the view system and will be removed as soon as that code is refactored to no longer + * depend on this behavior. + * @hide + */ + public boolean clipRectUnion(@NonNull Rect rect) { + return nClipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, + Region.Op.UNION.nativeInt); + } + + /** * Intersect the current clip with the specified rectangle, which is * expressed in local coordinates. * diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 66f2a3173eae..5ff49aba88ae 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -692,13 +692,13 @@ public class NinePatchDrawable extends Drawable { mPadding = new Rect(); } mPadding.left = Drawable.scaleFromDensity( - sourcePadding.left, sourceDensity, targetDensity, false); + sourcePadding.left, sourceDensity, targetDensity, true); mPadding.top = Drawable.scaleFromDensity( - sourcePadding.top, sourceDensity, targetDensity, false); + sourcePadding.top, sourceDensity, targetDensity, true); mPadding.right = Drawable.scaleFromDensity( - sourcePadding.right, sourceDensity, targetDensity, false); + sourcePadding.right, sourceDensity, targetDensity, true); mPadding.bottom = Drawable.scaleFromDensity( - sourcePadding.bottom, sourceDensity, targetDensity, false); + sourcePadding.bottom, sourceDensity, targetDensity, true); } else { mPadding = null; } diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 7d4e6f83ab0c..b3a3f455bac0 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -3504,13 +3504,14 @@ struct ResTable::PackageGroup { PackageGroup( ResTable* _owner, const String16& _name, uint32_t _id, - bool appAsLib, bool _isSystemAsset) + bool appAsLib, bool _isSystemAsset, bool _isDynamic) : owner(_owner) , name(_name) , id(_id) , largestTypeId(0) , dynamicRefTable(static_cast<uint8_t>(_id), appAsLib) , isSystemAsset(_isSystemAsset) + , isDynamic(_isDynamic) { } ~PackageGroup() { @@ -3614,6 +3615,7 @@ struct ResTable::PackageGroup // If the package group comes from a system asset. Used in // determining non-system locales. const bool isSystemAsset; + const bool isDynamic; }; ResTable::Theme::Theme(const ResTable& table) @@ -3982,6 +3984,11 @@ inline ssize_t ResTable::getResourcePackageIndex(uint32_t resID) const return ((ssize_t)mPackageMap[Res_GETPACKAGE(resID)+1])-1; } +inline ssize_t ResTable::getResourcePackageIndexFromPackage(uint8_t packageID) const +{ + return ((ssize_t)mPackageMap[packageID])-1; +} + status_t ResTable::add(const void* data, size_t size, const int32_t cookie, bool copyData) { return addInternal(data, size, NULL, 0, false, cookie, copyData); } @@ -4037,7 +4044,7 @@ status_t ResTable::add(ResTable* src, bool isSystemAsset) for (size_t i=0; i < src->mPackageGroups.size(); i++) { PackageGroup* srcPg = src->mPackageGroups[i]; PackageGroup* pg = new PackageGroup(this, srcPg->name, srcPg->id, - false /* appAsLib */, isSystemAsset || srcPg->isSystemAsset); + false /* appAsLib */, isSystemAsset || srcPg->isSystemAsset, srcPg->isDynamic); for (size_t j=0; j<srcPg->packages.size(); j++) { pg->packages.add(srcPg->packages[j]); } @@ -6277,6 +6284,68 @@ bool ResTable::getResourceFlags(uint32_t resID, uint32_t* outFlags) const { return true; } +bool ResTable::isPackageDynamic(uint8_t packageID) const { + if (mError != NO_ERROR) { + return false; + } + if (packageID == 0) { + ALOGW("Invalid package number 0x%08x", packageID); + return false; + } + + const ssize_t p = getResourcePackageIndexFromPackage(packageID); + + if (p < 0) { + ALOGW("Unknown package number 0x%08x", packageID); + return false; + } + + const PackageGroup* const grp = mPackageGroups[p]; + if (grp == NULL) { + ALOGW("Bad identifier for package number 0x%08x", packageID); + return false; + } + + return grp->isDynamic; +} + +bool ResTable::isResourceDynamic(uint32_t resID) const { + if (mError != NO_ERROR) { + return false; + } + + const ssize_t p = getResourcePackageIndex(resID); + const int t = Res_GETTYPE(resID); + const int e = Res_GETENTRY(resID); + + if (p < 0) { + if (Res_GETPACKAGE(resID)+1 == 0) { + ALOGW("No package identifier for resource number 0x%08x", resID); + } else { + ALOGW("No known package for resource number 0x%08x", resID); + } + return false; + } + if (t < 0) { + ALOGW("No type identifier for resource number 0x%08x", resID); + return false; + } + + const PackageGroup* const grp = mPackageGroups[p]; + if (grp == NULL) { + ALOGW("Bad identifier for resource number 0x%08x", resID); + return false; + } + + Entry entry; + status_t err = getEntry(grp, t, e, NULL, &entry); + if (err != NO_ERROR) { + return false; + } + + return grp->isDynamic; +} + static bool keyCompare(const ResTable_sparseTypeEntry& entry , uint16_t entryIdx) { return dtohs(entry.idx) < entryIdx; } @@ -6520,12 +6589,14 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, id = targetPackageId; } + bool isDynamic = false; if (id >= 256) { LOG_ALWAYS_FATAL("Package id out of range"); return NO_ERROR; } else if (id == 0 || (id == 0x7f && appAsLib) || isSystemAsset) { // This is a library or a system asset, so assign an ID id = mNextPackageId++; + isDynamic = true; } PackageGroup* group = NULL; @@ -6553,10 +6624,9 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, size_t idx = mPackageMap[id]; if (idx == 0) { idx = mPackageGroups.size() + 1; - char16_t tmpName[sizeof(pkg->name)/sizeof(pkg->name[0])]; strcpy16_dtoh(tmpName, pkg->name, sizeof(pkg->name)/sizeof(pkg->name[0])); - group = new PackageGroup(this, String16(tmpName), id, appAsLib, isSystemAsset); + group = new PackageGroup(this, String16(tmpName), id, appAsLib, isSystemAsset, isDynamic); if (group == NULL) { delete package; return (mError=NO_MEMORY); diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index bc0a07a512f9..63b9e3ac93f0 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -1716,6 +1716,18 @@ public: bool getResourceFlags(uint32_t resID, uint32_t* outFlags) const; /** + * Returns whether or not the package for the given resource has been dynamically assigned. + * If the resource can't be found, returns 'false'. + */ + bool isResourceDynamic(uint32_t resID) const; + + /** + * Returns whether or not the given package has been dynamically assigned. + * If the package can't be found, returns 'false'. + */ + bool isPackageDynamic(uint8_t packageID) const; + + /** * Retrieve the value of a resource. If the resource is found, returns a * value >= 0 indicating the table it is in (for use with * getTableStringBlock() and getTableCookie()) and fills in 'outValue'. If @@ -2024,6 +2036,7 @@ private: bool appAsLib, const int32_t cookie, bool copyData, bool isSystemAsset=false); ssize_t getResourcePackageIndex(uint32_t resID) const; + ssize_t getResourcePackageIndexFromPackage(uint8_t packageID) const; status_t getEntry( const PackageGroup* packageGroup, int typeIndex, int entryIndex, diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp index 795ec5bd4f76..263d249d20e9 100644 --- a/libs/hwui/hwui/Bitmap.cpp +++ b/libs/hwui/hwui/Bitmap.cpp @@ -296,6 +296,11 @@ void Bitmap::getSkBitmap(SkBitmap* outBitmap) { outBitmap->allocPixels(info()); } uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap); + if (mInfo.colorSpace()) { + sk_sp<SkPixelRef> pixelRef = sk_ref_sp(outBitmap->pixelRef()); + outBitmap->setInfo(mInfo); + outBitmap->setPixelRef(std::move(pixelRef), 0, 0); + } return; } outBitmap->setInfo(mInfo, rowBytes()); diff --git a/location/java/android/location/GnssMeasurementsEvent.java b/location/java/android/location/GnssMeasurementsEvent.java index 072a7fefb665..34c73549c5df 100644 --- a/location/java/android/location/GnssMeasurementsEvent.java +++ b/location/java/android/location/GnssMeasurementsEvent.java @@ -74,6 +74,13 @@ public final class GnssMeasurementsEvent implements Parcelable { /** * The client is not allowed to register for GNSS Measurements in general or in the * requested mode. + * + * <p>Such a status is returned when a client tries to request a functionality from the GNSS + * chipset while another client has an ongoing request that does not allow such + * functionality to be performed. + * + * <p>If such a status is received, one would try again at a later time point where no + * other client is having a conflicting request. */ public static final int STATUS_NOT_ALLOWED = 3; diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index f476a6ccb257..8a757b86a5fa 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -488,6 +488,7 @@ public class MediaScanner implements AutoCloseable { private int mCompilation; private boolean mIsDrm; private boolean mNoMedia; // flag to suppress file from appearing in media tables + private boolean mScanSuccess; private int mWidth; private int mHeight; @@ -502,6 +503,7 @@ public class MediaScanner implements AutoCloseable { mFileType = 0; mFileSize = fileSize; mIsDrm = false; + mScanSuccess = true; if (!isDirectory) { if (!noMedia && isNoMediaFile(path)) { @@ -623,14 +625,6 @@ public class MediaScanner implements AutoCloseable { if (noMedia) { result = endFile(entry, false, false, false, false, false); } else { - String lowpath = path.toLowerCase(Locale.ROOT); - boolean ringtones = (lowpath.indexOf(RINGTONES_DIR) > 0); - boolean notifications = (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); - boolean alarms = (lowpath.indexOf(ALARMS_DIR) > 0); - boolean podcasts = (lowpath.indexOf(PODCAST_DIR) > 0); - boolean music = (lowpath.indexOf(MUSIC_DIR) > 0) || - (!ringtones && !notifications && !alarms && !podcasts); - boolean isaudio = MediaFile.isAudioFileType(mFileType); boolean isvideo = MediaFile.isVideoFileType(mFileType); boolean isimage = MediaFile.isImageFileType(mFileType); @@ -642,13 +636,22 @@ public class MediaScanner implements AutoCloseable { // we only extract metadata for audio and video files if (isaudio || isvideo) { - processFile(path, mimeType, this); + mScanSuccess = processFile(path, mimeType, this); } if (isimage) { - processImageFile(path); + mScanSuccess = processImageFile(path); } + String lowpath = path.toLowerCase(Locale.ROOT); + boolean ringtones = mScanSuccess && (lowpath.indexOf(RINGTONES_DIR) > 0); + boolean notifications = mScanSuccess && + (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); + boolean alarms = mScanSuccess && (lowpath.indexOf(ALARMS_DIR) > 0); + boolean podcasts = mScanSuccess && (lowpath.indexOf(PODCAST_DIR) > 0); + boolean music = mScanSuccess && ((lowpath.indexOf(MUSIC_DIR) > 0) || + (!ringtones && !notifications && !alarms && !podcasts)); + result = endFile(entry, ringtones, notifications, alarms, music, podcasts); } } @@ -816,16 +819,18 @@ public class MediaScanner implements AutoCloseable { return genreTagValue; } - private void processImageFile(String path) { + private boolean processImageFile(String path) { try { mBitmapOptions.outWidth = 0; mBitmapOptions.outHeight = 0; BitmapFactory.decodeFile(path, mBitmapOptions); mWidth = mBitmapOptions.outWidth; mHeight = mBitmapOptions.outHeight; + return mWidth > 0 && mHeight > 0; } catch (Throwable th) { // ignore; } + return false; } public void setMimeType(String mimeType) { @@ -878,7 +883,7 @@ public class MediaScanner implements AutoCloseable { } } else if (MediaFile.isImageFileType(mFileType)) { // FIXME - add DESCRIPTION - } else if (MediaFile.isAudioFileType(mFileType)) { + } else if (mScanSuccess && MediaFile.isAudioFileType(mFileType)) { map.put(Audio.Media.ARTIST, (mArtist != null && mArtist.length() > 0) ? mArtist : MediaStore.UNKNOWN_STRING); map.put(Audio.Media.ALBUM_ARTIST, (mAlbumArtist != null && @@ -894,6 +899,10 @@ public class MediaScanner implements AutoCloseable { map.put(Audio.Media.DURATION, mDuration); map.put(Audio.Media.COMPILATION, mCompilation); } + if (!mScanSuccess) { + // force mediaprovider to not determine the media type from the mime type + map.put(Files.FileColumns.MEDIA_TYPE, 0); + } } return map; } @@ -1001,7 +1010,7 @@ public class MediaScanner implements AutoCloseable { Uri tableUri = mFilesUri; MediaInserter inserter = mMediaInserter; - if (!mNoMedia) { + if (mScanSuccess && !mNoMedia) { if (MediaFile.isVideoFileType(mFileType)) { tableUri = mVideoUri; } else if (MediaFile.isImageFileType(mFileType)) { @@ -1071,7 +1080,7 @@ public class MediaScanner implements AutoCloseable { values.remove(MediaStore.MediaColumns.DATA); int mediaType = 0; - if (!MediaScanner.isNoMediaPath(entry.mPath)) { + if (mScanSuccess && !MediaScanner.isNoMediaPath(entry.mPath)) { int fileType = MediaFile.getFileTypeForMimeType(mMimeType); if (MediaFile.isAudioFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_AUDIO; @@ -1890,7 +1899,7 @@ public class MediaScanner implements AutoCloseable { } private native void processDirectory(String path, MediaScannerClient client); - private native void processFile(String path, String mimeType, MediaScannerClient client); + private native boolean processFile(String path, String mimeType, MediaScannerClient client); private native void setLocale(String locale); public native byte[] extractAlbumArt(FileDescriptor fd); diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 000317e688da..16f6284b6031 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -1261,6 +1261,11 @@ static void android_media_MediaCodec_setInputSurface( sp<PersistentSurface> persistentSurface = android_media_MediaCodec_getPersistentInputSurface(env, object); + if (persistentSurface == NULL) { + throwExceptionAsNecessary( + env, BAD_VALUE, ACTION_CODE_FATAL, "input surface not valid"); + return; + } status_t err = codec->setInputSurface(persistentSurface); if (err != NO_ERROR) { throwExceptionAsNecessary(env, err); diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp index 3b475b2d70c8..c0ceb0152271 100644 --- a/media/jni/android_media_MediaScanner.cpp +++ b/media/jni/android_media_MediaScanner.cpp @@ -264,7 +264,7 @@ android_media_MediaScanner_processDirectory( env->ReleaseStringUTFChars(path, pathStr); } -static void +static jboolean android_media_MediaScanner_processFile( JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client) @@ -275,17 +275,17 @@ android_media_MediaScanner_processFile( MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); - return; + return false; } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); - return; + return false; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory - return; + return false; } const char *mimeTypeStr = @@ -293,7 +293,7 @@ android_media_MediaScanner_processFile( if (mimeType && mimeTypeStr == NULL) { // Out of memory // ReleaseStringUTFChars can be called with an exception pending. env->ReleaseStringUTFChars(path, pathStr); - return; + return false; } MyMediaScannerClient myClient(env, client); @@ -305,6 +305,7 @@ android_media_MediaScanner_processFile( if (mimeType) { env->ReleaseStringUTFChars(mimeType, mimeTypeStr); } + return result != MEDIA_SCAN_RESULT_ERROR; } static void @@ -421,7 +422,7 @@ static const JNINativeMethod gMethods[] = { { "processFile", - "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V", + "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)Z", (void *)android_media_MediaScanner_processFile }, diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index 0e2a0e00192d..91c04fa65e24 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -321,6 +321,7 @@ public class CaptivePortalLoginActivity extends Activity { // TODO: reuse NetworkMonitor facilities for consistent captive portal detection. new Thread(new Runnable() { public void run() { + final Network network = ResolvUtil.makeNetworkWithPrivateDnsBypass(mNetwork); // Give time for captive portal to open. try { Thread.sleep(1000); @@ -329,7 +330,7 @@ public class CaptivePortalLoginActivity extends Activity { HttpURLConnection urlConnection = null; int httpResponseCode = 500; try { - urlConnection = (HttpURLConnection) mNetwork.openConnection(mUrl); + urlConnection = (HttpURLConnection) network.openConnection(mUrl); urlConnection.setInstanceFollowRedirects(false); urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS); urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS); diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java index aeb4a856e0d8..8bab3ca05dd6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java @@ -46,6 +46,7 @@ import android.widget.TextView; import com.android.internal.widget.LockPatternUtils; import java.util.List; +import java.util.Objects; /** * Utility class to host methods usable in adding a restricted padlock icon and showing admin @@ -90,29 +91,29 @@ public class RestrictedLockUtils { // Restriction is not enforced. return null; } else if (enforcingUsers.size() > 1) { - return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN; + return EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction); } final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource(); final int adminUserId = enforcingUsers.get(0).getUserHandle().getIdentifier(); - if (restrictionSource == UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) { // Check if it is a profile owner of the user under consideration. if (adminUserId == userId) { - return getProfileOwner(context, adminUserId); + return getProfileOwner(context, userRestriction, adminUserId); } else { // Check if it is a profile owner of a managed profile of the current user. // Otherwise it is in a separate user and we return a default EnforcedAdmin. final UserInfo parentUser = um.getProfileParent(adminUserId); return (parentUser != null && parentUser.id == userId) - ? getProfileOwner(context, adminUserId) - : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN; + ? getProfileOwner(context, userRestriction, adminUserId) + : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction); } } else if (restrictionSource == UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) { // When the restriction is enforced by device owner, return the device owner admin only // if the admin is for the {@param userId} otherwise return a default EnforcedAdmin. return adminUserId == userId - ? getDeviceOwner(context) : EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN; + ? getDeviceOwner(context, userRestriction) + : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction); } // If the restriction is enforced by system then return null. @@ -406,7 +407,6 @@ public class RestrictedLockUtils { * or {@code null} if no quality requirements are set. If the requirements are set by * multiple device admins, then the admin component will be set to {@code null} and userId to * {@link UserHandle#USER_NULL}. - * */ public static EnforcedAdmin checkIfPasswordQualityIsSet(Context context, int userId) { final LockSettingCheck check = @@ -518,6 +518,11 @@ public class RestrictedLockUtils { } public static EnforcedAdmin getProfileOrDeviceOwner(Context context, int userId) { + return getProfileOrDeviceOwner(context, null, userId); + } + + public static EnforcedAdmin getProfileOrDeviceOwner( + Context context, String enforcedRestriction, int userId) { if (userId == UserHandle.USER_NULL) { return null; } @@ -528,18 +533,22 @@ public class RestrictedLockUtils { } ComponentName adminComponent = dpm.getProfileOwnerAsUser(userId); if (adminComponent != null) { - return new EnforcedAdmin(adminComponent, userId); + return new EnforcedAdmin(adminComponent, enforcedRestriction, userId); } if (dpm.getDeviceOwnerUserId() == userId) { adminComponent = dpm.getDeviceOwnerComponentOnAnyUser(); if (adminComponent != null) { - return new EnforcedAdmin(adminComponent, userId); + return new EnforcedAdmin(adminComponent, enforcedRestriction, userId); } } return null; } public static EnforcedAdmin getDeviceOwner(Context context) { + return getDeviceOwner(context, null); + } + + private static EnforcedAdmin getDeviceOwner(Context context, String enforcedRestriction) { final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( Context.DEVICE_POLICY_SERVICE); if (dpm == null) { @@ -547,12 +556,18 @@ public class RestrictedLockUtils { } ComponentName adminComponent = dpm.getDeviceOwnerComponentOnAnyUser(); if (adminComponent != null) { - return new EnforcedAdmin(adminComponent, dpm.getDeviceOwnerUserId()); + return new EnforcedAdmin( + adminComponent, enforcedRestriction, dpm.getDeviceOwnerUserId()); } return null; } private static EnforcedAdmin getProfileOwner(Context context, int userId) { + return getProfileOwner(context, null, userId); + } + + private static EnforcedAdmin getProfileOwner( + Context context, String enforcedRestriction, int userId) { if (userId == UserHandle.USER_NULL) { return null; } @@ -563,7 +578,7 @@ public class RestrictedLockUtils { } ComponentName adminComponent = dpm.getProfileOwnerAsUser(userId); if (adminComponent != null) { - return new EnforcedAdmin(adminComponent, userId); + return new EnforcedAdmin(adminComponent, enforcedRestriction, userId); } return null; } @@ -626,6 +641,7 @@ public class RestrictedLockUtils { && isCurrentUserOrProfile(context, admin.userId)) { targetUserId = admin.userId; } + intent.putExtra(DevicePolicyManager.EXTRA_RESTRICTION, admin.enforcedRestriction); context.startActivityAsUser(intent, new UserHandle(targetUserId)); } @@ -700,53 +716,71 @@ public class RestrictedLockUtils { } public static class EnforcedAdmin { + @Nullable public ComponentName component = null; + /** + * The restriction enforced by admin. It could be any user restriction or policy like + * {@link DevicePolicyManager#POLICY_DISABLE_CAMERA}. + */ + @Nullable + public String enforcedRestriction = null; public int userId = UserHandle.USER_NULL; // We use this to represent the case where a policy is enforced by multiple admins. public final static EnforcedAdmin MULTIPLE_ENFORCED_ADMIN = new EnforcedAdmin(); + public static EnforcedAdmin createDefaultEnforcedAdminWithRestriction( + String enforcedRestriction) { + EnforcedAdmin enforcedAdmin = new EnforcedAdmin(); + enforcedAdmin.enforcedRestriction = enforcedRestriction; + return enforcedAdmin; + } + public EnforcedAdmin(ComponentName component, int userId) { this.component = component; this.userId = userId; } + public EnforcedAdmin(ComponentName component, String enforcedRestriction, int userId) { + this.component = component; + this.enforcedRestriction = enforcedRestriction; + this.userId = userId; + } + public EnforcedAdmin(EnforcedAdmin other) { if (other == null) { throw new IllegalArgumentException(); } this.component = other.component; + this.enforcedRestriction = other.enforcedRestriction; this.userId = other.userId; } - public EnforcedAdmin() {} + public EnforcedAdmin() { + } @Override - public boolean equals(Object object) { - if (object == this) return true; - if (!(object instanceof EnforcedAdmin)) return false; - EnforcedAdmin other = (EnforcedAdmin) object; - if (userId != other.userId) { - return false; - } - if ((component == null && other.component == null) || - (component != null && component.equals(other.component))) { - return true; - } - return false; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnforcedAdmin that = (EnforcedAdmin) o; + return userId == that.userId && + Objects.equals(component, that.component) && + Objects.equals(enforcedRestriction, that.enforcedRestriction); } @Override - public String toString() { - return "EnforcedAdmin{component=" + component + ",userId=" + userId + "}"; + public int hashCode() { + return Objects.hash(component, enforcedRestriction, userId); } - public void copyTo(EnforcedAdmin other) { - if (other == null) { - throw new IllegalArgumentException(); - } - other.component = component; - other.userId = userId; + @Override + public String toString() { + return "EnforcedAdmin{" + + "component=" + component + + ", enforcedRestriction='" + enforcedRestriction + + ", userId=" + userId + + '}'; } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java index 5f7ba586fbad..38c8a883d89c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java @@ -24,6 +24,7 @@ import android.content.Context; import android.os.ParcelUuid; import android.util.Log; +import java.util.List; import java.util.Set; /** @@ -248,4 +249,8 @@ public class LocalBluetoothAdapter { public int getMaxConnectedAudioDevices() { return mAdapter.getMaxConnectedAudioDevices(); } + + public List<Integer> getSupportedProfiles() { + return mAdapter.getSupportedProfiles(); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 11854b1ce86f..0715d6927d2a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -40,6 +40,7 @@ import com.android.internal.R; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; @@ -158,9 +159,13 @@ public class LocalBluetoothProfileManager { addProfile(mPbapProfile, PbapServerProfile.NAME, BluetoothPbap.ACTION_CONNECTION_STATE_CHANGED); - mHearingAidProfile = new HearingAidProfile(mContext, mLocalAdapter, mDeviceManager, this); - addProfile(mHearingAidProfile, HearingAidProfile.NAME, - BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + List<Integer> supportedList = mLocalAdapter.getSupportedProfiles(); + if (supportedList.contains(BluetoothProfile.HEARING_AID)) { + mHearingAidProfile = new HearingAidProfile(mContext, mLocalAdapter, mDeviceManager, + this); + addProfile(mHearingAidProfile, HearingAidProfile.NAME, + BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + } if (DEBUG) Log.d(TAG, "LocalBluetoothProfileManager construction complete"); } diff --git a/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java new file mode 100644 index 000000000000..55723f9d8ed4 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java @@ -0,0 +1,101 @@ +/* + * 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.settingslib.display; + +import android.util.MathUtils; + +public class BrightnessUtils { + + public static final int GAMMA_SPACE_MAX = 1023; + + // Hybrid Log Gamma constant values + private static final float R = 0.5f; + private static final float A = 0.17883277f; + private static final float B = 0.28466892f; + private static final float C = 0.55991073f; + + /** + * A function for converting from the gamma space that the slider works in to the + * linear space that the setting works in. + * + * The gamma space effectively provides us a way to make linear changes to the slider that + * result in linear changes in perception. If we made changes to the slider in the linear space + * then we'd see an approximately logarithmic change in perception (c.f. Fechner's Law). + * + * Internally, this implements the Hybrid Log Gamma electro-optical transfer function, which is + * a slight improvement to the typical gamma transfer function for displays whose max + * brightness exceeds the 120 nit reference point, but doesn't set a specific reference + * brightness like the PQ function does. + * + * Note that this transfer function is only valid if the display's backlight value is a linear + * control. If it's calibrated to be something non-linear, then a different transfer function + * should be used. + * + * @param val The slider value. + * @param min The minimum acceptable value for the setting. + * @param max The maximum acceptable value for the setting. + * @return The corresponding setting value. + */ + public static final int convertGammaToLinear(int val, int min, int max) { + final float normalizedVal = MathUtils.norm(0, GAMMA_SPACE_MAX, val); + final float ret; + if (normalizedVal <= R) { + ret = MathUtils.sq(normalizedVal / R); + } else { + ret = MathUtils.exp((normalizedVal - C) / A) + B; + } + + // HLG is normalized to the range [0, 12], so we need to re-normalize to the range [0, 1] + // in order to derive the correct setting value. + return Math.round(MathUtils.lerp(min, max, ret / 12)); + } + + /** + * A function for converting from the linear space that the setting works in to the + * gamma space that the slider works in. + * + * The gamma space effectively provides us a way to make linear changes to the slider that + * result in linear changes in perception. If we made changes to the slider in the linear space + * then we'd see an approximately logarithmic change in perception (c.f. Fechner's Law). + * + * Internally, this implements the Hybrid Log Gamma opto-electronic transfer function, which is + * a slight improvement to the typical gamma transfer function for displays whose max + * brightness exceeds the 120 nit reference point, but doesn't set a specific reference + * brightness like the PQ function does. + * + * Note that this transfer function is only valid if the display's backlight value is a linear + * control. If it's calibrated to be something non-linear, then a different transfer function + * should be used. + * + * @param val The brightness setting value. + * @param min The minimum acceptable value for the setting. + * @param max The maximum acceptable value for the setting. + * @return The corresponding slider value + */ + public static final int convertLinearToGamma(int val, int min, int max) { + // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1] + final float normalizedVal = MathUtils.norm(min, max, val) * 12; + final float ret; + if (normalizedVal <= 1f) { + ret = MathUtils.sqrt(normalizedVal) * R; + } else { + ret = A * MathUtils.log(normalizedVal - B) + C; + } + + return Math.round(MathUtils.lerp(0, GAMMA_SPACE_MAX, ret)); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java index 113256ff929b..e2faf6a01197 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java @@ -354,20 +354,15 @@ public final class UserManagerHelper { return; } - if (userInfo.isGuest()) { - switchToGuest(userInfo.name); - return; - } - switchToUserId(userInfo.id); } /** - * Creates a guest session and switches into the guest session. + * Creates a new guest session and switches into the guest session. * * @param guestName Username for the guest user. */ - public void switchToGuest(String guestName) { + public void startNewGuestSession(String guestName) { UserInfo guest = mUserManager.createGuest(mContext, guestName); if (guest == null) { // Couldn't create user, most likely because there are too many, but we haven't @@ -375,6 +370,7 @@ public final class UserManagerHelper { Log.w(TAG, "can't create user."); return; } + assignDefaultIcon(guest); switchToUserId(guest.id); } @@ -417,6 +413,27 @@ public final class UserManagerHelper { mUserManager.setUserName(user.id, name); } + /** + * Gets a bitmap representing the user's default avatar. + * + * @param userInfo User whose avatar should be returned. + * @return Default user icon + */ + public Bitmap getUserDefaultIcon(UserInfo userInfo) { + return UserIcons.convertToBitmap( + UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false)); + } + + /** + * Gets a bitmap representing the default icon for a Guest user. + * + * @return Degault guest icon + */ + public Bitmap getGuestDefaultIcon() { + return UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon( + mContext.getResources(), UserHandle.USER_NULL, false)); + } + private void registerReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_REMOVED); @@ -435,8 +452,7 @@ public final class UserManagerHelper { * @return Bitmap that has been assigned to the user. */ private Bitmap assignDefaultIcon(UserInfo userInfo) { - Bitmap bitmap = UserIcons.convertToBitmap( - UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false)); + Bitmap bitmap = userInfo.isGuest() ? getGuestDefaultIcon() : getUserDefaultIcon(userInfo); mUserManager.setUserIcon(userInfo.id, bitmap); return bitmap; } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java index 15f77703054d..54510b27e58d 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java @@ -247,13 +247,13 @@ public class UserManagerHelperTest { } @Test - public void switchToGuest() { - mHelper.switchToGuest("Test Guest"); + public void startNewGuestSession() { + mHelper.startNewGuestSession("Test Guest"); verify(mUserManager).createGuest(mContext, "Test Guest"); UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST); when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo); - mHelper.switchToGuest("Test Guest"); + mHelper.startNewGuestSession("Test Guest"); verify(mActivityManager).switchUser(21); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java index 5f6086897d76..710dbc221f07 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedLockUtilsTest.java @@ -32,6 +32,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.os.UserHandle; import android.os.UserManager; import org.junit.Before; @@ -42,6 +43,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; +import java.util.Collections; @RunWith(SettingsLibRobolectricTestRunner.class) public class RestrictedLockUtilsTest { @@ -77,6 +79,42 @@ public class RestrictedLockUtilsTest { } @Test + public void checkIfRestrictionEnforced_deviceOwner() { + UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId, + UserManager.RESTRICTION_SOURCE_DEVICE_OWNER); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + when(mUserManager.getUserRestrictionSources(userRestriction, + UserHandle.of(mUserId))). + thenReturn(Collections.singletonList(enforcingUser)); + setUpDeviceOwner(mAdmin1); + + EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext, + userRestriction, mUserId); + + assertThat(enforcedAdmin).isNotNull(); + assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction); + assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); + } + + @Test + public void checkIfRestrictionEnforced_profileOwner() { + UserManager.EnforcingUser enforcingUser = new UserManager.EnforcingUser(mUserId, + UserManager.RESTRICTION_SOURCE_PROFILE_OWNER); + final String userRestriction = UserManager.DISALLOW_UNINSTALL_APPS; + when(mUserManager.getUserRestrictionSources(userRestriction, + UserHandle.of(mUserId))). + thenReturn(Collections.singletonList(enforcingUser)); + setUpProfileOwner(mAdmin1, mUserId); + + EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext, + userRestriction, mUserId); + + assertThat(enforcedAdmin).isNotNull(); + assertThat(enforcedAdmin.enforcedRestriction).isEqualTo(userRestriction); + assertThat(enforcedAdmin.component).isEqualTo(mAdmin1); + } + + @Test public void checkIfDevicePolicyServiceDisabled_noEnforceAdminForManagedProfile() { when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(null); final EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfAccountManagementDisabled( @@ -263,4 +301,12 @@ public class RestrictedLockUtilsTest { when(mDevicePolicyManager.getActiveAdminsAsUser(userId)) .thenReturn(Arrays.asList(activeAdmins)); } + + private void setUpDeviceOwner(ComponentName admin) { + when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(admin); + } + + private void setUpProfileOwner(ComponentName admin, int userId) { + when(mDevicePolicyManager.getProfileOwnerAsUser(userId)).thenReturn(admin); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/display/BrightnessUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/display/BrightnessUtilsTest.java new file mode 100644 index 000000000000..eb7ad6d919cf --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/display/BrightnessUtilsTest.java @@ -0,0 +1,52 @@ +/* + * 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.settingslib.display; + +import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX; +import static com.google.common.truth.Truth.assertThat; + +import com.android.settingslib.SettingsLibRobolectricTestRunner; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(SettingsLibRobolectricTestRunner.class) +public class BrightnessUtilsTest { + + private static final int MIN = 1; + private static final int MAX = 255; + + @Test + public void linearToGamma_minValue_shouldReturn0() { + assertThat(BrightnessUtils.convertLinearToGamma(MIN, MIN, MAX)).isEqualTo(0); + } + + @Test + public void linearToGamma_maxValue_shouldReturnGammaSpaceMax() { + assertThat(BrightnessUtils.convertLinearToGamma(MAX, MIN, MAX)).isEqualTo(GAMMA_SPACE_MAX); + } + + @Test + public void gammaToLinear_minValue_shouldReturnMin() { + assertThat(BrightnessUtils.convertGammaToLinear(MIN, MIN, MAX)).isEqualTo(MIN); + } + + @Test + public void gammaToLinear_gammaSpaceValue_shouldReturnMax() { + assertThat(BrightnessUtils.convertGammaToLinear(GAMMA_SPACE_MAX, MIN, MAX)).isEqualTo(MAX); + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java index f2ea3a4a3d87..890abefddd73 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java @@ -185,12 +185,7 @@ public class UserManagerHelperRoboTest { mHelper.switchToUser(createUserInfoForId(20)); assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isFalse(); - // Switching to Guest calls createGuest. - UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST); - mHelper.switchToUser(guestInfo); - verify(mUserManager).createGuest(mContext, "Test Guest"); - - // Switching to non-current, non-guest user, simply calls switchUser. + // Switching to non-foreground user, simply calls switchUser. UserInfo userToSwitchTo = new UserInfo(22, "Test User", 0); mHelper.switchToUser(userToSwitchTo); assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue(); diff --git a/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_down.xml b/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_down.xml new file mode 100644 index 000000000000..74f38d4f9946 --- /dev/null +++ b/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_down.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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. +*/ +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:ordering="together"> + <objectAnimator + android:propertyName="rotation" + android:duration="0" + android:valueFrom="180" + android:valueTo="0" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="alpha" + android:valueFrom="0.0" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleX" + android:valueFrom="0.8" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleY" + android:valueFrom="0.8" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_up.xml b/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_up.xml new file mode 100644 index 000000000000..0f28297f0214 --- /dev/null +++ b/packages/SystemUI/res/anim/car_arrow_fade_in_rotate_up.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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. +*/ +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:ordering="together"> + <objectAnimator + android:propertyName="rotation" + android:duration="0" + android:valueFrom="0" + android:valueTo="180" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="alpha" + android:valueFrom="0.0" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleX" + android:valueFrom="0.8" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleY" + android:valueFrom="0.8" + android:valueTo="1.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/car_arrow_fade_out.xml b/packages/SystemUI/res/anim/car_arrow_fade_out.xml new file mode 100644 index 000000000000..e6757d2862b1 --- /dev/null +++ b/packages/SystemUI/res/anim/car_arrow_fade_out.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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. +*/ +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:ordering="together"> + <objectAnimator + android:propertyName="alpha" + android:valueFrom="1.0" + android:valueTo="0.0" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleX" + android:valueFrom="1.0" + android:valueTo="0.8" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:propertyName="scaleY" + android:valueFrom="1.0" + android:valueTo="0.8" + android:valueType="floatType" + android:duration="300" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/car_ic_keyboard_arrow_down.xml b/packages/SystemUI/res/drawable/car_ic_keyboard_arrow_down.xml new file mode 100644 index 000000000000..3709aa546766 --- /dev/null +++ b/packages/SystemUI/res/drawable/car_ic_keyboard_arrow_down.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ + ~ Copyright (C) 2018 Google Inc. + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~ + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="44dp" + android:height="44dp" + android:viewportWidth="48.0" + android:viewportHeight="48.0"> + <path + android:pathData="M14.83 16.42L24 25.59l9.17-9.17L36 19.25l-12 12-12-12z" + android:fillColor="#ffffff"/> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/car_ic_music.xml b/packages/SystemUI/res/drawable/car_ic_music.xml new file mode 100644 index 000000000000..f90cd69c1b39 --- /dev/null +++ b/packages/SystemUI/res/drawable/car_ic_music.xml @@ -0,0 +1,30 @@ +<!-- + Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="56dp" + android:height="56dp" + android:viewportWidth="48" + android:viewportHeight="48"> + + <path + android:fillAlpha=".1" + android:strokeAlpha=".1" + android:pathData="M0 0h48v48H0z" /> + <path + android:fillColor="@color/car_grey_50" + android:pathData="M24 2C14.06 2 6 10.06 6 20v14c0 3.31 2.69 6 6 6h6V24h-8v-4c0-7.73 6.27-14 +14-14s14 6.27 14 14v4h-8v16h6c3.31 0 6-2.69 6-6V20c0-9.94-8.06-18-18-18z" /> +</vector> diff --git a/packages/SystemUI/res/drawable/car_ic_navigation.xml b/packages/SystemUI/res/drawable/car_ic_navigation.xml new file mode 100644 index 000000000000..328efa08abdd --- /dev/null +++ b/packages/SystemUI/res/drawable/car_ic_navigation.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="37dp" + android:viewportWidth="32.0" + android:viewportHeight="37.0"> + <path + android:pathData="M16.62,0.61L31.33,35.21C31.55,35.72 31.31,36.3 30.8,36.52C30.48,36.66 30.12,36.62 29.83,36.42L15.7,26.44L1.58,36.42C1.13,36.73 0.5,36.63 0.18,36.18C-0.02,35.89 -0.06,35.53 0.08,35.21L14.78,0.61C15,0.1 15.59,-0.14 16.1,0.08C16.33,0.18 16.52,0.37 16.62,0.61Z" + android:strokeColor="#00000000" + android:fillType="evenOdd" + android:fillColor="@color/car_grey_50" + android:strokeWidth="1"/> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/car_ic_notification_2.xml b/packages/SystemUI/res/drawable/car_ic_notification_2.xml new file mode 100644 index 000000000000..c74ae153cf09 --- /dev/null +++ b/packages/SystemUI/res/drawable/car_ic_notification_2.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="38dp" + android:viewportWidth="32" + android:viewportHeight="38" > + <group + android:translateX="-6" + android:translateY="-3"> + <path + android:pathData="M26.6195649,6.98115478 C31.5083629,8.85235985 34.9817444,13.6069337 34.9817444,19.1767606 L34.9817444,27.9542254 L38,27.9542254 L38,34.2161972 L6,34.2161972 L6,27.9542254 L9.01825558,27.9542254 L9.01825558,19.1767606 C9.01825558,13.6069337 12.4916371,8.85235985 17.3804351,6.98115478 C17.723241,4.726863 19.6609451,3 22,3 C24.3390549,3 26.276759,4.726863 26.6195649,6.98115478 Z M17.326572,36.3035211 L26.673428,36.3035211 C26.673428,38.8973148 24.581063,41 22,41 C19.418937,41 17.326572,38.8973148 17.326572,36.3035211 Z" + android:strokeColor="#00000000" + android:fillType="evenOdd" + android:fillColor="@color/car_grey_50" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_lock_lockdown.xml b/packages/SystemUI/res/drawable/ic_lock_lockdown.xml index 65b981361251..d591aa840ae7 100644 --- a/packages/SystemUI/res/drawable/ic_lock_lockdown.xml +++ b/packages/SystemUI/res/drawable/ic_lock_lockdown.xml @@ -17,10 +17,10 @@ Copyright (C) 2018 The Android Open Source Project android:width="24.0dp" android:height="24.0dp" android:viewportWidth="24.0" - android:viewportHeight="24.0"> + android:viewportHeight="24.0" + android:tint="?attr/colorControlNormal"> <path android:fillColor="#000000" - android:alpha="0.87" android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM12.0,17.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0c1.1,0.0 2.0,0.9 2.0,2.0S13.1,17.0 12.0,17.0zM15.1,8.0L8.9,8.0L8.9,6.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1L15.1,8.0z"/> </vector> diff --git a/packages/SystemUI/res/layout/car_volume_dialog.xml b/packages/SystemUI/res/layout/car_volume_dialog.xml index 36bc85da0626..a6beaa15a4bf 100644 --- a/packages/SystemUI/res/layout/car_volume_dialog.xml +++ b/packages/SystemUI/res/layout/car_volume_dialog.xml @@ -13,26 +13,19 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout +<androidx.car.widget.PagedListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/volume_dialog" - android:clipChildren="false" + android:background="@drawable/car_card_rounded_background" + android:id="@+id/volume_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/car_margin" android:layout_marginEnd="@dimen/car_margin" - android:theme="@style/qs_theme" > - <androidx.car.widget.PagedListView - android:id="@+id/volume_list" - android:background="@drawable/car_rounded_bg_bottom" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minWidth="@dimen/volume_dialog_panel_width" - android:theme="?attr/dialogListTheme" - app:dividerStartMargin="@dimen/car_keyline_1" - app:dividerEndMargin="@dimen/car_keyline_1" - app:gutter="none" - app:showPagedListViewDivider="true" - app:scrollBarEnabled="false" /> -</FrameLayout> + android:minWidth="@dimen/volume_dialog_panel_width" + android:theme="@style/Theme.Car.NoActionBar" + app:dividerStartMargin="@dimen/car_keyline_1" + app:dividerEndMargin="@dimen/car_keyline_1" + app:gutter="none" + app:showPagedListViewDivider="true" + app:scrollBarEnabled="false" /> diff --git a/packages/SystemUI/res/layout/hybrid_notification.xml b/packages/SystemUI/res/layout/hybrid_notification.xml index f4501da944e2..bccf2077567a 100644 --- a/packages/SystemUI/res/layout/hybrid_notification.xml +++ b/packages/SystemUI/res/layout/hybrid_notification.xml @@ -34,7 +34,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" - android:textAppearance="@*android:style/TextAppearance.Material.Notification" style="?attr/hybridNotificationTextStyle" /> </com.android.systemui.statusbar.notification.HybridNotificationView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/hybrid_overflow_number.xml b/packages/SystemUI/res/layout/hybrid_overflow_number.xml index 792f4242d28d..08f8f940102c 100644 --- a/packages/SystemUI/res/layout/hybrid_overflow_number.xml +++ b/packages/SystemUI/res/layout/hybrid_overflow_number.xml @@ -16,10 +16,10 @@ --> <TextView xmlns:android="http://schemas.android.com/apk/res/android" + style="@*android:style/Widget.Material.Notification.Text" android:id="@+id/notification_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@*android:style/TextAppearance.Material.Notification" android:paddingEnd="@dimen/group_overflow_number_padding" android:gravity="end" android:singleLine="true" diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml index 49d142a1e6d6..8ca867f65ef7 100644 --- a/packages/SystemUI/res/layout/qs_tile_label.xml +++ b/packages/SystemUI/res/layout/qs_tile_label.xml @@ -41,7 +41,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" - android:maxLines="2" android:padding="0dp" android:gravity="center" android:ellipsize="marquee" diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml index dcb8aaf2a6a8..4301fdb96234 100644 --- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml +++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml @@ -15,14 +15,29 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/quick_qs_status_icons" android:layout_width="match_parent" - android:layout_height="20dp" + android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="14dp" - android:layout_marginEnd="@dimen/notification_side_paddings" + android:layout_marginStart="@dimen/status_bar_padding_start" + android:layout_marginEnd="@dimen/status_bar_padding_end" android:layout_below="@id/quick_status_bar_system_icons" - android:paddingEnd="@dimen/status_bar_padding_end" > + android:clipChildren="false" + android:clipToPadding="false" + android:minHeight="20dp" > + + <com.android.systemui.statusbar.policy.DateView + android:id="@+id/date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="start" + android:gravity="center_vertical" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" + android:textSize="@dimen/qs_time_collapsed_size" + systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" /> <com.android.systemui.statusbar.phone.StatusIconContainer android:id="@+id/statusIcons" diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml index 54baa4a82a0b..0892f731e9d6 100644 --- a/packages/SystemUI/res/layout/quick_settings_header_info.xml +++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml @@ -45,14 +45,16 @@ android:layout_width="@dimen/qs_header_alarm_icon_size" android:layout_height="@dimen/qs_header_alarm_icon_size" android:src="@drawable/stat_sys_alarm" - android:tint="?android:attr/textColorPrimary" /> + android:tint="?android:attr/textColorPrimary" + android:visibility="gone"/> <TextView android:id="@+id/next_alarm_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start" - android:textAppearance="@style/TextAppearance.QS.TileLabel" /> + android:textAppearance="@style/TextAppearance.QS.TileLabel" + android:visibility="gone"/> <View android:id="@+id/status_separator" @@ -61,20 +63,23 @@ android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:background="@android:color/white" - android:backgroundTint="?android:attr/textColorPrimary" /> + android:backgroundTint="?android:attr/textColorPrimary" + android:visibility="gone"/> <ImageView android:id="@+id/ringer_mode_icon" android:layout_width="@dimen/qs_header_alarm_icon_size" android:layout_height="@dimen/qs_header_alarm_icon_size" - android:tint="?android:attr/textColorPrimary" /> + android:tint="?android:attr/textColorPrimary" + android:visibility="gone"/> <TextView android:id="@+id/ringer_mode_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start" - android:textAppearance="@style/TextAppearance.QS.TileLabel" /> + android:textAppearance="@style/TextAppearance.QS.TileLabel" + android:visibility="gone"/> </LinearLayout> diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml index 7b9cd2aee862..d40534edf0ad 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -20,15 +20,12 @@ android:id="@+id/quick_status_bar_system_icons" android:layout_width="match_parent" android:layout_height="@*android:dimen/quick_qs_offset_height" - android:layout_marginRight="@dimen/notification_side_paddings" - android:layout_marginLeft="@dimen/notification_side_paddings" - android:layout_alignParentEnd="true" android:clipChildren="false" android:clipToPadding="false" android:gravity="center" + android:orientation="horizontal" android:paddingStart="@dimen/status_bar_padding_start" - android:paddingEnd="@dimen/status_bar_padding_end" - android:orientation="horizontal"> + android:paddingEnd="@dimen/status_bar_padding_end" > <com.android.systemui.statusbar.policy.Clock android:id="@+id/clock" @@ -41,16 +38,6 @@ android:textAppearance="@style/TextAppearance.StatusBar.Clock" systemui:showDark="false" /> - <com.android.systemui.statusbar.policy.DateView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:singleLine="true" - android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" - android:textSize="@dimen/qs_time_collapsed_size" - systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" /> - <android.widget.Space android:id="@+id/space" android:layout_width="0dp" diff --git a/packages/SystemUI/res/layout/smart_reply_view.xml b/packages/SystemUI/res/layout/smart_reply_view.xml index 9b2dd95005bb..aa5549f35a34 100644 --- a/packages/SystemUI/res/layout/smart_reply_view.xml +++ b/packages/SystemUI/res/layout/smart_reply_view.xml @@ -23,7 +23,6 @@ android:id="@+id/smart_reply_view" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:layout_marginStart="12dp" systemui:spacing="@dimen/smart_reply_button_spacing" systemui:singleLineButtonPaddingHorizontal="@dimen/smart_reply_button_padding_horizontal_single_line" systemui:doubleLineButtonPaddingHorizontal="@dimen/smart_reply_button_padding_horizontal_double_line"> diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index df46fabee903..f0436dea9207 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -28,6 +28,7 @@ android:orientation="vertical" android:focusable="false" android:descendantFocusability="afterDescendants" + android:accessibilityPaneTitle="@string/status_bar" > <ImageView diff --git a/packages/SystemUI/res/layout/volume_dnd_icon.xml b/packages/SystemUI/res/layout/volume_dnd_icon.xml index 215b2300992a..ac235b7090c5 100644 --- a/packages/SystemUI/res/layout/volume_dnd_icon.xml +++ b/packages/SystemUI/res/layout/volume_dnd_icon.xml @@ -15,16 +15,16 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="14dp" - android:layout_height="14dp" - android:layout_marginTop="6dp" - android:layout_marginRight="6dp" - android:layout_gravity="right|top"> + android:id="@+id/dnd_icon" + android:layout_width="match_parent" + android:layout_height="wrap_content"> <ImageView - android:id="@+id/dnd_icon" - android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_width="14dp" + android:layout_height="14dp" + android:layout_marginTop="6dp" + android:layout_marginRight="6dp" + android:layout_gravity="right|top" android:src="@drawable/ic_dnd" android:tint="?android:attr/textColorTertiary"/> </FrameLayout> diff --git a/packages/SystemUI/res/values-h320dp/config.xml b/packages/SystemUI/res/values-h320dp/config.xml new file mode 100644 index 000000000000..a9c19db0f46f --- /dev/null +++ b/packages/SystemUI/res/values-h320dp/config.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (c) 2017, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ +--> + +<resources> + <!-- The number of rows in the QuickSettings --> + <integer name="quick_settings_num_rows">2</integer> +</resources> diff --git a/packages/SystemUI/res/values-h600dp/config.xml b/packages/SystemUI/res/values-h600dp/config.xml new file mode 100644 index 000000000000..8616e3e62779 --- /dev/null +++ b/packages/SystemUI/res/values-h600dp/config.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (c) 2017, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ +--> + +<resources> + <!-- The number of rows in the QuickSettings --> + <integer name="quick_settings_num_rows">3</integer> +</resources> diff --git a/packages/SystemUI/res/values-sw410dp/config.xml b/packages/SystemUI/res/values-sw410dp/config.xml index 362c1d214b0e..8ace7bf13573 100644 --- a/packages/SystemUI/res/values-sw410dp/config.xml +++ b/packages/SystemUI/res/values-sw410dp/config.xml @@ -20,8 +20,5 @@ <!-- These resources are around just to allow their values to be customized for different hardware and product builds. --> <resources> - <integer name="quick_settings_num_rows">2</integer> - <integer name="quick_settings_num_rows_portrait">3</integer> - <bool name="quick_settings_show_full_alarm">true</bool> </resources> diff --git a/packages/SystemUI/res/values-sw540dp/config.xml b/packages/SystemUI/res/values-sw540dp/config.xml deleted file mode 100644 index e554fc6dd4d1..000000000000 --- a/packages/SystemUI/res/values-sw540dp/config.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** Copyright 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. -*/ ---> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> -<resources> - <integer name="quick_settings_num_rows">3</integer> -</resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 7eb08c4c3582..88e3331ff76c 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -112,7 +112,6 @@ <!-- The number of rows in the QuickSettings --> <integer name="quick_settings_num_rows">1</integer> - <integer name="quick_settings_num_rows_portrait">2</integer> <!-- The number of columns that the top level tiles span in the QuickSettings --> <integer name="quick_settings_user_time_settings_tile_span">1</integer> diff --git a/packages/SystemUI/res/values/config_car.xml b/packages/SystemUI/res/values/config_car.xml index db829f25802e..2c549bc8ce2d 100644 --- a/packages/SystemUI/res/values/config_car.xml +++ b/packages/SystemUI/res/values/config_car.xml @@ -27,4 +27,5 @@ <bool name="config_enableLeftNavigationBar">false</bool> <bool name="config_enableRightNavigationBar">false</bool> <bool name="config_enableBottomNavigationBar">true</bool> + <bool name="config_hideNavWhenKeyguardBouncerShown">true</bool> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 875000c84260..ac9fb2b8afa0 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -326,7 +326,7 @@ <dimen name="pull_span_min">25dp</dimen> <dimen name="qs_tile_height">106dp</dimen> - <dimen name="qs_tile_layout_margin_side">9dp</dimen> + <dimen name="qs_tile_layout_margin_side">6dp</dimen> <dimen name="qs_tile_margin_horizontal">18dp</dimen> <dimen name="qs_tile_margin_vertical">24dp</dimen> <dimen name="qs_tile_margin_top_bottom">12dp</dimen> @@ -917,6 +917,8 @@ <dimen name="edge_margin">8dp</dimen> <dimen name="rounded_corner_radius">0dp</dimen> + <dimen name="rounded_corner_radius_top">0dp</dimen> + <dimen name="rounded_corner_radius_bottom">0dp</dimen> <dimen name="rounded_corner_content_padding">0dp</dimen> <dimen name="nav_content_padding">0dp</dimen> <dimen name="nav_quick_scrub_track_edge_padding">42dp</dimen> diff --git a/core/res/res/drawable/notification_reply_background.xml b/packages/SystemUI/res/values/ids_car.xml index 08e22f2f9729..27ed2e250d9f 100644 --- a/core/res/res/drawable/notification_reply_background.xml +++ b/packages/SystemUI/res/values/ids_car.xml @@ -1,5 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> <!-- - ~ Copyright (C) 2017 The Android Open Source Project + ~ 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. @@ -14,11 +15,8 @@ ~ limitations under the License --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="oval"> - <solid - android:color="#ff757575"/> - <size - android:width="16dp" - android:height="16dp"/> -</shape> +<resources> + <!-- Values used for finding elements on the system ui nav bars --> + <item type="id" name="lock_screen_nav_buttons"/> + <item type="id" name="nav_buttons"/> +</resources>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 6c507be44df3..697ab06afb19 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -59,7 +59,7 @@ <string name="status_bar_latest_events_title">Notifications</string> <!-- When the battery is low, this is displayed to the user in a dialog. The title of the low battery alert. [CHAR LIMIT=NONE]--> - <string name="battery_low_title">Battery is low</string> + <string name="battery_low_title">Battery may run out soon</string> <!-- A message that appears when the battery level is getting low in a dialog. This is appended to the subtitle of the low battery alert. "percentage" is the percentage of battery @@ -2223,4 +2223,6 @@ <!-- An action on the dialog that tells that scheduled (i.e. automatic) battery saver: user acknowledges and closes the dialog. [CHAR LIMIT=NONE]--> <string name="auto_saver_okay_action">Got it</string> + <!-- URl of the webpage that explains battery saver. --> + <string name="help_uri_battery_saver_learn_more_link_target" translatable="false"></string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 20d883435aef..1e195344a6d3 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -137,7 +137,8 @@ <item name="android:layout_marginTop">4dp</item> </style> - <style name="hybrid_notification_text"> + <style name="hybrid_notification_text" + parent="@*android:style/Widget.Material.Notification.Text"> <item name="android:paddingEnd">4dp</item> </style> @@ -173,7 +174,7 @@ <style name="TextAppearance.StatusBar.Expanded.Date"> <item name="android:textSize">@dimen/qs_time_expanded_size</item> <item name="android:textStyle">normal</item> - <item name="android:textColor">#ffffffff</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:fontFamily">sans-serif</item> </style> @@ -360,10 +361,6 @@ parent="@*android:style/TextAppearance.Material.Notification.Info"> </style> - <style name="TextAppearance.Material.Notification.HybridNotificationDivider" - parent="@*android:style/TextAppearance.Material.Notification"> - </style> - <style name="SearchPanelCircle"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java index 924e85dec37a..7429cb5c19d9 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java @@ -17,6 +17,7 @@ package com.android.systemui.shared.recents.model; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; +import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_UNDEFINED; import android.app.ActivityManager.TaskSnapshot; import android.graphics.Bitmap; @@ -32,6 +33,7 @@ public class ThumbnailData { public Rect insets; public boolean reducedResolution; public boolean isRealSnapshot; + public int windowingMode; public float scale; public ThumbnailData() { @@ -41,6 +43,7 @@ public class ThumbnailData { reducedResolution = false; scale = 1f; isRealSnapshot = true; + windowingMode = WINDOWING_MODE_UNDEFINED; } public ThumbnailData(TaskSnapshot snapshot) { @@ -50,5 +53,6 @@ public class ThumbnailData { reducedResolution = snapshot.isReducedResolution(); scale = snapshot.getScale(); isRealSnapshot = snapshot.isRealSnapshot(); + windowingMode = snapshot.getWindowingMode(); } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java index 8d451c12410a..5a0dddc7656a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java @@ -33,10 +33,21 @@ public class NavigationBarCompat { * touch slop is when the respected operation will occur when exceeded. Touch slop must be * larger than the drag slop. */ - public static final int QUICK_STEP_DRAG_SLOP_PX = convertDpToPixel(10); - public static final int QUICK_SCRUB_DRAG_SLOP_PX = convertDpToPixel(20); - public static final int QUICK_STEP_TOUCH_SLOP_PX = convertDpToPixel(24); - public static final int QUICK_SCRUB_TOUCH_SLOP_PX = convertDpToPixel(35); + public static int getQuickStepDragSlopPx() { + return convertDpToPixel(10); + } + + public static int getQuickScrubDragSlopPx() { + return convertDpToPixel(20); + } + + public static int getQuickStepTouchSlopPx() { + return convertDpToPixel(24); + } + + public static int getQuickScrubTouchSlopPx() { + return convertDpToPixel(35); + } @Retention(RetentionPolicy.SOURCE) @IntDef({HIT_TARGET_NONE, HIT_TARGET_BACK, HIT_TARGET_HOME, HIT_TARGET_OVERVIEW}) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java index 80e226d929cd..9bebb14dabf0 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java @@ -69,6 +69,14 @@ public class RecentsAnimationControllerCompat { } } + public void hideCurrentInputMethod() { + try { + mAnimationController.hideCurrentInputMethod(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to set hide input method", e); + } + } + public void finish(boolean toHome) { try { mAnimationController.finish(toHome); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index 1332d3838421..07b980ef3f5e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -60,6 +60,16 @@ public class WindowManagerWrapper { public static final int ACTIVITY_TYPE_STANDARD = WindowConfiguration.ACTIVITY_TYPE_STANDARD; + public static final int WINDOWING_MODE_UNDEFINED = WindowConfiguration.WINDOWING_MODE_UNDEFINED; + public static final int WINDOWING_MODE_FULLSCREEN = + WindowConfiguration.WINDOWING_MODE_FULLSCREEN; + public static final int WINDOWING_MODE_PINNED = WindowConfiguration.WINDOWING_MODE_PINNED; + public static final int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY = + WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; + public static final int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY = + WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; + public static final int WINDOWING_MODE_FREEFORM = WindowConfiguration.WINDOWING_MODE_FREEFORM; + private static final WindowManagerWrapper sInstance = new WindowManagerWrapper(); public static WindowManagerWrapper getInstance() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index c826aaaac749..d24675c67188 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -68,6 +68,7 @@ import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.util.Log; +import android.util.Slog; import android.util.SparseBooleanArray; import android.util.SparseIntArray; @@ -87,7 +88,6 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map.Entry; @@ -400,9 +400,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // Hack level over 9000: Because the subscription id is not yet valid when we see the // first update in handleSimStateChange, we need to force refresh all all SIM states // so the subscription id for them is consistent. - List<Integer> changedSubscriptionIds = refreshSimState(subscriptionInfos); - for (int i = 0; i < changedSubscriptionIds.size(); i++) { - SimData data = mSimDatas.get(changedSubscriptionIds.get(i)); + ArrayList<SubscriptionInfo> changedSubscriptions = new ArrayList<>(); + for (int i = 0; i < subscriptionInfos.size(); i++) { + SubscriptionInfo info = subscriptionInfos.get(i); + boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex()); + if (changed) { + changedSubscriptions.add(info); + } + } + for (int i = 0; i < changedSubscriptions.size(); i++) { + SimData data = mSimDatas.get(changedSubscriptions.get(i).getSubscriptionId()); for (int j = 0; j < mCallbacks.size(); j++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get(); if (cb != null) { @@ -1839,61 +1846,34 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { }; /** - * @return A list of changed subscriptions, maybe empty but never null + * @return true if and only if the state has changed for the specified {@code slotId} */ - private List<Integer> refreshSimState(final List<SubscriptionInfo> activeSubscriptionInfos) { + private boolean refreshSimState(int subId, int slotId) { // This is awful. It exists because there are two APIs for getting the SIM status // that don't return the complete set of values and have different types. In Keyguard we // need IccCardConstants, but TelephonyManager would only give us // TelephonyManager.SIM_STATE*, so we retrieve it manually. final TelephonyManager tele = TelephonyManager.from(mContext); - ArrayList<Integer> changedSubscriptionIds = new ArrayList<>(); - HashSet<Integer> activeSubIds = new HashSet<>(); - HashSet<Integer> activeSlotIds = new HashSet<>(); - - for (SubscriptionInfo info : activeSubscriptionInfos) { - int subId = info.getSubscriptionId(); - int slotId = info.getSimSlotIndex(); - int simState = tele.getSimState(slotId); - State state; - try { - state = State.intToState(simState); - } catch(IllegalArgumentException ex) { - Log.w(TAG, "Unknown sim state: " + simState); - state = State.UNKNOWN; - } - - SimData data = mSimDatas.get(subId); - final boolean changed; - if (data == null) { - data = new SimData(state, slotId, subId); - mSimDatas.put(subId, data); - changed = true; // no data yet; force update - } else { - changed = data.simState != state; - data.simState = state; - } - if (changed) { - changedSubscriptionIds.add(subId); - } - - activeSubIds.add(subId); - activeSlotIds.add(slotId); + int simState = tele.getSimState(slotId); + State state; + try { + state = State.intToState(simState); + } catch(IllegalArgumentException ex) { + Log.w(TAG, "Unknown sim state: " + simState); + state = State.UNKNOWN; } - - for (SimData data : mSimDatas.values()) { - if (!activeSubIds.contains(data.subId) - && !activeSlotIds.contains(data.slotId) - && data.simState != State.ABSENT) { - // for the inactive subscriptions, reset state to ABSENT - if (DEBUG_SIM_STATES) Log.d(TAG, "reset state to ABSENT for subId:" + data.subId); - data.simState = State.ABSENT; - changedSubscriptionIds.add(data.subId); - } + SimData data = mSimDatas.get(subId); + final boolean changed; + if (data == null) { + data = new SimData(state, slotId, subId); + mSimDatas.put(subId, data); + changed = true; // no data yet; force update + } else { + changed = data.simState != state; + data.simState = state; } - - return changedSubscriptionIds; + return changed; } public static boolean isSimPinSecure(IccCardConstants.State state) { diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 5fce0a6d641c..7d19784aad03 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -21,6 +21,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Process; +import android.os.ServiceManager; import android.util.ArrayMap; import android.view.IWindowManager; import android.view.WindowManagerGlobal; @@ -28,6 +29,7 @@ import android.view.WindowManagerGlobal; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ColorDisplayController; import com.android.internal.logging.MetricsLogger; +import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.Preconditions; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.assist.AssistManager; @@ -320,6 +322,9 @@ public class Dependency extends SystemUI { mProviders.put(VibratorHelper.class, () -> new VibratorHelper(mContext)); + mProviders.put(IStatusBarService.class, () -> IStatusBarService.Stub.asInterface( + ServiceManager.getService(Context.STATUS_BAR_SERVICE))); + // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 72f6cdcfc78b..8d32e4db6d21 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -78,6 +78,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { SystemProperties.getBoolean("debug.screenshot_rounded_corners", false); private int mRoundedDefault; + private int mRoundedDefaultTop; + private int mRoundedDefaultBottom; private View mOverlay; private View mBottomOverlay; private float mDensity; @@ -89,9 +91,14 @@ public class ScreenDecorations extends SystemUI implements Tunable { mWindowManager = mContext.getSystemService(WindowManager.class); mRoundedDefault = mContext.getResources().getDimensionPixelSize( R.dimen.rounded_corner_radius); - if (mRoundedDefault != 0 || shouldDrawCutout()) { + mRoundedDefaultTop = mContext.getResources().getDimensionPixelSize( + R.dimen.rounded_corner_radius_top); + mRoundedDefaultBottom = mContext.getResources().getDimensionPixelSize( + R.dimen.rounded_corner_radius_bottom); + if (hasRoundedCorners() || shouldDrawCutout()) { setupDecorations(); } + int padding = mContext.getResources().getDimensionPixelSize( R.dimen.rounded_corner_content_padding); if (padding != 0) { @@ -208,11 +215,15 @@ public class ScreenDecorations extends SystemUI implements Tunable { private void updateWindowVisibility(View overlay) { boolean visibleForCutout = shouldDrawCutout() && overlay.findViewById(R.id.display_cutout).getVisibility() == View.VISIBLE; - boolean visibleForRoundedCorners = mRoundedDefault > 0; + boolean visibleForRoundedCorners = hasRoundedCorners(); overlay.setVisibility(visibleForCutout || visibleForRoundedCorners ? View.VISIBLE : View.GONE); } + private boolean hasRoundedCorners() { + return mRoundedDefault > 0 || mRoundedDefaultBottom > 0 || mRoundedDefaultTop > 0; + } + private boolean shouldDrawCutout() { return shouldDrawCutout(mContext); } @@ -284,14 +295,26 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mOverlay == null) return; if (SIZE.equals(key)) { int size = mRoundedDefault; - try { - size = (int) (Integer.parseInt(newValue) * mDensity); - } catch (Exception e) { + int sizeTop = mRoundedDefaultTop; + int sizeBottom = mRoundedDefaultBottom; + if (newValue != null) { + try { + size = (int) (Integer.parseInt(newValue) * mDensity); + } catch (Exception e) { + } } - setSize(mOverlay.findViewById(R.id.left), size); - setSize(mOverlay.findViewById(R.id.right), size); - setSize(mBottomOverlay.findViewById(R.id.left), size); - setSize(mBottomOverlay.findViewById(R.id.right), size); + + if (sizeTop == 0) { + sizeTop = size; + } + if (sizeBottom == 0) { + sizeBottom = size; + } + + setSize(mOverlay.findViewById(R.id.left), sizeTop); + setSize(mOverlay.findViewById(R.id.right), sizeTop); + setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom); + setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom); } } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index ac4da73a2a9a..721890f0aee9 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -20,7 +20,6 @@ import android.app.AlarmManager; import android.content.Context; import android.util.ArrayMap; import android.util.Log; -import android.view.View; import android.view.ViewGroup; import com.android.internal.logging.MetricsLogger; @@ -43,12 +42,11 @@ import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationViewHierarchyManager; import com.android.systemui.statusbar.ScrimView; -import com.android.systemui.statusbar.SmartReplyLogger; +import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; -import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationGroupManager; @@ -58,7 +56,6 @@ import com.android.systemui.statusbar.phone.ScrimState; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.SmartReplyConstants; import java.util.function.Consumer; @@ -150,6 +147,6 @@ public class SystemUIFactory { () -> new NotificationViewHierarchyManager(context)); providers.put(NotificationEntryManager.class, () -> new NotificationEntryManager(context)); providers.put(KeyguardDismissUtil.class, KeyguardDismissUtil::new); - providers.put(SmartReplyLogger.class, () -> new SmartReplyLogger(context)); + providers.put(SmartReplyController.class, () -> new SmartReplyController()); } } diff --git a/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java index 9459ce1ba827..cc9fec04f01f 100644 --- a/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/car/CarSystemUIFactory.java @@ -17,17 +17,29 @@ package com.android.systemui.car; import android.content.Context; import android.util.ArrayMap; +import android.view.View; +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.Dependency.DependencyProvider; import com.android.systemui.SystemUIFactory; import com.android.systemui.statusbar.NotificationEntryManager; import com.android.systemui.statusbar.car.CarFacetButtonController; +import com.android.systemui.statusbar.car.CarStatusBar; +import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager; import com.android.systemui.statusbar.car.hvac.HvacController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; /** * Class factory to provide car specific SystemUI components. */ public class CarSystemUIFactory extends SystemUIFactory { + + public StatusBarKeyguardViewManager createStatusBarKeyguardViewManager(Context context, + ViewMediatorCallback viewMediatorCallback, LockPatternUtils lockPatternUtils) { + return new CarStatusBarKeyguardViewManager(context, viewMediatorCallback, lockPatternUtils); + } + @Override public void injectDependencies(ArrayMap<Object, DependencyProvider> providers, Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index a0fdb9dc5b90..b0bda16b1421 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -36,7 +36,13 @@ public class DozeScreenState implements DozeMachine.Part { * Delay entering low power mode when animating to make sure that we'll have * time to move all elements into their final positions while still at 60 fps. */ - private static final int ENTER_DOZE_DELAY = 3000; + private static final int ENTER_DOZE_DELAY = 6000; + /** + * Hide wallpaper earlier when entering low power mode. The gap between + * hiding the wallpaper and changing the display mode is necessary to hide + * the black frame that's inherent to hardware specs. + */ + public static final int ENTER_DOZE_HIDE_WALLPAPER_DELAY = 2000; private final DozeMachine.Service mDozeService; private final Handler mHandler; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 5993c396d0a1..ca92d3570ff7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -502,9 +502,6 @@ public class KeyguardViewMediator extends SystemUI { break; default: if (DEBUG_SIM_STATES) Log.v(TAG, "Unspecific state: " + simState); - synchronized (KeyguardViewMediator.this) { - onSimAbsentLocked(); - } break; } } @@ -1857,6 +1854,8 @@ public class KeyguardViewMediator extends SystemUI { synchronized (KeyguardViewMediator.this) { if (!mHiding) { + // Tell ActivityManager that we canceled the keyguardExitAnimation. + setShowingLocked(mShowing, mAodShowing, mSecondaryDisplayShowing, true /* force */); return; } mHiding = false; diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java index d860fc52b97c..c6bb17c2d133 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java @@ -19,17 +19,29 @@ package com.android.systemui.power; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioAttributes; +import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; import android.os.UserHandle; import android.support.annotation.VisibleForTesting; +import android.text.Annotation; +import android.text.Layout; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; +import android.util.Log; import android.util.Slog; +import android.view.View; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.settingslib.Utils; @@ -42,6 +54,8 @@ import com.android.systemui.util.NotificationChannels; import java.io.PrintWriter; import java.text.NumberFormat; +import java.util.Locale; +import java.util.Objects; public class PowerNotificationWarnings implements PowerUI.WarningsUI { private static final String TAG = PowerUI.TAG + ".Notification"; @@ -87,6 +101,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { private static final String SETTINGS_ACTION_OPEN_BATTERY_SAVER_SETTING = "android.settings.BATTERY_SAVER_SETTINGS"; + private static final String BATTERY_SAVER_DESCRIPTION_URL_KEY = "url"; + private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) @@ -461,7 +477,16 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { if (mSaverConfirmation != null) return; final SystemUIDialog d = new SystemUIDialog(mContext); d.setTitle(R.string.battery_saver_confirmation_title); - d.setMessage(com.android.internal.R.string.battery_saver_description); + d.setMessage(getBatterySaverDescription()); + + // Sad hack for http://b/78261259 and http://b/78298335. Otherwise "Battery" may be split + // into "Bat-tery". + if (isEnglishLocale()) { + d.setMessageHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); + } + // We need to set LinkMovementMethod to make the link clickable. + d.setMessageMovementMethod(LinkMovementMethod.getInstance()); + d.setNegativeButton(android.R.string.cancel, null); d.setPositiveButton(R.string.battery_saver_confirmation_ok, (dialog, which) -> setSaverMode(true, false)); @@ -471,6 +496,79 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { mSaverConfirmation = d; } + private boolean isEnglishLocale() { + return Objects.equals(Locale.getDefault().getLanguage(), + Locale.ENGLISH.getLanguage()); + } + + /** + * Generates the message for the "want to start battery saver?" dialog with a "learn more" link. + */ + private CharSequence getBatterySaverDescription() { + final String learnMoreUrl = mContext.getText( + R.string.help_uri_battery_saver_learn_more_link_target).toString(); + + // If there's no link, use the string with no "learn more". + if (TextUtils.isEmpty(learnMoreUrl)) { + return mContext.getText( + com.android.internal.R.string.battery_saver_description); + } + + // If we have a link, use the string with the "learn more" link. + final CharSequence rawText = mContext.getText( + com.android.internal.R.string.battery_saver_description_with_learn_more); + final SpannableString message = new SpannableString(rawText); + final SpannableStringBuilder builder = new SpannableStringBuilder(message); + + // Look for the "learn more" part of the string, and set a URL span on it. + // We use a customized URLSpan to add FLAG_RECEIVER_FOREGROUND to the intent, and + // also to close the dialog. + for (Annotation annotation : message.getSpans(0, message.length(), Annotation.class)) { + final String key = annotation.getValue(); + + if (!BATTERY_SAVER_DESCRIPTION_URL_KEY.equals(key)) { + continue; + } + final int start = message.getSpanStart(annotation); + final int end = message.getSpanEnd(annotation); + + // Replace the "learn more" with a custom URL span, with + // - No underline. + // - When clicked, close the dialog and the notification shade. + final URLSpan urlSpan = new URLSpan(learnMoreUrl) { + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + } + + @Override + public void onClick(View widget) { + // Close the parent dialog. + if (mSaverConfirmation != null) { + mSaverConfirmation.dismiss(); + } + // Also close the notification shade, if it's open. + mContext.sendBroadcast( + new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) + .setFlags(Intent.FLAG_RECEIVER_FOREGROUND)); + + final Uri uri = Uri.parse(getURL()); + Context context = widget.getContext(); + Intent intent = new Intent(Intent.ACTION_VIEW, uri) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Activity was not found for intent, " + intent.toString()); + } + } + }; + builder.setSpan(urlSpan, start, end, message.getSpanFlags(urlSpan)); + } + return builder; + } + private void showAutoSaverEnabledConfirmation() { if (mSaverEnabledConfirmation != null) return; diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 1fd60239ee98..8cfba2cc53d7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -375,11 +375,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } private int getRows() { - final Resources res = getContext().getResources(); - if (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { - return res.getInteger(R.integer.quick_settings_num_rows_portrait); - } - return Math.max(1, res.getInteger(R.integer.quick_settings_num_rows)); + return Math.max(1, getResources().getInteger(R.integer.quick_settings_num_rows)); } public void setMaxRows(int maxRows) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index a44f9433b20a..d8bf990f6465 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -40,7 +40,7 @@ public class QSContainerImpl extends FrameLayout { private int mHeightOverride = -1; private QSPanel mQSPanel; private View mQSDetail; - private View mHeader; + private QuickStatusBarHeader mHeader; private float mQsExpansion; private QSCustomizer mQSCustomizer; private View mQSFooter; @@ -178,7 +178,7 @@ public class QSContainerImpl extends FrameLayout { setMargins(mBackground); setMargins(mQSFooter); mQSPanel.setMargins(mSideMargins); - setMargins(mHeader); + mHeader.setMargins(mSideMargins); } private void setMargins(View view) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 2dcb72362b0a..ad2efbd3ed69 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -41,6 +41,7 @@ import android.util.Pair; import android.view.View; import android.view.WindowInsets; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -98,7 +99,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements private View mSystemIconsView; private View mQuickQsStatusIcons; - private View mDate; private View mHeaderTextContainerView; /** View containing the next alarm and ringer mode info. */ private View mStatusContainer; @@ -148,8 +148,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements super.onFinishInflate(); mHeaderQsPanel = findViewById(R.id.quick_qs_panel); - mDate = findViewById(R.id.date); - mDate.setOnClickListener(this); mSystemIconsView = findViewById(R.id.quick_status_bar_system_icons); mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons); StatusIconContainer iconContainer = findViewById(R.id.statusIcons); @@ -183,6 +181,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mBatteryMeterView.setForceShowPercent(true); mClockView = findViewById(R.id.clock); mDateView = findViewById(R.id.date); + mDateView.setOnClickListener(this); } private void updateStatusText() { @@ -261,7 +260,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE; mBatteryMeterView.useWallpaperTextColor(shouldUseWallpaperTextColor); mClockView.useWallpaperTextColor(shouldUseWallpaperTextColor); - mDateView.useWallpaperTextColor(shouldUseWallpaperTextColor); } @Override @@ -415,7 +413,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override public void onClick(View v) { - if(v == mDate){ + if(v == mDateView){ Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(new Intent( AlarmClock.ACTION_SHOW_ALARMS),0); } @@ -594,4 +592,16 @@ public class QuickStatusBarHeader extends RelativeLayout implements public static float getColorIntensity(@ColorInt int color) { return color == Color.WHITE ? 0 : 1; } + + public void setMargins(int sideMargins) { + for (int i = 0; i < getChildCount(); i++) { + View v = getChildAt(i); + if (v == mSystemIconsView || v == mQuickQsStatusIcons || v == mHeaderQsPanel) { + continue; + } + RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) v.getLayoutParams(); + lp.leftMargin = sideMargins; + lp.rightMargin = sideMargins; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java index 5649f7f5d764..22ad550b56f5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java @@ -36,6 +36,7 @@ import java.util.Objects; /** View that represents a standard quick settings tile. **/ public class QSTileView extends QSTileBaseView { + private static final int MAX_LABEL_LINES = 2; private static final boolean DUAL_TARGET_ALLOWED = false; private View mDivider; protected TextView mLabel; @@ -98,9 +99,10 @@ public class QSTileView extends QSTileBaseView { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - // Remeasure view if the secondary label text will be cut off. - if (!TextUtils.isEmpty(mSecondLine.getText()) - && mSecondLine.getLineHeight() > mSecondLine.getHeight()) { + // Remeasure view if the primary label requires more then 2 lines or the secondary label + // text will be cut off. + if (mLabel.getLineCount() > MAX_LABEL_LINES || !TextUtils.isEmpty(mSecondLine.getText()) + && mSecondLine.getLineHeight() > mSecondLine.getHeight()) { mLabel.setSingleLine(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index a25c466a2b40..cd0031173f8b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -124,8 +124,9 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { final boolean transientEnabling = arg == ARG_SHOW_TRANSIENT_ENABLING; final boolean enabled = transientEnabling || mController.isBluetoothEnabled(); final boolean connected = mController.isBluetoothConnected(); - state.isTransient = transientEnabling || mController.isBluetoothConnecting() - || mController.getBluetoothState() == BluetoothAdapter.STATE_TURNING_ON; + final boolean connecting = mController.isBluetoothConnecting(); + state.isTransient = transientEnabling || connecting || + mController.getBluetoothState() == BluetoothAdapter.STATE_TURNING_ON; state.dualTarget = true; state.value = enabled; if (state.slash == null) { @@ -134,7 +135,7 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { state.slash.isSlashed = !enabled; state.label = mContext.getString(R.string.quick_settings_bluetooth_label); state.secondaryLabel = TextUtils.emptyIfNull( - getSecondaryLabel(enabled, connected, state.isTransient)); + getSecondaryLabel(enabled, connecting, connected, state.isTransient)); if (enabled) { if (connected) { state.icon = new BluetoothConnectedTileIcon(); @@ -170,13 +171,17 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { * Returns the secondary label to use for the given bluetooth connection in the form of the * battery level or bluetooth profile name. If the bluetooth is disabled, there's no connected * devices, or we can't map the bluetooth class to a profile, this instead returns {@code null}. - * * @param enabled whether bluetooth is enabled + * @param connecting whether bluetooth is connecting to a device * @param connected whether there's a device connected via bluetooth * @param isTransient whether bluetooth is currently in a transient state turning on */ @Nullable - private String getSecondaryLabel(boolean enabled, boolean connected, boolean isTransient) { + private String getSecondaryLabel(boolean enabled, boolean connecting, boolean connected, + boolean isTransient) { + if (connecting) { + return mContext.getString(R.string.quick_settings_connecting); + } if (isTransient) { return mContext.getString(R.string.quick_settings_bluetooth_secondary_label_transient); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 00d6bd0d307f..6bf0793a69cb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -98,7 +98,8 @@ public class HotspotTile extends QSTileImpl<AirplaneBooleanState> { @Override protected void handleClick() { final boolean isEnabled = mState.value; - if (!isEnabled && mAirplaneMode.getValue() != 0) { + if (!isEnabled && + (mAirplaneMode.getValue() != 0 || mDataSaverController.isDataSaverEnabled())) { return; } // Immediately enter transient enabling state when turning hotspot on. diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 1736f386a3b3..be0aa117b9b4 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -16,6 +16,10 @@ package com.android.systemui.settings; +import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX; +import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear; +import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma; + import android.animation.ValueAnimator; import android.content.ContentResolver; import android.content.Context; @@ -24,7 +28,6 @@ import android.hardware.display.DisplayManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; -import android.os.IPowerManager; import android.os.Looper; import android.os.Message; import android.os.PowerManager; @@ -36,7 +39,6 @@ import android.provider.Settings; import android.service.vr.IVrManager; import android.service.vr.IVrStateCallbacks; import android.util.Log; -import android.util.MathUtils; import android.widget.ImageView; import com.android.internal.logging.MetricsLogger; @@ -50,15 +52,8 @@ public class BrightnessController implements ToggleSlider.Listener { private static final String TAG = "StatusBar.BrightnessController"; private static final boolean SHOW_AUTOMATIC_ICON = false; - private static final int SLIDER_MAX = 1023; private static final int SLIDER_ANIMATION_DURATION = 3000; - // Hybrid Log Gamma constant values - private static final float R = 0.5f; - private static final float A = 0.17883277f; - private static final float B = 0.28466892f; - private static final float C = 0.55991073f; - private static final int MSG_UPDATE_ICON = 0; private static final int MSG_UPDATE_SLIDER = 1; private static final int MSG_SET_CHECKED = 2; @@ -273,7 +268,7 @@ public class BrightnessController implements ToggleSlider.Listener { mContext = context; mIcon = icon; mControl = control; - mControl.setMax(SLIDER_MAX); + mControl.setMax(GAMMA_SPACE_MAX); mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER)); mUserTracker = new CurrentUserTracker(mContext) { @Override @@ -481,76 +476,4 @@ public class BrightnessController implements ToggleSlider.Listener { mSliderAnimator.start(); } - /** - * A function for converting from the linear space that the setting works in to the - * gamma space that the slider works in. - * - * The gamma space effectively provides us a way to make linear changes to the slider that - * result in linear changes in perception. If we made changes to the slider in the linear space - * then we'd see an approximately logarithmic change in perception (c.f. Fechner's Law). - * - * Internally, this implements the Hybrid Log Gamma opto-electronic transfer function, which is - * a slight improvement to the typical gamma transfer function for displays whose max - * brightness exceeds the 120 nit reference point, but doesn't set a specific reference - * brightness like the PQ function does. - * - * Note that this transfer function is only valid if the display's backlight value is a linear - * control. If it's calibrated to be something non-linear, then a different transfer function - * should be used. - * - * @param val The brightness setting value. - * @param min The minimum acceptable value for the setting. - * @param max The maximum acceptable value for the setting. - * - * @return The corresponding slider value - */ - private static final int convertLinearToGamma(int val, int min, int max) { - // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1] - final float normalizedVal = MathUtils.norm(min, max, val) * 12; - final float ret; - if (normalizedVal <= 1f) { - ret = MathUtils.sqrt(normalizedVal) * R; - } else { - ret = A * MathUtils.log(normalizedVal - B) + C; - } - - return Math.round(MathUtils.lerp(0, SLIDER_MAX, ret)); - } - - /** - * A function for converting from the gamma space that the slider works in to the - * linear space that the setting works in. - * - * The gamma space effectively provides us a way to make linear changes to the slider that - * result in linear changes in perception. If we made changes to the slider in the linear space - * then we'd see an approximately logarithmic change in perception (c.f. Fechner's Law). - * - * Internally, this implements the Hybrid Log Gamma electro-optical transfer function, which is - * a slight improvement to the typical gamma transfer function for displays whose max - * brightness exceeds the 120 nit reference point, but doesn't set a specific reference - * brightness like the PQ function does. - * - * Note that this transfer function is only valid if the display's backlight value is a linear - * control. If it's calibrated to be something non-linear, then a different transfer function - * should be used. - * - * @param val The slider value. - * @param min The minimum acceptable value for the setting. - * @param max The maximum acceptable value for the setting. - * - * @return The corresponding setting value. - */ - private static final int convertGammaToLinear(int val, int min, int max) { - final float normalizedVal = MathUtils.norm(0, SLIDER_MAX, val); - final float ret; - if (normalizedVal <= R) { - ret = MathUtils.sq(normalizedVal/R); - } else { - ret = MathUtils.exp((normalizedVal - C) / A) + B; - } - - // HLG is normalized to the range [0, 12], so we need to re-normalize to the range [0, 1] - // in order to derive the correct setting value. - return Math.round(MathUtils.lerp(min, max, ret / 12)); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index e527be1a61f9..5477468505a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -81,7 +81,7 @@ public class NotificationContentView extends FrameLayout { private SmartReplyConstants mSmartReplyConstants; private SmartReplyView mExpandedSmartReplyView; - private SmartReplyLogger mSmartReplyLogger; + private SmartReplyController mSmartReplyController; private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; @@ -154,7 +154,7 @@ public class NotificationContentView extends FrameLayout { super(context, attrs); mHybridGroupManager = new HybridGroupManager(getContext(), this); mSmartReplyConstants = Dependency.get(SmartReplyConstants.class); - mSmartReplyLogger = Dependency.get(SmartReplyLogger.class); + mSmartReplyController = Dependency.get(SmartReplyController.class); initView(); } @@ -1359,7 +1359,7 @@ public class NotificationContentView extends FrameLayout { applySmartReplyView(mExpandedChild, remoteInput, pendingIntent, entry); if (mExpandedSmartReplyView != null && remoteInput != null && remoteInput.getChoices() != null && remoteInput.getChoices().length > 0) { - mSmartReplyLogger.smartRepliesAdded(entry, remoteInput.getChoices().length); + mSmartReplyController.smartRepliesAdded(entry, remoteInput.getChoices().length); } } } @@ -1377,6 +1377,13 @@ public class NotificationContentView extends FrameLayout { smartReplyContainer.setVisibility(View.GONE); return null; } + // If we are showing the spinner we don't want to add the buttons. + boolean showingSpinner = entry.notification.getNotification() + .extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false); + if (showingSpinner) { + smartReplyContainer.setVisibility(View.GONE); + return null; + } SmartReplyView smartReplyView = null; if (smartReplyContainer.getChildCount() == 0) { smartReplyView = SmartReplyView.inflate(mContext, smartReplyContainer); @@ -1389,7 +1396,7 @@ public class NotificationContentView extends FrameLayout { } if (smartReplyView != null) { smartReplyView.setRepliesFromRemoteInput(remoteInput, pendingIntent, - mSmartReplyLogger, entry); + mSmartReplyController, entry, smartReplyContainer); smartReplyContainer.setVisibility(View.VISIBLE); } return smartReplyView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java index 3a79e70bfc7d..7681530503a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java @@ -474,37 +474,12 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. if (FORCE_REMOTE_INPUT_HISTORY && shouldKeepForRemoteInput(entry) && entry.row != null && !entry.row.isDismissed()) { - StatusBarNotification sbn = entry.notification; - - Notification.Builder b = Notification.Builder - .recoverBuilder(mContext, sbn.getNotification().clone()); - CharSequence[] oldHistory = sbn.getNotification().extras - .getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY); - CharSequence[] newHistory; - if (oldHistory == null) { - newHistory = new CharSequence[1]; - } else { - newHistory = new CharSequence[oldHistory.length + 1]; - System.arraycopy(oldHistory, 0, newHistory, 1, oldHistory.length); - } CharSequence remoteInputText = entry.remoteInputText; if (TextUtils.isEmpty(remoteInputText)) { remoteInputText = entry.remoteInputTextWhenReset; } - newHistory[0] = String.valueOf(remoteInputText); - b.setRemoteInputHistory(newHistory); - - Notification newNotification = b.build(); - - // Undo any compatibility view inflation - newNotification.contentView = sbn.getNotification().contentView; - newNotification.bigContentView = sbn.getNotification().bigContentView; - newNotification.headsUpContentView = sbn.getNotification().headsUpContentView; - - StatusBarNotification newSbn = new StatusBarNotification(sbn.getPackageName(), - sbn.getOpPkg(), - sbn.getId(), sbn.getTag(), sbn.getUid(), sbn.getInitialPid(), - newNotification, sbn.getUser(), sbn.getOverrideGroupKey(), sbn.getPostTime()); + StatusBarNotification newSbn = rebuildNotificationWithRemoteInput(entry, + remoteInputText, false /* showSpinner */); boolean updated = false; entry.onRemoteInputInserted(); try { @@ -554,6 +529,39 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. mCallback.onNotificationRemoved(key, old); } + public StatusBarNotification rebuildNotificationWithRemoteInput(NotificationData.Entry entry, + CharSequence remoteInputText, boolean showSpinner) { + StatusBarNotification sbn = entry.notification; + + Notification.Builder b = Notification.Builder + .recoverBuilder(mContext, sbn.getNotification().clone()); + CharSequence[] oldHistory = sbn.getNotification().extras + .getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY); + CharSequence[] newHistory; + if (oldHistory == null) { + newHistory = new CharSequence[1]; + } else { + newHistory = new CharSequence[oldHistory.length + 1]; + System.arraycopy(oldHistory, 0, newHistory, 1, oldHistory.length); + } + newHistory[0] = String.valueOf(remoteInputText); + b.setRemoteInputHistory(newHistory); + b.setShowRemoteInputSpinner(showSpinner); + + Notification newNotification = b.build(); + + // Undo any compatibility view inflation + newNotification.contentView = sbn.getNotification().contentView; + newNotification.bigContentView = sbn.getNotification().bigContentView; + newNotification.headsUpContentView = sbn.getNotification().headsUpContentView; + + StatusBarNotification newSbn = new StatusBarNotification(sbn.getPackageName(), + sbn.getOpPkg(), + sbn.getId(), sbn.getTag(), sbn.getUid(), sbn.getInitialPid(), + newNotification, sbn.getUser(), sbn.getOverrideGroupKey(), sbn.getPostTime()); + return newSbn; + } + private boolean shouldKeepForRemoteInput(NotificationData.Entry entry) { if (entry == null) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index abc261e6bbf6..f737a8cec4f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -172,27 +172,28 @@ public class NotificationMediaManager implements Dumpable { } } - if (mediaNotification != null) { - mMediaNotificationKey = mediaNotification.notification.getKey(); - if (DEBUG_MEDIA) { - Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key=" - + mMediaNotificationKey + " controller=" + mMediaController); - } - } - if (controller != null && !sameSessions(mMediaController, controller)) { // We have a new media session - clearCurrentMediaNotification(); + clearCurrentMediaNotificationSession(); mMediaController = controller; mMediaController.registerCallback(mMediaListener); mMediaMetadata = mMediaController.getMetadata(); if (DEBUG_MEDIA) { - Log.v(TAG, "DEBUG_MEDIA: insert listener, receive metadata: " - + mMediaMetadata); + Log.v(TAG, "DEBUG_MEDIA: insert listener, found new controller: " + + mMediaController + ", receive metadata: " + mMediaMetadata); } metaDataChanged = true; } + + if (mediaNotification != null + && !mediaNotification.notification.getKey().equals(mMediaNotificationKey)) { + mMediaNotificationKey = mediaNotification.notification.getKey(); + if (DEBUG_MEDIA) { + Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key=" + + mMediaNotificationKey); + } + } } if (metaDataChanged) { @@ -203,15 +204,7 @@ public class NotificationMediaManager implements Dumpable { public void clearCurrentMediaNotification() { mMediaNotificationKey = null; - mMediaMetadata = null; - if (mMediaController != null) { - if (DEBUG_MEDIA) { - Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " - + mMediaController.getPackageName()); - } - mMediaController.unregisterCallback(mMediaListener); - } - mMediaController = null; + clearCurrentMediaNotificationSession(); } @Override @@ -265,4 +258,16 @@ public class NotificationMediaManager implements Dumpable { entry.getExpandedContentView() .findViewById(com.android.internal.R.id.media_actions) != null; } + + private void clearCurrentMediaNotificationSession() { + mMediaMetadata = null; + if (mMediaController != null) { + if (DEBUG_MEDIA) { + Log.v(TAG, "DEBUG_MEDIA: Disconnecting from old controller: " + + mMediaController.getPackageName()); + } + mMediaController.unregisterCallback(mMediaListener); + } + mMediaController = null; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 44136c58875d..d3caf0351d03 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -407,13 +407,14 @@ public class NotificationShelf extends ActivatableNotificationView implements boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark(); boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null; if (needsContinuousClipping && !isContinuousClipping) { + final ViewTreeObserver observer = icon.getViewTreeObserver(); ViewTreeObserver.OnPreDrawListener predrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { boolean animatingY = ViewState.isAnimatingY(icon); - if (!animatingY || !icon.isAttachedToWindow()) { - icon.getViewTreeObserver().removeOnPreDrawListener(this); + if (!animatingY) { + observer.removeOnPreDrawListener(this); icon.setTag(TAG_CONTINUOUS_CLIPPING, null); return true; } @@ -421,7 +422,20 @@ public class NotificationShelf extends ActivatableNotificationView implements return true; } }; - icon.getViewTreeObserver().addOnPreDrawListener(predrawListener); + observer.addOnPreDrawListener(predrawListener); + icon.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + } + + @Override + public void onViewDetachedFromWindow(View v) { + if (v == icon) { + observer.removeOnPreDrawListener(predrawListener); + icon.setTag(TAG_CONTINUOUS_CLIPPING, null); + } + } + }); icon.setTag(TAG_CONTINUOUS_CLIPPING, predrawListener); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java index 75dd77d8ec3a..67da68cd9e92 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyLogger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SmartReplyController.java @@ -15,24 +15,32 @@ */ package com.android.systemui.statusbar; -import android.content.Context; import android.os.RemoteException; -import android.os.ServiceManager; +import android.service.notification.StatusBarNotification; + import com.android.internal.statusbar.IStatusBarService; +import com.android.systemui.Dependency; + /** - * Handles reporting when smart replies are added to a notification + * Handles when smart replies are added to a notification * and clicked upon. */ -public class SmartReplyLogger { - protected IStatusBarService mBarService; +public class SmartReplyController { + private IStatusBarService mBarService; + private NotificationEntryManager mNotificationEntryManager; - public SmartReplyLogger(Context context) { - mBarService = IStatusBarService.Stub.asInterface( - ServiceManager.getService(Context.STATUS_BAR_SERVICE)); + public SmartReplyController() { + mBarService = Dependency.get(IStatusBarService.class); + mNotificationEntryManager = Dependency.get(NotificationEntryManager.class); } - public void smartReplySent(NotificationData.Entry entry, int replyIndex) { + public void smartReplySent(NotificationData.Entry entry, int replyIndex, CharSequence reply) { + StatusBarNotification newSbn = + mNotificationEntryManager.rebuildNotificationWithRemoteInput(entry, reply, + true /* showSpinner */); + mNotificationEntryManager.updateNotification(newSbn, null /* ranking */); + try { mBarService.onNotificationSmartReplySent(entry.notification.getKey(), replyIndex); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java index f4e4581215b5..5748ec9beef8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java @@ -100,13 +100,13 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D } if (mState == null) { - mState = state; + mState = state.copy(); initViewState(); return; } if (!mState.equals(state)) { - updateState(state); + updateState(state.copy()); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java index 0e2714d4f42b..bf94c1f8a98b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java @@ -64,6 +64,7 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver, private WifiIconState mState; private String mSlot; private float mDarkIntensity = 0; + private int mVisibleState = -1; private ContextThemeWrapper mDarkContext; private ContextThemeWrapper mLightContext; @@ -73,6 +74,7 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver, StatusBarWifiView v = (StatusBarWifiView) inflater.inflate(R.layout.status_bar_wifi_group, null); v.setSlot(slot); v.init(); + v.setVisibleState(STATE_ICON); return v; } @@ -123,6 +125,11 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver, @Override public void setVisibleState(int state) { + if (state == mVisibleState) { + return; + } + mVisibleState = state; + switch (state) { case STATE_ICON: mWifiGroup.setVisibility(View.VISIBLE); @@ -139,12 +146,6 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver, } } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int width = MeasureSpec.getSize(widthMeasureSpec); - } - private void init() { int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme); int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme); @@ -180,12 +181,12 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver, } if (mState == null) { - mState = state; + mState = state.copy(); initViewState(); } if (!mState.equals(state)) { - updateState(state); + updateState(state.copy()); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java index 8160f9030bde..20986adbfe9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.view.Display; +import android.view.View; import java.util.HashMap; import java.util.List; @@ -73,36 +74,43 @@ public class CarFacetButtonController { */ public void taskChanged(List<ActivityManager.StackInfo> stackInfoList) { int displayId = getDisplayId(); + ActivityManager.StackInfo validStackInfo = null; for (ActivityManager.StackInfo stackInfo :stackInfoList) { - // if the display id is known and does not match the stack we skip - if (displayId != -1 && displayId != stackInfo.displayId || - stackInfo.topActivity == null) { - continue; + // If the display id is unknown or it matches the stack, it's valid for use + if ((displayId == -1 || displayId == stackInfo.displayId) && + stackInfo.topActivity != null) { + validStackInfo = stackInfo; + break; } + } - if (mSelectedFacetButton != null) { - mSelectedFacetButton.setSelected(false); - } + if (validStackInfo == null) { + // No stack was found that was on the same display as the facet buttons thus return + return; + } - String packageName = stackInfo.topActivity.getPackageName(); - CarFacetButton facetButton = findFacetButtongByComponentName(stackInfo.topActivity); - if (facetButton == null) { - facetButton = mButtonsByPackage.get(packageName); - } + if (mSelectedFacetButton != null) { + mSelectedFacetButton.setSelected(false); + } - if (facetButton == null) { - String category = getPackageCategory(packageName); - if (category != null) { - facetButton = mButtonsByCategory.get(category); - } - } + String packageName = validStackInfo.topActivity.getPackageName(); + CarFacetButton facetButton = findFacetButtongByComponentName(validStackInfo.topActivity); + if (facetButton == null) { + facetButton = mButtonsByPackage.get(packageName); + } - if (facetButton != null) { - facetButton.setSelected(true); - mSelectedFacetButton = facetButton; - return; + if (facetButton == null) { + String category = getPackageCategory(packageName); + if (category != null) { + facetButton = mButtonsByCategory.get(category); } } + + if (facetButton != null && facetButton.getVisibility() == View.VISIBLE) { + facetButton.setSelected(true); + mSelectedFacetButton = facetButton; + } + } private int getDisplayId() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java index b2cef16277f7..9ed092974963 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java @@ -36,10 +36,11 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; * in a linear layout. */ class CarNavigationBarView extends LinearLayout { - private LinearLayout mNavButtons; + private View mNavButtons; private AlphaOptimizedImageButton mNotificationsButton; private CarStatusBar mCarStatusBar; private Context mContext; + private View mLockScreenButtons; public CarNavigationBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -49,6 +50,7 @@ class CarNavigationBarView extends LinearLayout { @Override public void onFinishInflate() { mNavButtons = findViewById(R.id.nav_buttons); + mLockScreenButtons = findViewById(R.id.lock_screen_nav_buttons); mNotificationsButton = findViewById(R.id.notifications); if (mNotificationsButton != null) { @@ -74,4 +76,28 @@ class CarNavigationBarView extends LinearLayout { protected void onNotificationsClick(View v) { mCarStatusBar.togglePanel(); } + + /** + * If there are buttons declared in the layout they will be shown and the normal + * Nav buttons will be hidden. + */ + public void showKeyguardButtons() { + if (mLockScreenButtons == null) { + return; + } + mLockScreenButtons.setVisibility(View.VISIBLE); + mNavButtons.setVisibility(View.GONE); + } + + /** + * If there are buttons declared in the layout they will be hidden and the normal + * Nav buttons will be shown. + */ + public void hideKeyguardButtons() { + if (mLockScreenButtons == null) { + return; + } + mNavButtons.setVisibility(View.VISIBLE); + mLockScreenButtons.setVisibility(View.GONE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 9c60f5c60bd2..83021ca51a55 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -141,6 +141,52 @@ public class CarStatusBar extends StatusBar implements buildNavBarContent(); } + /** + * Allows for showing or hiding just the navigation bars. This is indented to be used when + * the full screen user selector is shown. + */ + void setNavBarVisibility(@View.Visibility int visibility) { + if (mNavigationBarWindow != null) { + mNavigationBarWindow.setVisibility(visibility); + } + if (mLeftNavigationBarWindow != null) { + mLeftNavigationBarWindow.setVisibility(visibility); + } + if (mRightNavigationBarWindow != null) { + mRightNavigationBarWindow.setVisibility(visibility); + } + } + + + @Override + public boolean hideKeyguard() { + boolean result = super.hideKeyguard(); + if (mNavigationBarView != null) { + mNavigationBarView.hideKeyguardButtons(); + } + if (mLeftNavigationBarView != null) { + mLeftNavigationBarView.hideKeyguardButtons(); + } + if (mRightNavigationBarView != null) { + mRightNavigationBarView.hideKeyguardButtons(); + } + return result; + } + + + @Override + public void showKeyguard() { + super.showKeyguard(); + if (mNavigationBarView != null) { + mNavigationBarView.showKeyguardButtons(); + } + if (mLeftNavigationBarView != null) { + mLeftNavigationBarView.showKeyguardButtons(); + } + if (mRightNavigationBarView != null) { + mRightNavigationBarView.showKeyguardButtons(); + } + } @Override public void destroy() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java new file mode 100644 index 000000000000..7a8d22bee2d8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBarKeyguardViewManager.java @@ -0,0 +1,31 @@ +package com.android.systemui.statusbar.car; + +import android.content.Context; +import android.view.View; + +import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.R; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; + +public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager { + + protected boolean mShouldHideNavBar; + + public CarStatusBarKeyguardViewManager(Context context, + ViewMediatorCallback callback, + LockPatternUtils lockPatternUtils) { + super(context, callback, lockPatternUtils); + mShouldHideNavBar =context.getResources() + .getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown); + } + + @Override + protected void updateNavigationBarVisibility(boolean navBarVisible) { + if(!mShouldHideNavBar) { + return; + } + CarStatusBar statusBar = (CarStatusBar) mStatusBar; + statusBar.setNavBarVisibility(navBarVisible ? View.VISIBLE : View.GONE); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java index 1148fad90dde..5768fa2384e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java @@ -207,7 +207,7 @@ public class UserGridRecyclerView extends PagedListView implements // If the user selects Guest, start the guest session. if (userRecord.mIsStartGuestSession) { - mUserManagerHelper.switchToGuest(mGuestName); + mUserManagerHelper.startNewGuestSession(mGuestName); return; } @@ -241,8 +241,7 @@ public class UserGridRecyclerView extends PagedListView implements private Bitmap getUserRecordIcon(UserRecord userRecord) { if (userRecord.mIsStartGuestSession) { - return UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon( - mContext.getResources(), UserHandle.USER_NULL, false)); + return mUserManagerHelper.getGuestDefaultIcon(); } if (userRecord.mIsAddUser) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java new file mode 100644 index 000000000000..8143c13b8b55 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java @@ -0,0 +1,85 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.car.hvac; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.TextView; + +import com.android.systemui.Dependency; +import com.android.systemui.R; + +/** + * Simple text display of HVAC properties, It is designed to show temperature and is configured in + * the XML. + * XML properties: + * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) + * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol) + * + * Note: It registers itself with {@link HvacController} + */ +public class TemperatureTextView extends TextView implements TemperatureView { + + private final int mAreaId; + private final int mPropertyId; + private final String mTempFormat; + + public TemperatureTextView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView); + mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId,-1); + mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1); + String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat); + mTempFormat = (format == null) ? "%.1f\u00B0" : format; + + // register with controller + HvacController hvacController = Dependency.get(HvacController.class); + hvacController.addHvacTextView(this); + } + + /** + * Formats the float for display + * @param temp - The current temp or NaN + */ + @Override + public void setTemp(float temp) { + if (Float.isNaN(temp)) { + setText("--"); + return; + } + setText(String.format(mTempFormat, temp)); + } + + /** + * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) + */ + @Override + public int getPropertyId() { + return mPropertyId; + } + + /** + * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + */ + @Override + public int getAreaId() { + return mAreaId; + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java index 4049ec3aa385..7651356f98a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureView.java @@ -16,67 +16,25 @@ package com.android.systemui.statusbar.car.hvac; -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.widget.TextView; - -import com.android.systemui.Dependency; -import com.android.systemui.R; - /** - * Simple text display of HVAC properties, It is designed to show temperature and is configured in - * the XML. - * XML properties: - * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) - * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) - * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol) - * - * Note: It registers itself with {@link HvacController} + * Interface for Views that display temperature HVAC properties */ -public class TemperatureView extends TextView { - - private final int mAreaId; - private final int mPropertyId; - private final String mTempFormat; - - public TemperatureView(Context context, AttributeSet attrs) { - super(context, attrs); - TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView); - mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId,-1); - mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1); - String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat); - mTempFormat = (format == null) ? "%.1f\u00B0" : format; - - // register with controller - HvacController hvacController = Dependency.get(HvacController.class); - hvacController.addHvacTextView(this); - } - +public interface TemperatureView { /** * Formats the float for display + * * @param temp - The current temp or NaN */ - public void setTemp(float temp) { - if (Float.isNaN(temp)) { - setText("--"); - return; - } - setText(String.format(mTempFormat, temp)); - } + void setTemp(float temp); + /** * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) */ - public int getPropertyId() { - return mPropertyId; - } + int getPropertyId(); /** * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) */ - public int getAreaId() { - return mAreaId; - } + int getAreaId(); } - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index b8bce95190f8..20ab64cfdb17 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -123,83 +123,102 @@ public class ActivityLaunchAnimator { IRemoteAnimationFinishedCallback iRemoteAnimationFinishedCallback) throws RemoteException { mSourceNotification.post(() -> { - for (RemoteAnimationTarget app : remoteAnimationTargets) { - if (app.mode == RemoteAnimationTarget.MODE_OPENING) { - setExpandAnimationRunning(true); - mInstantCollapsePanel = app.position.y == 0 - && app.sourceContainerBounds.height() - >= mNotificationPanel.getHeight(); - if (!mInstantCollapsePanel) { - mNotificationPanel.collapseWithDuration(ANIMATION_DURATION); - } - ValueAnimator anim = ValueAnimator.ofFloat(0, 1); - mParams.startPosition = mSourceNotification.getLocationOnScreen(); - mParams.startTranslationZ = mSourceNotification.getTranslationZ(); - mParams.startClipTopAmount = mSourceNotification.getClipTopAmount(); - if (mSourceNotification.isChildInGroup()) { - int parentClip = mSourceNotification - .getNotificationParent().getClipTopAmount(); - mParams.parentStartClipTopAmount = parentClip; - // We need to calculate how much the child is clipped by the parent - // because children always have 0 clipTopAmount - if (parentClip != 0) { - float childClip = parentClip - - mSourceNotification.getTranslationY(); - if (childClip > 0.0f) { - mParams.startClipTopAmount = (int) Math.ceil(childClip); - } - } + RemoteAnimationTarget primary = getPrimaryRemoteAnimationTarget( + remoteAnimationTargets); + if (primary == null) { + setAnimationPending(false); + invokeCallback(iRemoteAnimationFinishedCallback); + return; + } + + setExpandAnimationRunning(true); + mInstantCollapsePanel = primary.position.y == 0 + && primary.sourceContainerBounds.height() + >= mNotificationPanel.getHeight(); + if (!mInstantCollapsePanel) { + mNotificationPanel.collapseWithDuration(ANIMATION_DURATION); + } + ValueAnimator anim = ValueAnimator.ofFloat(0, 1); + mParams.startPosition = mSourceNotification.getLocationOnScreen(); + mParams.startTranslationZ = mSourceNotification.getTranslationZ(); + mParams.startClipTopAmount = mSourceNotification.getClipTopAmount(); + if (mSourceNotification.isChildInGroup()) { + int parentClip = mSourceNotification + .getNotificationParent().getClipTopAmount(); + mParams.parentStartClipTopAmount = parentClip; + // We need to calculate how much the child is clipped by the parent + // because children always have 0 clipTopAmount + if (parentClip != 0) { + float childClip = parentClip + - mSourceNotification.getTranslationY(); + if (childClip > 0.0f) { + mParams.startClipTopAmount = (int) Math.ceil(childClip); } - int targetWidth = app.sourceContainerBounds.width(); - int notificationHeight = mSourceNotification.getActualHeight() - - mSourceNotification.getClipBottomAmount(); - int notificationWidth = mSourceNotification.getWidth(); - anim.setDuration(ANIMATION_DURATION); - anim.setInterpolator(Interpolators.LINEAR); - anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - mParams.linearProgress = animation.getAnimatedFraction(); - float progress - = Interpolators.FAST_OUT_SLOW_IN.getInterpolation( - mParams.linearProgress); - int newWidth = (int) MathUtils.lerp(notificationWidth, - targetWidth, progress); - mParams.left = (int) ((targetWidth - newWidth) / 2.0f); - mParams.right = mParams.left + newWidth; - mParams.top = (int) MathUtils.lerp(mParams.startPosition[1], - app.position.y, progress); - mParams.bottom = (int) MathUtils.lerp(mParams.startPosition[1] - + notificationHeight, - app.position.y + app.sourceContainerBounds.bottom, - progress); - applyParamsToWindow(app); - applyParamsToNotification(mParams); - applyParamsToNotificationList(mParams); - } - }); - anim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - setExpandAnimationRunning(false); - if (mInstantCollapsePanel) { - mStatusBar.collapsePanel(false /* animate */); - } - try { - iRemoteAnimationFinishedCallback.onAnimationFinished(); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - }); - anim.start(); - break; } } + int targetWidth = primary.sourceContainerBounds.width(); + int notificationHeight = mSourceNotification.getActualHeight() + - mSourceNotification.getClipBottomAmount(); + int notificationWidth = mSourceNotification.getWidth(); + anim.setDuration(ANIMATION_DURATION); + anim.setInterpolator(Interpolators.LINEAR); + anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mParams.linearProgress = animation.getAnimatedFraction(); + float progress + = Interpolators.FAST_OUT_SLOW_IN.getInterpolation( + mParams.linearProgress); + int newWidth = (int) MathUtils.lerp(notificationWidth, + targetWidth, progress); + mParams.left = (int) ((targetWidth - newWidth) / 2.0f); + mParams.right = mParams.left + newWidth; + mParams.top = (int) MathUtils.lerp(mParams.startPosition[1], + primary.position.y, progress); + mParams.bottom = (int) MathUtils.lerp(mParams.startPosition[1] + + notificationHeight, + primary.position.y + primary.sourceContainerBounds.bottom, + progress); + applyParamsToWindow(primary); + applyParamsToNotification(mParams); + applyParamsToNotificationList(mParams); + } + }); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setExpandAnimationRunning(false); + if (mInstantCollapsePanel) { + mStatusBar.collapsePanel(false /* animate */); + } + invokeCallback(iRemoteAnimationFinishedCallback); + } + }); + anim.start(); setAnimationPending(false); }); } + private void invokeCallback(IRemoteAnimationFinishedCallback callback) { + try { + callback.onAnimationFinished(); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + private RemoteAnimationTarget getPrimaryRemoteAnimationTarget( + RemoteAnimationTarget[] remoteAnimationTargets) { + RemoteAnimationTarget primary = null; + for (RemoteAnimationTarget app : remoteAnimationTargets) { + if (app.mode == RemoteAnimationTarget.MODE_OPENING) { + primary = app; + break; + } + } + return primary; + } + private void setExpandAnimationRunning(boolean running) { mNotificationPanel.setLaunchingNotification(running); mSourceNotification.setExpandAnimationRunning(running); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java index 5f7b638dc872..c9dcc5c688ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java @@ -16,16 +16,25 @@ package com.android.systemui.statusbar.notification; +import android.app.PendingIntent; import android.content.Context; +import android.content.res.ColorStateList; import android.graphics.Color; +import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.service.notification.StatusBarNotification; +import android.util.ArraySet; import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import com.android.internal.util.NotificationColorUtil; import com.android.internal.widget.NotificationActionListLayout; +import com.android.systemui.Dependency; +import com.android.systemui.UiOffloadThread; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.TransformableView; @@ -43,12 +52,14 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp private TextView mTitle; private TextView mText; protected View mActionsContainer; - private View mReplyAction; + private ImageView mReplyAction; private Rect mTmpRect = new Rect(); private int mContentHeight; private int mMinHeightHint; private NotificationActionListLayout mActions; + private ArraySet<PendingIntent> mCancelledPendingIntents = new ArraySet<>(); + private UiOffloadThread mUiOffloadThread; protected NotificationTemplateViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { @@ -137,6 +148,98 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp mActionsContainer = mView.findViewById(com.android.internal.R.id.actions_container); mActions = mView.findViewById(com.android.internal.R.id.actions); mReplyAction = mView.findViewById(com.android.internal.R.id.reply_icon_action); + updatePendingIntentCancellations(); + } + + private void updatePendingIntentCancellations() { + if (mActions != null) { + int numActions = mActions.getChildCount(); + for (int i = 0; i < numActions; i++) { + Button action = (Button) mActions.getChildAt(i); + performOnPendingIntentCancellation(action, () -> { + if (action.isEnabled()) { + action.setEnabled(false); + // The visual appearance doesn't look disabled enough yet, let's add the + // alpha as well. Since Alpha doesn't play nicely right now with the + // transformation, we rather blend it manually with the background color. + ColorStateList textColors = action.getTextColors(); + int[] colors = textColors.getColors(); + int[] newColors = new int[colors.length]; + float disabledAlpha = mView.getResources().getFloat( + com.android.internal.R.dimen.notification_action_disabled_alpha); + for (int j = 0; j < colors.length; j++) { + int color = colors[j]; + color = blendColorWithBackground(color, disabledAlpha); + newColors[j] = color; + } + ColorStateList newColorStateList = new ColorStateList( + textColors.getStates(), newColors); + action.setTextColor(newColorStateList); + } + }); + } + } + if (mReplyAction != null) { + performOnPendingIntentCancellation(mReplyAction, () -> { + if (mReplyAction != null && mReplyAction.isEnabled()) { + mReplyAction.setEnabled(false); + // The visual appearance doesn't look disabled enough yet, let's add the + // alpha as well. Since Alpha doesn't play nicely right now with the + // transformation, we rather blend it manually with the background color. + Drawable drawable = mReplyAction.getDrawable().mutate(); + PorterDuffColorFilter colorFilter = + (PorterDuffColorFilter) drawable.getColorFilter(); + float disabledAlpha = mView.getResources().getFloat( + com.android.internal.R.dimen.notification_action_disabled_alpha); + if (colorFilter != null) { + int color = colorFilter.getColor(); + color = blendColorWithBackground(color, disabledAlpha); + drawable.mutate().setColorFilter(color, colorFilter.getMode()); + } else { + mReplyAction.setAlpha(disabledAlpha); + } + } + }); + } + } + + private int blendColorWithBackground(int color, float alpha) { + // alpha doesn't go well for color filters, so let's blend it manually + return NotificationColorUtil.compositeColors(Color.argb((int) (alpha * 255), + Color.red(color), Color.green(color), Color.blue(color)), resolveBackgroundColor()); + } + + private void performOnPendingIntentCancellation(View view, Runnable cancellationRunnable) { + PendingIntent pendingIntent = (PendingIntent) view.getTag( + com.android.internal.R.id.pending_intent_tag); + if (pendingIntent == null) { + return; + } + if (mCancelledPendingIntents.contains(pendingIntent)) { + cancellationRunnable.run(); + } else { + PendingIntent.CancelListener listener = (PendingIntent intent) -> { + mView.post(() -> { + mCancelledPendingIntents.add(pendingIntent); + cancellationRunnable.run(); + }); + }; + if (mUiOffloadThread == null) { + mUiOffloadThread = Dependency.get(UiOffloadThread.class); + } + mUiOffloadThread.submit(() -> pendingIntent.registerCancelListener(listener)); + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + mUiOffloadThread.submit(() -> pendingIntent.registerCancelListener(listener)); + } + + @Override + public void onViewDetachedFromWindow(View v) { + mUiOffloadThread.submit(() -> pendingIntent.unregisterCancelListener(listener)); + } + }); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java index b09df158072c..93a9947a3c9b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java @@ -175,6 +175,15 @@ public abstract class NotificationViewWrapper implements TransformableView { return mRow.isSummaryWithChildren() ? 0 : mBackgroundColor; } + protected int resolveBackgroundColor() { + int customBackgroundColor = getCustomBackgroundColor(); + if (customBackgroundColor != 0) { + return customBackgroundColor; + } + return mView.getContext().getColor( + com.android.internal.R.color.notification_material_background_color); + } + public void setLegacy(boolean legacy) { } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index d2d9c4c9613b..85fac16d1c7b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -30,6 +30,7 @@ import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.doze.AlwaysOnDisplayPolicy; +import com.android.systemui.doze.DozeScreenState; import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; @@ -153,7 +154,8 @@ public class DozeParameters implements TunerService.Tunable { * @return duration in millis. */ public long getWallpaperAodDuration() { - return mAlwaysOnPolicy.wallpaperVisibilityDuration; + return shouldControlScreenOff() ? DozeScreenState.ENTER_DOZE_HIDE_WALLPAPER_DELAY + : mAlwaysOnPolicy.wallpaperVisibilityDuration; } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 66176b36f048..2ddae7486859 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -281,6 +281,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_USER_SWITCHED); getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); notifyNavigationBarScreenOn(); mOverviewProxyService.addCallback(mOverviewProxyListener); @@ -521,7 +522,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // Clear any pending suggestion flag as it has either been nullified or is being shown mPendingRotationSuggestion = false; - getView().removeCallbacks(mCancelPendingRotationProposal); + if (getView() != null) getView().removeCallbacks(mCancelPendingRotationProposal); // Handle the visibility change and animation if (visible) { // Appear and change (cannot force) @@ -1084,6 +1085,10 @@ public class NavigationBarFragment extends Fragment implements Callbacks { || Intent.ACTION_SCREEN_ON.equals(action)) { notifyNavigationBarScreenOn(); } + if (Intent.ACTION_USER_SWITCHED.equals(action)) { + // The accessibility settings may be different for the new user + updateAccessibilityServicesState(mAccessibilityManager); + }; } }; @@ -1141,6 +1146,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private final Runnable mRipple = new Runnable() { @Override public void run() { // Cause the ripple to fire via false presses + if (!mRoot.isAttachedToWindow()) return; mRoot.setPressed(true); mRoot.setPressed(false); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java index ff5d0e3130f0..6b0ac948a036 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java @@ -34,7 +34,6 @@ import android.util.Log; import android.util.Slog; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; import android.view.WindowManagerGlobal; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; @@ -45,16 +44,13 @@ import com.android.systemui.R; import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.utilities.Utilities; +import com.android.systemui.shared.system.NavigationBarCompat; import static android.view.WindowManagerPolicyConstants.NAV_BAR_LEFT; import static android.view.WindowManagerPolicyConstants.NAV_BAR_BOTTOM; import static com.android.systemui.OverviewProxyService.DEBUG_OVERVIEW_PROXY; import static com.android.systemui.OverviewProxyService.TAG_OPS; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_DRAG_SLOP_PX; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_TOUCH_SLOP_PX; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_DRAG_SLOP_PX; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_TOUCH_SLOP_PX; /** * Class to detect gestures on the navigation bar and implement quick scrub. @@ -215,17 +211,23 @@ public class QuickStepController implements GestureHelper { int pos, touchDown, offset, trackSize; if (mIsVertical) { - exceededScrubTouchSlop = yDiff > QUICK_SCRUB_TOUCH_SLOP_PX && yDiff > xDiff; - exceededSwipeUpTouchSlop = xDiff > QUICK_STEP_TOUCH_SLOP_PX && xDiff > yDiff; - exceededScrubDragSlop = yDiff > QUICK_SCRUB_DRAG_SLOP_PX && yDiff > xDiff; + exceededScrubTouchSlop = + yDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && yDiff > xDiff; + exceededSwipeUpTouchSlop = + xDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && xDiff > yDiff; + exceededScrubDragSlop = + yDiff > NavigationBarCompat.getQuickScrubDragSlopPx() && yDiff > xDiff; pos = y; touchDown = mTouchDownY; offset = pos - mTrackRect.top; trackSize = mTrackRect.height(); } else { - exceededScrubTouchSlop = xDiff > QUICK_SCRUB_TOUCH_SLOP_PX && xDiff > yDiff; - exceededSwipeUpTouchSlop = yDiff > QUICK_STEP_TOUCH_SLOP_PX && yDiff > xDiff; - exceededScrubDragSlop = xDiff > QUICK_SCRUB_DRAG_SLOP_PX && xDiff > yDiff; + exceededScrubTouchSlop = + xDiff > NavigationBarCompat.getQuickScrubTouchSlopPx() && xDiff > yDiff; + exceededSwipeUpTouchSlop = + yDiff > NavigationBarCompat.getQuickStepTouchSlopPx() && yDiff > xDiff; + exceededScrubDragSlop = + xDiff > NavigationBarCompat.getQuickScrubDragSlopPx() && xDiff > yDiff; pos = x; touchDown = mTouchDownX; offset = pos - mTrackRect.left; 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 b4e7575d1480..24a589665600 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -88,7 +88,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu List<Slot> allSlots = getSlots(); for (int i = 0; i < allSlots.size(); i++) { Slot slot = allSlots.get(i); - List<StatusBarIconHolder> holders = slot.getHolderList(); + List<StatusBarIconHolder> holders = slot.getHolderListInViewOrder(); boolean blocked = mIconBlacklist.contains(slot.getName()); for (StatusBarIconHolder holder : holders) { @@ -121,7 +121,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu // Remove all the icons. for (int i = currentSlots.size() - 1; i >= 0; i--) { Slot s = currentSlots.get(i); - slotsToReAdd.put(s, s.getHolderList()); + slotsToReAdd.put(s, s.getHolderListInViewOrder()); removeAllIconsForSlot(s.getName()); } @@ -281,7 +281,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu mIconLogger.onIconHidden(slotName); int slotIndex = getSlotIndex(slotName); - List<StatusBarIconHolder> iconsToRemove = slot.getHolderList(); + List<StatusBarIconHolder> iconsToRemove = slot.getHolderListInViewOrder(); for (StatusBarIconHolder holder : iconsToRemove) { int viewIndex = getViewIndex(slotIndex, holder.getTag()); slot.removeForTag(holder.getTag()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java index e854dd0cd737..c4ff85fb7984 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java @@ -110,6 +110,10 @@ public class StatusBarIconHolder { } public void setVisible(boolean visible) { + if (isVisible() == visible) { + return; + } + switch (mType) { case TYPE_ICON: mIcon.visible = visible; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java index c773170a2756..b7e1cfb0097b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java @@ -211,7 +211,7 @@ public class StatusBarIconList { } /** - * View index is backwards from regular index + * View index is inverted from regular index, because they are laid out back-to-front * @param tag the tag of the holder being viewed * @return (1 + mSubSlots.size() - indexOfTag) */ @@ -228,14 +228,22 @@ public class StatusBarIconList { return subSlots - getIndexForTag(tag) - 1; } - public List<StatusBarIconHolder> getHolderList() { + /** + * Build a list of the {@link StatusBarIconHolder}s in the same order they appear in their + * view group. This provides a safe list that can be iterated and inserted into its group. + * + * @return all holders contained here, in view order + */ + public List<StatusBarIconHolder> getHolderListInViewOrder() { ArrayList<StatusBarIconHolder> holders = new ArrayList<>(); - if (mHolder != null) { - holders.add(mHolder); + if (mSubSlots != null) { + for (int i = mSubSlots.size() - 1; i >= 0; i--) { + holders.add(mSubSlots.get(i)); + } } - if (mSubSlots != null) { - holders.addAll(mSubSlots); + if (mHolder != null) { + holders.add(mHolder); } return holders; 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 e63a2e5f3d5c..b517d1164037 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -586,20 +586,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb boolean navBarVisible = isNavBarVisible(); boolean lastNavBarVisible = getLastNavBarVisible(); if (navBarVisible != lastNavBarVisible || mFirstUpdate) { - if (mStatusBar.getNavigationBarView() != null) { - if (navBarVisible) { - long delay = getNavBarShowDelay(); - if (delay == 0) { - mMakeNavigationBarVisibleRunnable.run(); - } else { - mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, - delay); - } - } else { - mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable); - mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE); - } - } + updateNavigationBarVisibility(navBarVisible); } if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) { @@ -626,6 +613,23 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mStatusBar.onKeyguardViewManagerStatesUpdated(); } + protected void updateNavigationBarVisibility(boolean navBarVisible) { + if (mStatusBar.getNavigationBarView() != null) { + if (navBarVisible) { + long delay = getNavBarShowDelay(); + if (delay == 0) { + mMakeNavigationBarVisibleRunnable.run(); + } else { + mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable, + delay); + } + } else { + mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable); + mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE); + } + } + } + /** * @return Whether the navigation bar should be made visible based on the current state. */ 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 669a8c83a6c5..7cd433a3868e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -388,6 +388,12 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba typeContentDescription); } + public MobileIconState copy() { + MobileIconState copy = new MobileIconState(this.subId); + copyTo(copy); + return copy; + } + public void copyTo(MobileIconState other) { super.copyTo(other); other.subId = subId; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 2437c5162833..fadc0eac9e73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -108,7 +108,6 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D mLp.gravity = Gravity.TOP; mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; mLp.setTitle("StatusBar"); - mLp.accessibilityTitle = mContext.getString(R.string.status_bar); mLp.packageName = mContext.getPackageName(); mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mStatusBarView = statusBarView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java index 44e87ff7b24a..8df51dbf5e68 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -234,6 +234,7 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa mEnabled = bluetoothState == BluetoothAdapter.STATE_ON || bluetoothState == BluetoothAdapter.STATE_TURNING_ON; mState = bluetoothState; + updateConnected(); mHandler.sendEmptyMessage(H.MSG_STATE_CHANGED); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java index ef630c7205e1..dcce77c7c355 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java @@ -43,17 +43,6 @@ public class DateView extends TextView { private String mLastText; private String mDatePattern; - /** - * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings - * for text. - */ - private boolean mUseWallpaperTextColor; - - /** - * Color to be set on this {@link TextView}, when wallpaperTextColor is <b>not</b> utilized. - */ - private int mNonAdaptedTextColor; - private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -74,7 +63,6 @@ public class DateView extends TextView { public DateView(Context context, AttributeSet attrs) { super(context, attrs); - mNonAdaptedTextColor = getCurrentTextColor(); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.DateView, @@ -130,25 +118,6 @@ public class DateView extends TextView { } } - /** - * Sets whether the date view uses the wallpaperTextColor. If we're not using it, we'll revert - * back to dark-mode-based/tinted colors. - * - * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for text color - */ - public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) { - if (shouldUseWallpaperTextColor == mUseWallpaperTextColor) { - return; - } - mUseWallpaperTextColor = shouldUseWallpaperTextColor; - - if (mUseWallpaperTextColor) { - setTextColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor)); - } else { - setTextColor(mNonAdaptedTextColor); - } - } - public void setDatePattern(String pattern) { if (TextUtils.equals(pattern, mDatePattern)) { return; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index 22a48f0b0309..85cfde86089e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -49,12 +49,11 @@ import com.android.systemui.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider.ButtonInterface; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.NavigationBarCompat; import static android.view.KeyEvent.KEYCODE_HOME; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_TOUCH_SLOP_PX; -import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_TOUCH_SLOP_PX; public class KeyButtonView extends ImageView implements ButtonInterface { private static final String TAG = KeyButtonView.class.getSimpleName(); @@ -234,10 +233,12 @@ public class KeyButtonView extends ImageView implements ButtonInterface { x = (int)ev.getRawX(); y = (int)ev.getRawY(); - boolean exceededTouchSlopX = Math.abs(x - mTouchDownX) > - (mIsVertical ? QUICK_SCRUB_TOUCH_SLOP_PX : QUICK_STEP_TOUCH_SLOP_PX); - boolean exceededTouchSlopY = Math.abs(y - mTouchDownY) > - (mIsVertical ? QUICK_STEP_TOUCH_SLOP_PX : QUICK_SCRUB_TOUCH_SLOP_PX); + boolean exceededTouchSlopX = Math.abs(x - mTouchDownX) > (mIsVertical + ? NavigationBarCompat.getQuickScrubTouchSlopPx() + : NavigationBarCompat.getQuickStepTouchSlopPx()); + boolean exceededTouchSlopY = Math.abs(y - mTouchDownY) > (mIsVertical + ? NavigationBarCompat.getQuickStepTouchSlopPx() + : NavigationBarCompat.getQuickScrubTouchSlopPx()); if (exceededTouchSlopX || exceededTouchSlopY) { // When quick step is enabled, prevent animating the ripple triggered by // setPressed and decide to run it on touch up diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java index 143168210a51..b4fa2e8b16f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -26,7 +26,7 @@ import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationData; -import com.android.systemui.statusbar.SmartReplyLogger; +import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; @@ -73,6 +73,8 @@ public class SmartReplyView extends ViewGroup { private PriorityQueue<Button> mCandidateButtonQueueForSqueezing; + private View mSmartReplyContainer; + public SmartReplyView(Context context, AttributeSet attrs) { super(context, attrs); mConstants = Dependency.get(SmartReplyConstants.class); @@ -133,7 +135,9 @@ public class SmartReplyView extends ViewGroup { } public void setRepliesFromRemoteInput(RemoteInput remoteInput, PendingIntent pendingIntent, - SmartReplyLogger smartReplyLogger, NotificationData.Entry entry) { + SmartReplyController smartReplyController, NotificationData.Entry entry, + View smartReplyContainer) { + mSmartReplyContainer = smartReplyContainer; removeAllViews(); if (remoteInput != null && pendingIntent != null) { CharSequence[] choices = remoteInput.getChoices(); @@ -141,7 +145,7 @@ public class SmartReplyView extends ViewGroup { for (int i = 0; i < choices.length; ++i) { Button replyButton = inflateReplyButton( getContext(), this, i, choices[i], remoteInput, pendingIntent, - smartReplyLogger, entry); + smartReplyController, entry); addView(replyButton); } } @@ -157,7 +161,7 @@ public class SmartReplyView extends ViewGroup { @VisibleForTesting Button inflateReplyButton(Context context, ViewGroup root, int replyIndex, CharSequence choice, RemoteInput remoteInput, PendingIntent pendingIntent, - SmartReplyLogger smartReplyLogger, NotificationData.Entry entry) { + SmartReplyController smartReplyController, NotificationData.Entry entry) { Button b = (Button) LayoutInflater.from(context).inflate( R.layout.smart_reply_button, root, false); b.setText(choice); @@ -173,7 +177,8 @@ public class SmartReplyView extends ViewGroup { } catch (PendingIntent.CanceledException e) { Log.w(TAG, "Unable to send smart reply", e); } - smartReplyLogger.smartReplySent(entry, replyIndex); + smartReplyController.smartReplySent(entry, replyIndex, b.getText()); + mSmartReplyContainer.setVisibility(View.GONE); return false; // do not defer }; diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 5a4478f072e0..611d4eb67824 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -16,21 +16,14 @@ package com.android.systemui.tuner; import android.app.ActivityManager; -import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.Looper; -import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Secure; @@ -38,15 +31,12 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; +import com.android.internal.util.ArrayUtils; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; -import com.android.systemui.R; -import com.android.systemui.SysUiServiceProvider; -import com.android.systemui.SystemUI; -import com.android.systemui.SystemUIApplication; +import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; -import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.util.leak.LeakDetector; import java.util.HashMap; @@ -58,7 +48,13 @@ public class TunerServiceImpl extends TunerService { private static final String TUNER_VERSION = "sysui_tuner_version"; - private static final int CURRENT_TUNER_VERSION = 2; + private static final int CURRENT_TUNER_VERSION = 4; + + // Things that use the tunable infrastructure but are now real user settings and + // shouldn't be reset with tuner settings. + private static final String[] RESET_BLACKLIST = new String[] { + QSTileHost.TILES_SETTING, + }; private final Observer mObserver = new Observer(); // Map of Uris we listen on to their settings keys. @@ -119,6 +115,11 @@ public class TunerServiceImpl extends TunerService { if (oldVersion < 2) { setTunerEnabled(mContext, false); } + // 3 Removed because of a revert. + if (oldVersion < 4) { + // Delay this so that we can wait for everything to be registered first. + new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(() -> clearAll(), 5000); + } setValue(TUNER_VERSION, newVersion); } @@ -226,6 +227,9 @@ public class TunerServiceImpl extends TunerService { mContext.sendBroadcast(intent); for (String key : mTunableLookup.keySet()) { + if (ArrayUtils.contains(RESET_BLACKLIST, key)) { + continue; + } Settings.Secure.putString(mContentResolver, key, null); } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java index 64abfe243693..f1a7183e1602 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java @@ -16,6 +16,9 @@ package com.android.systemui.volume; +import android.animation.Animator; +import android.animation.AnimatorInflater; +import android.animation.AnimatorSet; import android.annotation.Nullable; import android.app.Dialog; import android.app.KeyguardManager; @@ -24,6 +27,7 @@ import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.AudioSystem; import android.os.Debug; @@ -80,7 +84,6 @@ public class CarVolumeDialogImpl implements VolumeDialog { private Window mWindow; private CustomDialog mDialog; - private ViewGroup mDialogView; private PagedListView mListView; private ListItemAdapter mPagedListAdapter; private final List<ListItem> mVolumeLineItems = new ArrayList<>(); @@ -99,29 +102,6 @@ public class CarVolumeDialogImpl implements VolumeDialog { private boolean mHovering = false; private boolean mExpanded; - private final View.OnClickListener mSupplementalIconListener = v -> { - mExpanded = !mExpanded; - if (mExpanded) { - for (VolumeRow row : mRows) { - // Adding the items which are not coming from default stream. - if (!row.defaultStream) { - addSeekbarListItem(row, null); - } - } - } else { - // Only keeping the default stream if it is not expended. - Iterator itr = mVolumeLineItems.iterator(); - while (itr.hasNext()) { - SeekbarListItem item = (SeekbarListItem) itr.next(); - VolumeRow row = findRow(item); - if (!row.defaultStream) { - itr.remove(); - } - } - } - mPagedListAdapter.notifyDataSetChanged(); - }; - public CarVolumeDialogImpl(Context context) { mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme); mController = Dependency.get(VolumeDialogController.class); @@ -175,31 +155,31 @@ public class CarVolumeDialogImpl implements VolumeDialog { mDialog.setCanceledOnTouchOutside(true); mDialog.setContentView(R.layout.car_volume_dialog); mDialog.setOnShowListener(dialog -> { - mDialogView.setTranslationY(-mDialogView.getHeight()); - mDialogView.setAlpha(0); - mDialogView.animate() + mListView.setTranslationY(-mListView.getHeight()); + mListView.setAlpha(0); + mListView.animate() .alpha(1) .translationY(0) .setDuration(300) .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator()) .start(); }); - mDialogView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog); - mDialogView.setOnHoverListener((v, event) -> { + mListView = (PagedListView) mWindow.findViewById(R.id.volume_list); + mListView.setOnHoverListener((v, event) -> { int action = event.getActionMasked(); mHovering = (action == MotionEvent.ACTION_HOVER_ENTER) || (action == MotionEvent.ACTION_HOVER_MOVE); rescheduleTimeoutH(); return true; }); - mListView = (PagedListView) mWindow.findViewById(R.id.volume_list); - // TODO: apply tint to the supplement icon. - addSeekbarListItem(addVolumeRow(AudioManager.STREAM_MUSIC, R.drawable.ic_volume_media, - R.drawable.car_ic_arrow_drop_up, true, true), mSupplementalIconListener); - addVolumeRow(AudioManager.STREAM_RING, R.drawable.ic_volume_ringer, 0, + addSeekbarListItem(addVolumeRow(AudioManager.STREAM_MUSIC, R.drawable.car_ic_music, + R.drawable.car_ic_keyboard_arrow_down, true, true), + new ExpandIconListener()); + // We map AudioManager.STREAM_RING to a navigation icon for demo. + addVolumeRow(AudioManager.STREAM_RING, R.drawable.car_ic_navigation, 0, true, false); - addVolumeRow(AudioManager.STREAM_ALARM, R.drawable.ic_volume_alarm, 0, + addVolumeRow(AudioManager.STREAM_NOTIFICATION, R.drawable.car_ic_notification_2, 0, true, false); mPagedListAdapter = new ListItemAdapter(mContext, new ListProvider(mVolumeLineItems), @@ -248,9 +228,13 @@ public class CarVolumeDialogImpl implements VolumeDialog { SeekbarListItem listItem = new SeekbarListItem(mContext, volumeMax, currentVolume, new VolumeSeekBarChangeListener(volumeRow), null); - listItem.setPrimaryActionIcon(volumeRow.primaryActionIcon); + Drawable primaryIcon = mContext.getResources().getDrawable(volumeRow.primaryActionIcon); + listItem.setPrimaryActionIcon(primaryIcon); if (volumeRow.supplementalIcon != 0) { - listItem.setSupplementalIcon(volumeRow.supplementalIcon, true, supplementalIconOnClickListener); + Drawable supplementalIcon = mContext.getResources() + .getDrawable(volumeRow.supplementalIcon); + listItem.setSupplementalIcon(supplementalIcon, true, + supplementalIconOnClickListener); } else { listItem.setSupplementalEmptyIcon(true); } @@ -309,14 +293,14 @@ public class CarVolumeDialogImpl implements VolumeDialog { mHandler.removeMessages(H.DISMISS); mHandler.removeMessages(H.SHOW); if (!mShowing) return; - mDialogView.animate().cancel(); + mListView.animate().cancel(); mShowing = false; - mDialogView.setTranslationY(0); - mDialogView.setAlpha(1); - mDialogView.animate() + mListView.setTranslationY(0); + mListView.setAlpha(1); + mListView.animate() .alpha(0) - .translationY(-mDialogView.getHeight()) + .translationY(-mListView.getHeight()) .setDuration(250) .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator()) .withEndAction(() -> mHandler.postDelayed(() -> { @@ -487,7 +471,7 @@ public class CarVolumeDialogImpl implements VolumeDialog { @Override public void onLayoutDirectionChanged(int layoutDirection) { - mDialogView.setLayoutDirection(layoutDirection); + mListView.setLayoutDirection(layoutDirection); } @Override @@ -642,6 +626,45 @@ public class CarVolumeDialogImpl implements VolumeDialog { } } + private final class ExpandIconListener implements View.OnClickListener { + @Override + public void onClick(final View v) { + mExpanded = !mExpanded; + Animator inAnimator; + if (mExpanded) { + for (VolumeRow row : mRows) { + // Adding the items which are not coming from default stream. + if (!row.defaultStream) { + addSeekbarListItem(row, null); + } + } + inAnimator = AnimatorInflater.loadAnimator( + mContext, R.anim.car_arrow_fade_in_rotate_up); + } else { + // Only keeping the default stream if it is not expended. + Iterator itr = mVolumeLineItems.iterator(); + while (itr.hasNext()) { + SeekbarListItem item = (SeekbarListItem) itr.next(); + VolumeRow row = findRow(item); + if (!row.defaultStream) { + itr.remove(); + } + } + inAnimator = AnimatorInflater.loadAnimator( + mContext, R.anim.car_arrow_fade_in_rotate_down); + } + + Animator outAnimator = AnimatorInflater.loadAnimator( + mContext, R.anim.car_arrow_fade_out); + inAnimator.setStartDelay(100); + AnimatorSet animators = new AnimatorSet(); + animators.playTogether(outAnimator, inAnimator); + animators.setTarget(v); + animators.start(); + mPagedListAdapter.notifyDataSetChanged(); + } + } + private static class VolumeRow { private int stream; private StreamState ss; diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 5c7ce59c1065..d7aedc4e53f1 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -53,7 +53,6 @@ import android.os.Looper; import android.os.Message; import android.os.SystemClock; import android.os.VibrationEffect; -import android.os.Vibrator; import android.provider.Settings; import android.provider.Settings.Global; import android.text.InputFilter; @@ -73,8 +72,8 @@ import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener; import android.view.animation.DecelerateInterpolator; +import android.widget.FrameLayout; import android.widget.ImageButton; -import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; @@ -122,7 +121,7 @@ public class VolumeDialogImpl implements VolumeDialog { private ImageButton mRingerIcon; private View mSettingsView; private ImageButton mSettingsIcon; - private ImageView mZenIcon; + private FrameLayout mZenIcon; private final List<VolumeRow> mRows = new ArrayList<>(); private ConfigurableTexts mConfigurableTexts; private final SparseBooleanArray mDynamic = new SparseBooleanArray(); @@ -132,7 +131,6 @@ public class VolumeDialogImpl implements VolumeDialog { private final Accessibility mAccessibility = new Accessibility(); private final ColorStateList mActiveTint; private final ColorStateList mInactiveTint; - private final Vibrator mVibrator; private boolean mShowing; private boolean mShowA11yStream; @@ -153,7 +151,6 @@ public class VolumeDialogImpl implements VolumeDialog { mActiveTint = ColorStateList.valueOf(Utils.getColorAccent(mContext)); mInactiveTint = loadColorStateList(R.color.volume_slider_inactive); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); - mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); } public void init(int windowType, Callback callback) { @@ -673,7 +670,28 @@ public class VolumeDialogImpl implements VolumeDialog { * @param enable whether to enable volume row views and hide dnd icon */ private void enableVolumeRowViewsH(VolumeRow row, boolean enable) { - row.dndIcon.setVisibility(enable ? GONE : VISIBLE); + boolean showDndIcon = !enable; + row.dndIcon.setVisibility(showDndIcon ? VISIBLE : GONE); + + if (showDndIcon && getNumVisibleRows() == 1) { + row.dndIcon.setLayoutParams(new FrameLayout.LayoutParams( + mContext.getResources().getDimensionPixelSize( + R.dimen.volume_dialog_panel_width), + FrameLayout.LayoutParams.WRAP_CONTENT)); + } else if (row.view.getVisibility() == VISIBLE) { + row.dndIcon.setLayoutParams(new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); + } + } + + private int getNumVisibleRows() { + int count = 0; + for (int i = 0; i < mRows.size(); i++) { + if (mRows.get(i).view.getVisibility() == VISIBLE) { + count++; + } + } + return count; } /** @@ -1241,6 +1259,6 @@ public class VolumeDialogImpl implements VolumeDialog { private ObjectAnimator anim; // slider progress animation for non-touch-related updates private int animTargetProgress; private int lastAudibleLevel = 1; - private ImageView dndIcon; + private FrameLayout dndIcon; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java index 7cfd7a3d1822..8172626a4b5c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java @@ -367,4 +367,44 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.tagForeground(mEntry.notification); Assert.assertEquals(0, mEntry.mActiveAppOps.size()); } + + @Test + public void testRebuildWithRemoteInput_noExistingInputNoSpinner() { + StatusBarNotification newSbn = + mEntryManager.rebuildNotificationWithRemoteInput(mEntry, "A Reply", false); + CharSequence[] messages = newSbn.getNotification().extras + .getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY); + Assert.assertEquals(1, messages.length); + Assert.assertEquals("A Reply", messages[0]); + Assert.assertFalse(newSbn.getNotification().extras + .getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false)); + } + + @Test + public void testRebuildWithRemoteInput_noExistingInputWithSpinner() { + StatusBarNotification newSbn = + mEntryManager.rebuildNotificationWithRemoteInput(mEntry, "A Reply", true); + CharSequence[] messages = newSbn.getNotification().extras + .getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY); + Assert.assertEquals(1, messages.length); + Assert.assertEquals("A Reply", messages[0]); + Assert.assertTrue(newSbn.getNotification().extras + .getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false)); + } + + @Test + public void testRebuildWithRemoteInput_withExistingInput() { + // Setup a notification entry with 1 remote input. + StatusBarNotification newSbn = + mEntryManager.rebuildNotificationWithRemoteInput(mEntry, "A Reply", false); + NotificationData.Entry entry = new NotificationData.Entry(newSbn); + + // Try rebuilding to add another reply. + newSbn = mEntryManager.rebuildNotificationWithRemoteInput(entry, "Reply 2", true); + CharSequence[] messages = newSbn.getNotification().extras + .getCharSequenceArray(Notification.EXTRA_REMOTE_INPUT_HISTORY); + Assert.assertEquals(2, messages.length); + Assert.assertEquals("Reply 2", messages[0]); + Assert.assertEquals("A Reply", messages[1]); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java new file mode 100644 index 000000000000..84dceae0debf --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.statusbar; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Notification; +import android.os.RemoteException; +import android.service.notification.StatusBarNotification; +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import com.android.internal.statusbar.IStatusBarService; +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class SmartReplyControllerTest extends SysuiTestCase { + private static final String TEST_NOTIFICATION_KEY = "akey"; + private static final String TEST_CHOICE_TEXT = "A Reply"; + private static final int TEST_CHOICE_INDEX = 2; + private static final int TEST_CHOICE_COUNT = 4; + + private Notification mNotification; + private NotificationData.Entry mEntry; + + @Mock + private NotificationEntryManager mNotificationEntryManager; + @Mock + private IStatusBarService mIStatusBarService; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mDependency.injectTestDependency(NotificationEntryManager.class, + mNotificationEntryManager); + mDependency.injectTestDependency(IStatusBarService.class, mIStatusBarService); + + mNotification = new Notification.Builder(mContext, "") + .setSmallIcon(R.drawable.ic_person) + .setContentTitle("Title") + .setContentText("Text").build(); + StatusBarNotification sbn = mock(StatusBarNotification.class); + when(sbn.getNotification()).thenReturn(mNotification); + when(sbn.getKey()).thenReturn(TEST_NOTIFICATION_KEY); + mEntry = new NotificationData.Entry(sbn); + } + + @Test + public void testSendSmartReply_updatesRemoteInput() throws RemoteException { + StatusBarNotification sbn = mock(StatusBarNotification.class); + when(sbn.getKey()).thenReturn(TEST_NOTIFICATION_KEY); + when(mNotificationEntryManager.rebuildNotificationWithRemoteInput( + argThat(entry -> entry.notification.getKey().equals(TEST_NOTIFICATION_KEY)), + eq(TEST_CHOICE_TEXT), eq(true))).thenReturn(sbn); + + SmartReplyController controller = new SmartReplyController(); + controller.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT); + + // Sending smart reply should make calls to NotificationEntryManager + // to update the notification with reply and spinner. + verify(mNotificationEntryManager).rebuildNotificationWithRemoteInput( + argThat(entry -> entry.notification.getKey().equals(TEST_NOTIFICATION_KEY)), + eq(TEST_CHOICE_TEXT), eq(true)); + verify(mNotificationEntryManager).updateNotification( + argThat(sbn2 -> sbn2.getKey().equals(TEST_NOTIFICATION_KEY)), isNull()); + } + + @Test + public void testSendSmartReply_logsToStatusBar() throws RemoteException { + StatusBarNotification sbn = mock(StatusBarNotification.class); + when(sbn.getKey()).thenReturn(TEST_NOTIFICATION_KEY); + when(mNotificationEntryManager.rebuildNotificationWithRemoteInput( + argThat(entry -> entry.notification.getKey().equals(TEST_NOTIFICATION_KEY)), + eq(TEST_CHOICE_TEXT), eq(true))).thenReturn(sbn); + + SmartReplyController controller = new SmartReplyController(); + controller.smartReplySent(mEntry, TEST_CHOICE_INDEX, TEST_CHOICE_TEXT); + + // Check we log the result to the status bar service. + verify(mIStatusBarService).onNotificationSmartReplySent(TEST_NOTIFICATION_KEY, + TEST_CHOICE_INDEX); + } + + @Test + public void testShowSmartReply_logsToStatusBar() throws RemoteException { + SmartReplyController controller = new SmartReplyController(); + controller.smartRepliesAdded(mEntry, TEST_CHOICE_COUNT); + + // Check we log the result to the status bar service. + verify(mIStatusBarService).onNotificationSmartRepliesAdded(TEST_NOTIFICATION_KEY, + TEST_CHOICE_COUNT); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java index 07ac11b82e8c..e529e4c44c41 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java @@ -132,7 +132,7 @@ public class StatusBarIconListTest extends SysuiTestCase { */ @Test - public void testSlot_OrderIsPreserved() { + public void testSlot_ViewOrder() { Slot testSlot = new Slot("test_name", null); // no tag bc it defaults to 0 @@ -144,17 +144,18 @@ public class StatusBarIconListTest extends SysuiTestCase { int sb3Tag = 2; when(sbHolder3.getTag()).thenReturn(sb3Tag); + // Add 3 icons in the same slot, and verify that the list we get is equal to what we gave + testSlot.addHolder(sbHolder1); + testSlot.addHolder(sbHolder2); + testSlot.addHolder(sbHolder3); + + // View order is reverse of the order added ArrayList<StatusBarIconHolder> expected = new ArrayList<>(); - expected.add(sbHolder1); - expected.add(sbHolder2); expected.add(sbHolder3); + expected.add(sbHolder2); + expected.add(sbHolder1); - - // Add 3 icons in the same slot, and verify that the list we get is equal to what we gave - for (StatusBarIconHolder holder : expected) { - testSlot.addHolder(holder); - } - assertTrue(listsEqual(expected, testSlot.getHolderList())); + assertTrue(listsEqual(expected, testSlot.getHolderListInViewOrder())); } private boolean listsEqual(List<StatusBarIconHolder> list1, List<StatusBarIconHolder> list2) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java index 550a35dc9ffc..532019fe09c6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java @@ -22,6 +22,7 @@ import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.doze.DozeScreenState; import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher; import org.junit.Assert; @@ -218,6 +219,15 @@ public class DozeParametersTest extends SysuiTestCase { verify(dozeParameters.getPowerManager()).setDozeAfterScreenOff(eq(false)); } + @Test + public void test_getWallpaperAodDuration_when_shouldControlScreenOff() { + TestableDozeParameters dozeParameters = new TestableDozeParameters(getContext()); + dozeParameters.setControlScreenOffAnimation(true); + Assert.assertEquals("wallpaper hides faster when controlling screen off", + dozeParameters.getWallpaperAodDuration(), + DozeScreenState.ENTER_DOZE_HIDE_WALLPAPER_DELAY); + } + private class TestableDozeParameters extends DozeParameters { private PowerManager mPowerManager; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java index 54153a75f1b1..d2463502cb19 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -162,4 +163,38 @@ public class BluetoothControllerImplTest extends SysuiTestCase { mainLooper.destroy(); } } + + @Test + public void testOnServiceConnected_updatesConnectionState() { + when(mMockAdapter.getConnectionState()).thenReturn(BluetoothAdapter.STATE_CONNECTING); + + mBluetoothControllerImpl.onServiceConnected(); + + assertTrue(mBluetoothControllerImpl.isBluetoothConnecting()); + assertFalse(mBluetoothControllerImpl.isBluetoothConnected()); + } + + @Test + public void testOnBluetoothStateChange_updatesBluetoothState() { + mBluetoothControllerImpl.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF); + + assertEquals(BluetoothAdapter.STATE_OFF, mBluetoothControllerImpl.getBluetoothState()); + + mBluetoothControllerImpl.onBluetoothStateChanged(BluetoothAdapter.STATE_ON); + + assertEquals(BluetoothAdapter.STATE_ON, mBluetoothControllerImpl.getBluetoothState()); + } + + @Test + public void testOnBluetoothStateChange_updatesConnectionState() { + when(mMockAdapter.getConnectionState()).thenReturn( + BluetoothAdapter.STATE_CONNECTING, + BluetoothAdapter.STATE_DISCONNECTED); + + mBluetoothControllerImpl.onServiceConnected(); + mBluetoothControllerImpl.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF); + + assertFalse(mBluetoothControllerImpl.isBluetoothConnecting()); + assertFalse(mBluetoothControllerImpl.isBluetoothConnected()); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java index 2bb810665f3a..99c06e62d4bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java @@ -23,9 +23,10 @@ import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.app.Notification; import android.app.PendingIntent; import android.app.RemoteInput; import android.content.Intent; @@ -44,7 +45,7 @@ import com.android.keyguard.KeyguardHostView.OnDismissAction; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationData; -import com.android.systemui.statusbar.SmartReplyLogger; +import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import java.util.concurrent.atomic.AtomicReference; @@ -64,19 +65,22 @@ public class SmartReplyViewTest extends SysuiTestCase { private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION"; private static final String[] TEST_CHOICES = new String[]{"Hello", "What's up?", "I'm here"}; + private static final String TEST_NOTIFICATION_KEY = "akey"; private static final int WIDTH_SPEC = MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY); private static final int HEIGHT_SPEC = MeasureSpec.makeMeasureSpec(400, MeasureSpec.AT_MOST); private BlockingQueueIntentReceiver mReceiver; private SmartReplyView mView; + private View mContainer; private int mSingleLinePaddingHorizontal; private int mDoubleLinePaddingHorizontal; private int mSpacing; - @Mock private SmartReplyLogger mLogger; + @Mock private SmartReplyController mLogger; private NotificationData.Entry mEntry; + private Notification mNotification; @Before public void setUp() { @@ -86,6 +90,7 @@ public class SmartReplyViewTest extends SysuiTestCase { mDependency.get(KeyguardDismissUtil.class).setDismissHandler( (action, cancelAction, afterKeyguardGone) -> action.onDismiss()); + mContainer = new View(mContext, null); mView = SmartReplyView.inflate(mContext, null); @@ -96,9 +101,14 @@ public class SmartReplyViewTest extends SysuiTestCase { R.dimen.smart_reply_button_padding_horizontal_double_line); mSpacing = res.getDimensionPixelSize(R.dimen.smart_reply_button_spacing); - StatusBarNotification notification = mock(StatusBarNotification.class); - when(notification.getKey()).thenReturn("akey"); - mEntry = new NotificationData.Entry(notification); + mNotification = new Notification.Builder(mContext, "") + .setSmallIcon(R.drawable.ic_person) + .setContentTitle("Title") + .setContentText("Text").build(); + StatusBarNotification sbn = mock(StatusBarNotification.class); + when(sbn.getNotification()).thenReturn(mNotification); + when(sbn.getKey()).thenReturn(TEST_NOTIFICATION_KEY); + mEntry = new NotificationData.Entry(sbn); } @After @@ -155,10 +165,18 @@ public class SmartReplyViewTest extends SysuiTestCase { } @Test - public void testSendSmartReply_LoggerCall() { + public void testSendSmartReply_controllerCalled() { setRepliesFromRemoteInput(TEST_CHOICES); mView.getChildAt(2).performClick(); - verify(mLogger).smartReplySent(mEntry, 2); + verify(mLogger).smartReplySent(mEntry, 2, TEST_CHOICES[2]); + } + + @Test + public void testSendSmartReply_hidesContainer() { + mContainer.setVisibility(View.VISIBLE); + setRepliesFromRemoteInput(TEST_CHOICES); + mView.getChildAt(0).performClick(); + assertEquals(View.GONE, mContainer.getVisibility()); } @Test @@ -340,7 +358,7 @@ public class SmartReplyViewTest extends SysuiTestCase { PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0); RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).setChoices(choices).build(); - mView.setRepliesFromRemoteInput(input, pendingIntent, mLogger, mEntry); + mView.setRepliesFromRemoteInput(input, pendingIntent, mLogger, mEntry, mContainer); } /** Builds a {@link ViewGroup} whose measures and layout mirror a {@link SmartReplyView}. */ diff --git a/proto/src/task_snapshot.proto b/proto/src/task_snapshot.proto index 490a59e770ec..27febefc39dc 100644 --- a/proto/src/task_snapshot.proto +++ b/proto/src/task_snapshot.proto @@ -28,4 +28,5 @@ int32 inset_right = 4; int32 inset_bottom = 5; bool is_real_snapshot = 6; + int32 windowing_mode = 7; }
\ No newline at end of file diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 08aa0632206c..7798cf7af3cb 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2232,7 +2232,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } if (service != null) { mFingerprintGestureDispatcher = new FingerprintGestureDispatcher( - service, mLock); + service, mContext.getResources(), mLock); break; } } diff --git a/services/accessibility/java/com/android/server/accessibility/FingerprintGestureDispatcher.java b/services/accessibility/java/com/android/server/accessibility/FingerprintGestureDispatcher.java index fe787b36472d..96418aac7ffa 100644 --- a/services/accessibility/java/com/android/server/accessibility/FingerprintGestureDispatcher.java +++ b/services/accessibility/java/com/android/server/accessibility/FingerprintGestureDispatcher.java @@ -17,6 +17,7 @@ package com.android.server.accessibility; import android.accessibilityservice.FingerprintGestureController; +import android.content.res.Resources; import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintService; import android.os.Binder; @@ -42,6 +43,7 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba private final Object mLock; private final IFingerprintService mFingerprintService; private final Handler mHandler; + private final boolean mHardwareSupportsGestures; // This field is ground truth for whether or not we are registered. Only write to it in handler. private boolean mRegisteredReadOnlyExceptInHandler; @@ -50,8 +52,11 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba * @param fingerprintService The system's fingerprint service * @param lock A lock to use when managing internal state */ - public FingerprintGestureDispatcher(IFingerprintService fingerprintService, Object lock) { + public FingerprintGestureDispatcher(IFingerprintService fingerprintService, + Resources resources, Object lock) { mFingerprintService = fingerprintService; + mHardwareSupportsGestures = resources.getBoolean( + com.android.internal.R.bool.config_fingerprintSupportsGestures); mLock = lock; mHandler = new Handler(this); } @@ -61,9 +66,11 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba * @param lock A lock to use when managing internal state * @param handler A handler to use internally. Used for testing. */ - public FingerprintGestureDispatcher(IFingerprintService fingerprintService, Object lock, - Handler handler) { + public FingerprintGestureDispatcher(IFingerprintService fingerprintService, + Resources resources, Object lock, Handler handler) { mFingerprintService = fingerprintService; + mHardwareSupportsGestures = resources.getBoolean( + com.android.internal.R.bool.config_fingerprintSupportsGestures); mLock = lock; mHandler = handler; } @@ -74,6 +81,8 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba * @param clientList The list of potential clients. */ public void updateClientList(List<? extends FingerprintGestureClient> clientList) { + if (!mHardwareSupportsGestures) return; + synchronized (mLock) { mCapturingClients.clear(); for (int i = 0; i < clientList.size(); i++) { @@ -96,6 +105,8 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba @Override public void onClientActiveChanged(boolean nonGestureFingerprintClientActive) { + if (!mHardwareSupportsGestures) return; + synchronized (mLock) { for (int i = 0; i < mCapturingClients.size(); i++) { mCapturingClients.get(i).onFingerprintGestureDetectionActiveChanged( @@ -105,6 +116,8 @@ public class FingerprintGestureDispatcher extends IFingerprintClientActiveCallba } public boolean isFingerprintGestureDetectionAvailable() { + if (!mHardwareSupportsGestures) return false; + long identity = Binder.clearCallingIdentity(); try { return !mFingerprintService.isClientActive(); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index e6b2a3522fd1..c05506066e6a 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -2079,7 +2079,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } getUiForShowing().showFillUi(filledId, response, filterText, - mService.getServicePackageName(), mComponentName.getPackageName(), this); + mService.getServicePackageName(), mComponentName.getPackageName(), + mService.getServiceLabel(), mService.getServiceIcon(), this); synchronized (mLock) { if (mUiShownTime == 0) { diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java index 21a39e483986..ee18dc2e5824 100644 --- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java +++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java @@ -163,11 +163,14 @@ public final class AutoFillUI { * @param filterText text of the view to be filled * @param servicePackageName package name of the autofill service filling the activity * @param packageName package name of the activity that is filled + * @param serviceLabel label of autofill service + * @param serviceIcon icon of autofill service * @param callback Identifier for the caller */ public void showFillUi(@NonNull AutofillId focusedId, @NonNull FillResponse response, @Nullable String filterText, @Nullable String servicePackageName, - @NonNull String packageName, @NonNull AutoFillUiCallback callback) { + @NonNull String packageName, @NonNull CharSequence serviceLabel, + @NonNull Drawable serviceIcon, @NonNull AutoFillUiCallback callback) { if (sDebug) { final int size = filterText == null ? 0 : filterText.length(); Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + size + " chars"); @@ -185,7 +188,7 @@ public final class AutoFillUI { } hideAllUiThread(callback); mFillUi = new FillUi(mContext, response, focusedId, - filterText, mOverlayControl, new FillUi.Callback() { + filterText, mOverlayControl, serviceLabel, serviceIcon, new FillUi.Callback() { @Override public void onResponsePicked(FillResponse response) { log.setType(MetricsEvent.TYPE_DETAIL); diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index d29ca051ad94..1aeb3b914813 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -26,6 +26,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.ContextThemeWrapper; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager; @@ -53,9 +55,11 @@ import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RemoteViews; +import android.widget.TextView; import com.android.internal.R; import com.android.server.UiThread; @@ -72,29 +76,9 @@ import java.util.stream.Collectors; final class FillUi { private static final String TAG = "FillUi"; - private static final TypedValue sTempTypedValue = new TypedValue(); - - public static final class AutofillFrameLayout extends FrameLayout { - - OnKeyListener mUnhandledListener; + private static final int THEME_ID = com.android.internal.R.style.Theme_DeviceDefault_Autofill; - public AutofillFrameLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public AutofillFrameLayout(Context context, AttributeSet attrs, @AttrRes int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - boolean handled = super.dispatchKeyEvent(event); - if (!handled) { - handled = mUnhandledListener.onKey(this, event.getKeyCode(), event); - } - return handled; - } - } + private static final TypedValue sTempTypedValue = new TypedValue(); interface Callback { void onResponsePicked(@NonNull FillResponse response); @@ -146,51 +130,64 @@ final class FillUi { FillUi(@NonNull Context context, @NonNull FillResponse response, @NonNull AutofillId focusedViewId, @NonNull @Nullable String filterText, - @NonNull OverlayControl overlayControl, @NonNull Callback callback) { - mContext = context; + @NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel, + @NonNull Drawable serviceIcon, @NonNull Callback callback) { mCallback = callback; mFullScreen = isFullScreen(context); - - final LayoutInflater inflater = LayoutInflater.from(context); + mContext = new ContextThemeWrapper(context, THEME_ID); + final LayoutInflater inflater = LayoutInflater.from(mContext); final RemoteViews headerPresentation = response.getHeader(); final RemoteViews footerPresentation = response.getFooter(); final ViewGroup decor; - if (headerPresentation != null || footerPresentation != null) { - decor = (ViewGroup) inflater.inflate( - mFullScreen ? R.layout.autofill_dataset_picker_header_footer_fullscreen - : R.layout.autofill_dataset_picker_header_footer, null); + if (mFullScreen) { + decor = (ViewGroup) inflater.inflate(R.layout.autofill_dataset_picker_fullscreen, null); + } else if (headerPresentation != null || footerPresentation != null) { + decor = (ViewGroup) inflater.inflate(R.layout.autofill_dataset_picker_header_footer, + null); } else { - decor = (ViewGroup) inflater.inflate( - mFullScreen ? R.layout.autofill_dataset_picker_fullscreen - : R.layout.autofill_dataset_picker, null); - } - - // if autofill ui is not fullscreen, send unhandled keyevent to app window. - if (!mFullScreen) { - if (decor instanceof AutofillFrameLayout) { - ((AutofillFrameLayout) decor).mUnhandledListener = - (View view, int keyCode, KeyEvent event) -> { - switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - case KeyEvent.KEYCODE_ESCAPE: - case KeyEvent.KEYCODE_ENTER: - case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_RIGHT: - case KeyEvent.KEYCODE_DPAD_DOWN: - return false; - default: - mCallback.dispatchUnhandledKey(event); - return true; - } - }; - } else { - Slog.wtf(TAG, "Unable to send unhandled key"); - } + decor = (ViewGroup) inflater.inflate(R.layout.autofill_dataset_picker, null); + } + final TextView titleView = decor.findViewById(R.id.autofill_dataset_title); + if (titleView != null) { + titleView.setText(mContext.getString(R.string.autofill_window_title, serviceLabel)); + } + final ImageView iconView = decor.findViewById(R.id.autofill_dataset_icon); + if (iconView != null) { + iconView.setImageDrawable(serviceIcon); } + // In full screen we only initialize size once assuming screen size never changes + if (mFullScreen) { + final Point outPoint = mTempPoint; + mContext.getDisplay().getSize(outPoint); + // full with of screen and half height of screen + mContentWidth = LayoutParams.MATCH_PARENT; + mContentHeight = outPoint.y / 2; + if (sVerbose) { + Slog.v(TAG, "initialized fillscreen LayoutParams " + + mContentWidth + "," + mContentHeight); + } + } + + // Send unhandled keyevent to app window. + decor.addOnUnhandledKeyEventListener((View view, KeyEvent event) -> { + switch (event.getKeyCode() ) { + case KeyEvent.KEYCODE_BACK: + case KeyEvent.KEYCODE_ESCAPE: + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_RIGHT: + case KeyEvent.KEYCODE_DPAD_DOWN: + return false; + default: + mCallback.dispatchUnhandledKey(event); + return true; + } + }); + if (sVisibleDatasetsMaxCount > 0) { mVisibleDatasetsMaxCount = sVisibleDatasetsMaxCount; if (sVerbose) { @@ -218,14 +215,12 @@ final class FillUi { mFooter = null; mAdapter = null; - // insert authentication item under autofill_dataset_container or decor - ViewGroup container = decor.findViewById(R.id.autofill_dataset_container); - if (container == null) { - container = decor; - } + // insert authentication item under autofill_dataset_picker + ViewGroup container = decor.findViewById(R.id.autofill_dataset_picker); final View content; try { - content = response.getPresentation().apply(context, decor, interceptionHandler); + response.getPresentation().setApplyTheme(THEME_ID); + content = response.getPresentation().apply(mContext, decor, interceptionHandler); container.addView(content); } catch (RuntimeException e) { callback.onCanceled(); @@ -236,20 +231,22 @@ final class FillUi { decor.setFocusable(true); decor.setOnClickListener(v -> mCallback.onResponsePicked(response)); - final Point maxSize = mTempPoint; - resolveMaxWindowSize(context, maxSize); - // fullScreen mode occupy the full width defined by autofill_dataset_picker_max_width - content.getLayoutParams().width = mFullScreen ? maxSize.x - : ViewGroup.LayoutParams.WRAP_CONTENT; - content.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; - final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.x, - MeasureSpec.AT_MOST); - final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.y, - MeasureSpec.AT_MOST); - - decor.measure(widthMeasureSpec, heightMeasureSpec); - mContentWidth = content.getMeasuredWidth(); - mContentHeight = content.getMeasuredHeight(); + if (!mFullScreen) { + final Point maxSize = mTempPoint; + resolveMaxWindowSize(mContext, maxSize); + // fullScreen mode occupy the full width defined by autofill_dataset_picker_max_width + content.getLayoutParams().width = mFullScreen ? maxSize.x + : ViewGroup.LayoutParams.WRAP_CONTENT; + content.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.x, + MeasureSpec.AT_MOST); + final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.y, + MeasureSpec.AT_MOST); + + decor.measure(widthMeasureSpec, heightMeasureSpec); + mContentWidth = content.getMeasuredWidth(); + mContentHeight = content.getMeasuredHeight(); + } mWindow = new AnchoredWindow(decor, overlayControl); requestShowFillUi(); @@ -263,7 +260,8 @@ final class FillUi { RemoteViews.OnClickHandler clickBlocker = null; if (headerPresentation != null) { clickBlocker = newClickBlocker(); - mHeader = headerPresentation.apply(context, null, clickBlocker); + headerPresentation.setApplyTheme(THEME_ID); + mHeader = headerPresentation.apply(mContext, null, clickBlocker); final LinearLayout headerContainer = decor.findViewById(R.id.autofill_dataset_header); if (sVerbose) Slog.v(TAG, "adding header"); @@ -274,15 +272,21 @@ final class FillUi { } if (footerPresentation != null) { - if (clickBlocker == null) { // already set for header - clickBlocker = newClickBlocker(); - } - mFooter = footerPresentation.apply(context, null, clickBlocker); final LinearLayout footerContainer = decor.findViewById(R.id.autofill_dataset_footer); - if (sVerbose) Slog.v(TAG, "adding footer"); - footerContainer.addView(mFooter); - footerContainer.setVisibility(View.VISIBLE); + if (footerContainer != null) { + if (clickBlocker == null) { // already set for header + clickBlocker = newClickBlocker(); + } + footerPresentation.setApplyTheme(THEME_ID); + mFooter = footerPresentation.apply(mContext, null, clickBlocker); + // Footer not supported on some platform e.g. TV + if (sVerbose) Slog.v(TAG, "adding footer"); + footerContainer.addView(mFooter); + footerContainer.setVisibility(View.VISIBLE); + } else { + mFooter = null; + } } else { mFooter = null; } @@ -301,7 +305,8 @@ final class FillUi { final View view; try { if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId); - view = presentation.apply(context, null, interceptionHandler); + presentation.setApplyTheme(THEME_ID); + view = presentation.apply(mContext, null, interceptionHandler); } catch (RuntimeException e) { Slog.e(TAG, "Error inflating remote views", e); continue; @@ -352,12 +357,7 @@ final class FillUi { } void requestShowFillUi() { - if (mFullScreen) { - mCallback.requestShowFillUi(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, - mWindowPresenter); - } else { - mCallback.requestShowFillUi(mContentWidth, mContentHeight, mWindowPresenter); - } + mCallback.requestShowFillUi(mContentWidth, mContentHeight, mWindowPresenter); } /** @@ -388,12 +388,6 @@ final class FillUi { mCallback.requestHideFillUi(); } else { if (updateContentSize()) { - if (mFullScreen) { - LayoutParams lp = mListView.getLayoutParams(); - lp.width = mContentWidth; - lp.height = mContentHeight; - mListView.setLayoutParams(lp); - } requestShowFillUi(); } if (mAdapter.getCount() > mVisibleDatasetsMaxCount) { @@ -452,6 +446,10 @@ final class FillUi { if (mAdapter == null) { return false; } + if (mFullScreen) { + // always request show fill window with fixed size for fullscreen + return true; + } boolean changed = false; if (mAdapter.getCount() <= 0) { if (mContentWidth != 0) { @@ -476,11 +474,6 @@ final class FillUi { final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxSize.y, MeasureSpec.AT_MOST); final int itemCount = mAdapter.getCount(); - if (mFullScreen) { - // fullScreen mode occupy the full width defined by autofill_dataset_picker_max_width - changed = true; - mContentWidth = maxSize.x; - } if (mHeader != null) { mHeader.measure(widthMeasureSpec, heightMeasureSpec); @@ -491,20 +484,9 @@ final class FillUi { for (int i = 0; i < itemCount; i++) { final View view = mAdapter.getItem(i).view; view.measure(widthMeasureSpec, heightMeasureSpec); - if (mFullScreen) { - // for fullscreen, add up all children height until hit max height. - final int newContentHeight = mContentHeight + view.getMeasuredHeight(); - final int clampedNewHeight = Math.min(newContentHeight, maxSize.y); - if (clampedNewHeight != mContentHeight) { - mContentHeight = clampedNewHeight; - } else if (view.getMeasuredHeight() > 0) { - break; - } - } else { - changed |= updateWidth(view, maxSize); - if (i < mVisibleDatasetsMaxCount) { - changed |= updateHeight(view, maxSize); - } + changed |= updateWidth(view, maxSize); + if (i < mVisibleDatasetsMaxCount) { + changed |= updateHeight(view, maxSize); } } diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java index f96fa7c237f7..80903c1a1fe4 100644 --- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java @@ -42,6 +42,7 @@ import android.text.Html; import android.util.ArraySet; import android.util.Pair; import android.util.Slog; +import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -70,6 +71,9 @@ final class SaveUi { private static final String TAG = "AutofillSaveUi"; + private static final int THEME_ID = + com.android.internal.R.style.Theme_DeviceDefault_Autofill_Save; + public interface OnSaveListener { void onSave(); void onCancel(IntentSender listener); @@ -144,6 +148,7 @@ final class SaveUi { mServicePackageName = servicePackageName; mPackageName = packageName; + context = new ContextThemeWrapper(context, THEME_ID); final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.autofill_save, null); @@ -222,7 +227,7 @@ final class SaveUi { final View yesButton = view.findViewById(R.id.autofill_save_yes); yesButton.setOnClickListener((v) -> mListener.onSave()); - mDialog = new Dialog(context, R.style.Theme_DeviceDefault_Light_Panel); + mDialog = new Dialog(context, THEME_ID); mDialog.setContentView(view); // Dialog can be dismissed when touched outside, but the negative listener should not be @@ -309,6 +314,7 @@ final class SaveUi { try { // Create the remote view peer. + template.setApplyTheme(THEME_ID); final View customSubtitleView = template.apply(context, null, handler); // And apply batch updates (if any). diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index b8601910497a..d818bd6580f7 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -39,6 +39,7 @@ import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; +import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManagerInternal; @@ -77,14 +78,24 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import static android.app.AppOpsManager.UID_STATE_BACKGROUND; +import static android.app.AppOpsManager.UID_STATE_CACHED; +import static android.app.AppOpsManager.UID_STATE_FOREGROUND; +import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE; +import static android.app.AppOpsManager._NUM_UID_STATE; +import static android.app.AppOpsManager.UID_STATE_PERSISTENT; +import static android.app.AppOpsManager.UID_STATE_TOP; + public class AppOpsService extends IAppOpsService.Stub { static final String TAG = "AppOps"; static final boolean DEBUG = false; @@ -100,6 +111,64 @@ public class AppOpsService extends IAppOpsService.Stub { // Constant meaning that any UID should be matched when dispatching callbacks private static final int UID_ANY = -2; + // Map from process states to the uid states we track. + private static final int[] PROCESS_STATE_TO_UID_STATE = new int[] { + UID_STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT + UID_STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI + UID_STATE_TOP, // ActivityManager.PROCESS_STATE_TOP + UID_STATE_FOREGROUND_SERVICE, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE + UID_STATE_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE + UID_STATE_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND + UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND + UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND + UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_BACKUP + UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_SERVICE + UID_STATE_BACKGROUND, // ActivityManager.PROCESS_STATE_RECEIVER + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_TOP_SLEEPING + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_HOME + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_CACHED_RECENT + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_CACHED_EMPTY + UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_NONEXISTENT + }; + + static final String[] UID_STATE_NAMES = new String[] { + "pers ", // UID_STATE_PERSISTENT + "top ", // UID_STATE_TOP + "fgsvc", // UID_STATE_FOREGROUND_SERVICE + "fg ", // UID_STATE_FOREGROUND + "bg ", // UID_STATE_BACKGROUND + "cch ", // UID_STATE_CACHED + }; + + static final String[] UID_STATE_TIME_ATTRS = new String[] { + "tp", // UID_STATE_PERSISTENT + "tt", // UID_STATE_TOP + "tfs", // UID_STATE_FOREGROUND_SERVICE + "tf", // UID_STATE_FOREGROUND + "tb", // UID_STATE_BACKGROUND + "tc", // UID_STATE_CACHED + }; + + static final String[] UID_STATE_REJECT_ATTRS = new String[] { + "rp", // UID_STATE_PERSISTENT + "rt", // UID_STATE_TOP + "rfs", // UID_STATE_FOREGROUND_SERVICE + "rf", // UID_STATE_FOREGROUND + "rb", // UID_STATE_BACKGROUND + "rc", // UID_STATE_CACHED + }; + + static final String[] MODE_NAMES = new String[] { + "allow", // MODE_ALLOWED + "ignore", // MODE_IGNORED + "deny", // MODE_ERRORED + "default", // MODE_DEFAULT + }; + Context mContext; final AtomicFile mFile; final Handler mHandler; @@ -133,6 +202,8 @@ public class AppOpsService extends IAppOpsService.Stub { @VisibleForTesting static final class UidState { public final int uid; + public int state = UID_STATE_CACHED; + public int startNesting; public ArrayMap<String, Ops> pkgOps; public SparseIntArray opModes; @@ -151,36 +222,51 @@ public class AppOpsService extends IAppOpsService.Stub { } } - public final static class Ops extends SparseArray<Op> { - public final String packageName; - public final UidState uidState; - public final boolean isPrivileged; + final static class Ops extends SparseArray<Op> { + final String packageName; + final UidState uidState; + final boolean isPrivileged; - public Ops(String _packageName, UidState _uidState, boolean _isPrivileged) { + Ops(String _packageName, UidState _uidState, boolean _isPrivileged) { packageName = _packageName; uidState = _uidState; isPrivileged = _isPrivileged; } } - public final static class Op { - public final int uid; - public final String packageName; - public int proxyUid = -1; - public String proxyPackageName; - public final int op; - public int mode; - public int duration; - public long time; - public long rejectTime; - public int nesting; - - public Op(int _uid, String _packageName, int _op) { - uid = _uid; + final static class Op { + final UidState uidState; + final int uid; + final String packageName; + final int op; + int proxyUid = -1; + String proxyPackageName; + int mode; + int duration; + long time[] = new long[_NUM_UID_STATE]; + long rejectTime[] = new long[_NUM_UID_STATE]; + int startNesting; + long startRealtime; + + Op(UidState _uidState, String _packageName, int _op) { + uidState = _uidState; + uid = _uidState.uid; packageName = _packageName; op = _op; mode = AppOpsManager.opToDefaultMode(op); } + + boolean hasAnyTime() { + for (int i = 0; i < AppOpsManager._NUM_UID_STATE; i++) { + if (time[i] != 0) { + return true; + } + if (rejectTime[i] != 0) { + return true; + } + } + return false; + } } final SparseArray<ArraySet<ModeCallback>> mOpModeWatchers = new SparseArray<>(); @@ -189,13 +275,13 @@ public class AppOpsService extends IAppOpsService.Stub { final ArrayMap<IBinder, SparseArray<ActiveCallback>> mActiveWatchers = new ArrayMap<>(); final SparseArray<SparseArray<Restriction>> mAudioRestrictions = new SparseArray<>(); - public final class ModeCallback implements DeathRecipient { + final class ModeCallback implements DeathRecipient { final IAppOpsCallback mCallback; final int mWatchingUid; final int mCallingUid; final int mCallingPid; - public ModeCallback(IAppOpsCallback callback, int watchingUid, int callingUid, + ModeCallback(IAppOpsCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mWatchingUid = watchingUid; @@ -222,7 +308,7 @@ public class AppOpsService extends IAppOpsService.Stub { return sb.toString(); } - public void unlinkToDeath() { + void unlinkToDeath() { mCallback.asBinder().unlinkToDeath(this, 0); } @@ -232,13 +318,13 @@ public class AppOpsService extends IAppOpsService.Stub { } } - public final class ActiveCallback implements DeathRecipient { + final class ActiveCallback implements DeathRecipient { final IAppOpsActiveCallback mCallback; final int mWatchingUid; final int mCallingUid; final int mCallingPid; - public ActiveCallback(IAppOpsActiveCallback callback, int watchingUid, int callingUid, + ActiveCallback(IAppOpsActiveCallback callback, int watchingUid, int callingUid, int callingPid) { mCallback = callback; mWatchingUid = watchingUid; @@ -265,7 +351,7 @@ public class AppOpsService extends IAppOpsService.Stub { return sb.toString(); } - public void destroy() { + void destroy() { mCallback.asBinder().unlinkToDeath(this, 0); } @@ -277,12 +363,12 @@ public class AppOpsService extends IAppOpsService.Stub { final ArrayMap<IBinder, ClientState> mClients = new ArrayMap<>(); - public final class ClientState extends Binder implements DeathRecipient { + final class ClientState extends Binder implements DeathRecipient { final ArrayList<Op> mStartedOps = new ArrayList<>(); final IBinder mAppToken; final int mPid; - public ClientState(IBinder appToken) { + ClientState(IBinder appToken) { mAppToken = appToken; mPid = Binder.getCallingPid(); // Watch only for remote processes dying @@ -453,7 +539,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (uid == op.uid && packageName.equals(op.packageName)) { finishOperationLocked(op, /*finishNested*/ true); client.mStartedOps.remove(j); - if (op.nesting <= 0) { + if (op.startNesting <= 0) { scheduleOpActiveChangedIfNeededLocked(op.op, uid, packageName, false); } @@ -485,6 +571,31 @@ public class AppOpsService extends IAppOpsService.Stub { } } + public void updateUidProcState(int uid, int procState) { + synchronized (this) { + final UidState uidState = getUidStateLocked(uid, true); + final int newState = PROCESS_STATE_TO_UID_STATE[procState]; + if (uidState != null && uidState.state != newState) { + if (uidState.startNesting != 0) { + // There is some actively running operation... need to find it + // and appropriately update its state. + final long now = System.currentTimeMillis(); + for (int i = uidState.pkgOps.size() - 1; i >= 0; i--) { + final Ops ops = uidState.pkgOps.valueAt(i); + for (int j = ops.size() - 1; j >= 0; j--) { + final Op op = ops.valueAt(j); + if (op.startNesting > 0) { + op.time[uidState.state] = now; + op.time[newState] = now; + } + } + } + } + uidState.state = newState; + } + } + } + public void shutdown() { Slog.w(TAG, "Writing app ops before shutdown..."); boolean doWrite = false; @@ -501,12 +612,16 @@ public class AppOpsService extends IAppOpsService.Stub { private ArrayList<AppOpsManager.OpEntry> collectOps(Ops pkgOps, int[] ops) { ArrayList<AppOpsManager.OpEntry> resOps = null; + final long elapsedNow = SystemClock.elapsedRealtime(); if (ops == null) { - resOps = new ArrayList<AppOpsManager.OpEntry>(); + resOps = new ArrayList<>(); for (int j=0; j<pkgOps.size(); j++) { Op curOp = pkgOps.valueAt(j); + long duration = curOp.duration == -1 + ? (elapsedNow - curOp.startRealtime) + : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, - curOp.rejectTime, curOp.duration, curOp.proxyUid, + curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.proxyPackageName)); } } else { @@ -514,10 +629,13 @@ public class AppOpsService extends IAppOpsService.Stub { Op curOp = pkgOps.get(ops[j]); if (curOp != null) { if (resOps == null) { - resOps = new ArrayList<AppOpsManager.OpEntry>(); + resOps = new ArrayList<>(); } + long duration = curOp.duration == -1 + ? (elapsedNow - curOp.startRealtime) + : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, - curOp.rejectTime, curOp.duration, curOp.proxyUid, + curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.proxyPackageName)); } } @@ -628,7 +746,7 @@ public class AppOpsService extends IAppOpsService.Stub { } private void pruneOp(Op op, int uid, String packageName) { - if (op.time == 0 && op.rejectTime == 0) { + if (!op.hasAnyTime()) { Ops ops = getOpsRawLocked(uid, packageName, false /* edit */, false /* uidMismatchExpected */); if (ops != null) { @@ -946,7 +1064,7 @@ public class AppOpsService extends IAppOpsService.Stub { mOpModeWatchers.get(curOp.op)); callbacks = addCallbacks(callbacks, curOp.op, curOp.uid, packageName, mPackageModeWatchers.get(packageName)); - if (curOp.time == 0 && curOp.rejectTime == 0) { + if (!curOp.hasAnyTime()) { pkgOps.removeAt(j); } } @@ -1212,24 +1330,25 @@ public class AppOpsService extends IAppOpsService.Stub { private int noteOperationUnchecked(int code, int uid, String packageName, int proxyUid, String proxyPackageName) { synchronized (this) { - Ops ops = getOpsRawLocked(uid, packageName, true /* edit */, + final Ops ops = getOpsRawLocked(uid, packageName, true /* edit */, false /* uidMismatchExpected */); if (ops == null) { if (DEBUG) Slog.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + " package " + packageName); return AppOpsManager.MODE_ERRORED; } - Op op = getOpLocked(ops, code, true); + final Op op = getOpLocked(ops, code, true); if (isOpRestrictedLocked(uid, code, packageName)) { return AppOpsManager.MODE_IGNORED; } + final UidState uidState = ops.uidState; if (op.duration == -1) { Slog.w(TAG, "Noting op not finished: uid " + uid + " pkg " + packageName - + " code " + code + " time=" + op.time + " duration=" + op.duration); + + " code " + code + " time=" + op.time[uidState.state] + + " duration=" + op.duration); } op.duration = 0; final int switchCode = AppOpsManager.opToSwitch(code); - UidState uidState = ops.uidState; // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { @@ -1238,7 +1357,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + packageName); - op.rejectTime = System.currentTimeMillis(); + op.rejectTime[uidState.state] = System.currentTimeMillis(); return uidMode; } } else { @@ -1247,14 +1366,14 @@ public class AppOpsService extends IAppOpsService.Stub { if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + packageName); - op.rejectTime = System.currentTimeMillis(); + op.rejectTime[uidState.state] = System.currentTimeMillis(); return switchOp.mode; } } if (DEBUG) Slog.d(TAG, "noteOperation: allowing code " + code + " uid " + uid + " package " + packageName); - op.time = System.currentTimeMillis(); - op.rejectTime = 0; + op.time[uidState.state] = System.currentTimeMillis(); + op.rejectTime[uidState.state] = 0; op.proxyUid = proxyUid; op.proxyPackageName = proxyPackageName; return AppOpsManager.MODE_ALLOWED; @@ -1323,19 +1442,19 @@ public class AppOpsService extends IAppOpsService.Stub { } ClientState client = (ClientState)token; synchronized (this) { - Ops ops = getOpsRawLocked(uid, resolvedPackageName, true /* edit */, + final Ops ops = getOpsRawLocked(uid, resolvedPackageName, true /* edit */, false /* uidMismatchExpected */); if (ops == null) { if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + resolvedPackageName); return AppOpsManager.MODE_ERRORED; } - Op op = getOpLocked(ops, code, true); + final Op op = getOpLocked(ops, code, true); if (isOpRestrictedLocked(uid, code, resolvedPackageName)) { return AppOpsManager.MODE_IGNORED; } final int switchCode = AppOpsManager.opToSwitch(code); - UidState uidState = ops.uidState; + final UidState uidState = ops.uidState; // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { @@ -1345,7 +1464,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + resolvedPackageName); - op.rejectTime = System.currentTimeMillis(); + op.rejectTime[uidState.state] = System.currentTimeMillis(); return uidMode; } } else { @@ -1355,19 +1474,21 @@ public class AppOpsService extends IAppOpsService.Stub { if (DEBUG) Slog.d(TAG, "startOperation: reject #" + op.mode + " for code " + switchCode + " (" + code + ") uid " + uid + " package " + resolvedPackageName); - op.rejectTime = System.currentTimeMillis(); + op.rejectTime[uidState.state] = System.currentTimeMillis(); return switchOp.mode; } } if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid + " package " + resolvedPackageName); - if (op.nesting == 0) { - op.time = System.currentTimeMillis(); - op.rejectTime = 0; + if (op.startNesting == 0) { + op.startRealtime = SystemClock.elapsedRealtime(); + op.time[uidState.state] = System.currentTimeMillis(); + op.rejectTime[uidState.state] = 0; op.duration = -1; scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, true); } - op.nesting++; + op.startNesting++; + uidState.startNesting++; if (client.mStartedOps != null) { client.mStartedOps.add(op); } @@ -1415,7 +1536,7 @@ public class AppOpsService extends IAppOpsService.Stub { return; } finishOperationLocked(op, /*finishNested*/ false); - if (op.nesting <= 0) { + if (op.startNesting <= 0) { scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, false); } } @@ -1476,18 +1597,22 @@ public class AppOpsService extends IAppOpsService.Stub { } void finishOperationLocked(Op op, boolean finishNested) { - if (op.nesting <= 1 || finishNested) { - if (op.nesting == 1 || finishNested) { - op.duration = (int)(System.currentTimeMillis() - op.time); - op.time += op.duration; + if (op.startNesting <= 1 || finishNested) { + if (op.startNesting == 1 || finishNested) { + op.duration = (int)(SystemClock.elapsedRealtime() - op.startRealtime); + op.time[op.uidState.state] = System.currentTimeMillis(); } else { Slog.w(TAG, "Finishing op nesting under-run: uid " + op.uid + " pkg " + op.packageName + " code " + op.op + " time=" + op.time - + " duration=" + op.duration + " nesting=" + op.nesting); + + " duration=" + op.duration + " nesting=" + op.startNesting); + } + if (op.startNesting >= 1) { + op.uidState.startNesting -= op.startNesting; } - op.nesting = 0; + op.startNesting = 0; } else { - op.nesting--; + op.startNesting--; + op.uidState.startNesting--; } } @@ -1617,7 +1742,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (!edit) { return null; } - op = new Op(ops.uidState.uid, ops.packageName, code); + op = new Op(ops.uidState, ops.packageName, code); ops.put(code, op); } if (edit) { @@ -1750,7 +1875,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (ops != null) { final Op op = ops.get(AppOpsManager.OP_RUN_IN_BACKGROUND); if (op != null && op.mode != AppOpsManager.opToDefaultMode(op.op)) { - final Op copy = new Op(op.uid, op.packageName, + final Op copy = new Op(op.uidState, op.packageName, AppOpsManager.OP_RUN_ANY_IN_BACKGROUND); copy.mode = op.mode; ops.put(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, copy); @@ -1860,37 +1985,86 @@ public class AppOpsService extends IAppOpsService.Stub { String tagName = parser.getName(); if (tagName.equals("op")) { - Op op = new Op(uid, pkgName, Integer.parseInt(parser.getAttributeValue(null, "n"))); - String mode = parser.getAttributeValue(null, "m"); - if (mode != null) { - op.mode = Integer.parseInt(mode); - } - String time = parser.getAttributeValue(null, "t"); - if (time != null) { - op.time = Long.parseLong(time); - } - time = parser.getAttributeValue(null, "r"); - if (time != null) { - op.rejectTime = Long.parseLong(time); - } - String dur = parser.getAttributeValue(null, "d"); - if (dur != null) { - op.duration = Integer.parseInt(dur); - } - String proxyUid = parser.getAttributeValue(null, "pu"); - if (proxyUid != null) { - op.proxyUid = Integer.parseInt(proxyUid); - } - String proxyPackageName = parser.getAttributeValue(null, "pp"); - if (proxyPackageName != null) { - op.proxyPackageName = proxyPackageName; - } - UidState uidState = getUidStateLocked(uid, true); if (uidState.pkgOps == null) { uidState.pkgOps = new ArrayMap<>(); } + Op op = new Op(uidState, pkgName, + Integer.parseInt(parser.getAttributeValue(null, "n"))); + + for (int i = parser.getAttributeCount()-1; i >= 0; i--) { + final String name = parser.getAttributeName(i); + final String value = parser.getAttributeValue(i); + switch (name) { + case "m": + op.mode = Integer.parseInt(value); + break; + case "d": + op.duration = Integer.parseInt(value); + break; + case "pu": + op.proxyUid = Integer.parseInt(value); + break; + case "pp": + op.proxyPackageName = value; + break; + case "tp": + op.time[AppOpsManager.UID_STATE_PERSISTENT] = Long.parseLong(value); + break; + case "tt": + op.time[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value); + break; + case "tfs": + op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] + = Long.parseLong(value); + break; + case "tf": + op.time[AppOpsManager.UID_STATE_FOREGROUND] = Long.parseLong(value); + break; + case "tb": + op.time[AppOpsManager.UID_STATE_BACKGROUND] = Long.parseLong(value); + break; + case "tc": + op.time[AppOpsManager.UID_STATE_CACHED] = Long.parseLong(value); + break; + case "rp": + op.rejectTime[AppOpsManager.UID_STATE_PERSISTENT] + = Long.parseLong(value); + break; + case "rt": + op.rejectTime[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value); + break; + case "rfs": + op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] + = Long.parseLong(value); + break; + case "rf": + op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND] + = Long.parseLong(value); + break; + case "rb": + op.rejectTime[AppOpsManager.UID_STATE_BACKGROUND] + = Long.parseLong(value); + break; + case "rc": + op.rejectTime[AppOpsManager.UID_STATE_CACHED] + = Long.parseLong(value); + break; + case "t": + // Backwards compat. + op.time[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value); + break; + case "r": + // Backwards compat. + op.rejectTime[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value); + break; + default: + Slog.w(TAG, "Unknown attribute in 'op' tag: " + name); + break; + } + } + Ops ops = uidState.pkgOps.get(pkgName); if (ops == null) { ops = new Ops(pkgName, uidState, isPrivileged); @@ -1977,13 +2151,17 @@ public class AppOpsService extends IAppOpsService.Stub { if (op.getMode() != AppOpsManager.opToDefaultMode(op.getOp())) { out.attribute(null, "m", Integer.toString(op.getMode())); } - long time = op.getTime(); - if (time != 0) { - out.attribute(null, "t", Long.toString(time)); - } - time = op.getRejectTime(); - if (time != 0) { - out.attribute(null, "r", Long.toString(time)); + for (int k = 0; k < _NUM_UID_STATE; k++) { + final long time = op.getTimeFor(k); + if (time != 0) { + out.attribute(null, UID_STATE_TIME_ATTRS[k], + Long.toString(time)); + } + final long rejectTime = op.getRejectTimeFor(k); + if (rejectTime != 0) { + out.attribute(null, UID_STATE_REJECT_ATTRS[k], + Long.toString(rejectTime)); + } } int dur = op.getDuration(); if (dur != 0) { @@ -2069,15 +2247,10 @@ public class AppOpsService extends IAppOpsService.Stub { } int strModeToMode(String modeStr, PrintWriter err) { - switch (modeStr) { - case "allow": - return AppOpsManager.MODE_ALLOWED; - case "deny": - return AppOpsManager.MODE_ERRORED; - case "ignore": - return AppOpsManager.MODE_IGNORED; - case "default": - return AppOpsManager.MODE_DEFAULT; + for (int i = MODE_NAMES.length - 1; i >= 0; i--) { + if (MODE_NAMES[i].equals(modeStr)) { + return i; + } } try { return Integer.parseInt(modeStr); @@ -2466,6 +2639,34 @@ public class AppOpsService extends IAppOpsService.Stub { pw.println(" none"); } + private void dumpTimesLocked(PrintWriter pw, String firstPrefix, String prefix, long[] times, + long now, SimpleDateFormat sdf, Date date) { + boolean hasTime = false; + for (int i = 0; i < _NUM_UID_STATE; i++) { + if (times[i] != 0) { + hasTime = true; + break; + } + } + if (!hasTime) { + return; + } + boolean first = true; + for (int i = 0; i < _NUM_UID_STATE; i++) { + if (times[i] != 0) { + pw.print(first ? firstPrefix : prefix); + first = false; + pw.print(UID_STATE_NAMES[i]); + pw.print(" = "); + date.setTime(times[i]); + pw.print(sdf.format(date)); + pw.print(" ("); + TimeUtils.formatDuration(times[i]-now, pw); + pw.println(")"); + } + } + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; @@ -2491,6 +2692,9 @@ public class AppOpsService extends IAppOpsService.Stub { synchronized (this) { pw.println("Current AppOps Service state:"); final long now = System.currentTimeMillis(); + final long nowElapsed = SystemClock.elapsedRealtime(); + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + final Date date = new Date(); boolean needSep = false; if (mOpModeWatchers.size() > 0) { needSep = true; @@ -2585,7 +2789,7 @@ public class AppOpsService extends IAppOpsService.Stub { pw.print(" "); pw.print(op); pw.print(" usage="); pw.print(AudioAttributes.usageToString(usage)); Restriction r = restrictions.valueAt(i); - pw.print(": mode="); pw.println(r.mode); + pw.print(": mode="); pw.println(MODE_NAMES[r.mode]); if (!r.exceptionPackages.isEmpty()) { pw.println(" Exceptions:"); for (int j=0; j<r.exceptionPackages.size(); j++) { @@ -2602,6 +2806,12 @@ public class AppOpsService extends IAppOpsService.Stub { UidState uidState = mUidStates.valueAt(i); pw.print(" Uid "); UserHandle.formatUid(pw, uidState.uid); pw.println(":"); + pw.print(" state="); + pw.println(UID_STATE_NAMES[uidState.state]); + if (uidState.startNesting != 0) { + pw.print(" startNesting="); + pw.println(uidState.startNesting); + } needSep = true; SparseIntArray opModes = uidState.opModes; @@ -2611,7 +2821,7 @@ public class AppOpsService extends IAppOpsService.Stub { final int code = opModes.keyAt(j); final int mode = opModes.valueAt(j); pw.print(" "); pw.print(AppOpsManager.opToName(code)); - pw.print(": mode="); pw.println(mode); + pw.print(": mode="); pw.println(MODE_NAMES[mode]); } } @@ -2625,21 +2835,26 @@ public class AppOpsService extends IAppOpsService.Stub { for (int j=0; j<ops.size(); j++) { Op op = ops.valueAt(j); pw.print(" "); pw.print(AppOpsManager.opToName(op.op)); - pw.print(": mode="); pw.print(op.mode); - if (op.time != 0) { - pw.print("; time="); TimeUtils.formatDuration(now-op.time, pw); - pw.print(" ago"); - } - if (op.rejectTime != 0) { - pw.print("; rejectTime="); TimeUtils.formatDuration(now-op.rejectTime, pw); - pw.print(" ago"); - } + pw.print(" ("); pw.print(MODE_NAMES[op.mode]); pw.println("): "); + dumpTimesLocked(pw, + " Access: ", + " ", op.time, now, sdf, date); + dumpTimesLocked(pw, + " Reject: ", + " ", op.rejectTime, now, sdf, date); if (op.duration == -1) { - pw.print(" (running)"); + pw.print(" Running start at: "); + TimeUtils.formatDuration(nowElapsed-op.startRealtime, pw); + pw.println(); } else if (op.duration != 0) { - pw.print("; duration="); TimeUtils.formatDuration(op.duration, pw); + pw.print(" duration="); + TimeUtils.formatDuration(op.duration, pw); + pw.println(); + } + if (op.startNesting != 0) { + pw.print(" startNesting="); + pw.println(op.startNesting); } - pw.println(); } } } diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java index ae14dfaa4db1..1cd853ff3efe 100644 --- a/services/core/java/com/android/server/BinderCallsStatsService.java +++ b/services/core/java/com/android/server/BinderCallsStatsService.java @@ -56,7 +56,10 @@ public class BinderCallsStatsService extends Binder { protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (args != null) { for (final String arg : args) { - if ("--reset".equals(arg)) { + if ("-a".equals(arg)) { + // We currently dump all information by default + continue; + } else if ("--reset".equals(arg)) { reset(); pw.println("binder_calls_stats reset."); return; @@ -78,7 +81,6 @@ public class BinderCallsStatsService extends Binder { return; } else { pw.println("Unknown option: " + arg); - return; } } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 8d10cfaaf9c0..2c0e97eae537 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -285,6 +285,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { try { mBluetoothLock.readLock().lock(); if (mBluetooth != null) { + addActiveLog( + BluetoothProtoEnums.ENABLE_DISABLE_REASON_AIRPLANE_MODE, + mContext.getPackageName(), false); mBluetooth.onBrEdrDown(); mEnable = false; mEnableExternal = false; @@ -677,6 +680,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { try { mBluetoothLock.readLock().lock(); if (mBluetooth != null) { + addActiveLog(BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, + mContext.getPackageName(), false); mBluetooth.onBrEdrDown(); } } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 5afb0a622208..9994462531b2 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -238,8 +238,9 @@ public class ConnectivityService extends IConnectivityManager.Stub private KeyStore mKeyStore; + @VisibleForTesting @GuardedBy("mVpns") - private final SparseArray<Vpn> mVpns = new SparseArray<Vpn>(); + protected final SparseArray<Vpn> mVpns = new SparseArray<Vpn>(); // TODO: investigate if mLockdownEnabled can be removed and replaced everywhere by // a direct call to LockdownVpnTracker.isEnabled(). @@ -929,6 +930,15 @@ public class ConnectivityService extends IConnectivityManager.Stub deps); } + private static NetworkCapabilities createDefaultNetworkCapabilitiesForUid(int uid) { + final NetworkCapabilities netCap = new NetworkCapabilities(); + netCap.addCapability(NET_CAPABILITY_INTERNET); + netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED); + netCap.removeCapability(NET_CAPABILITY_NOT_VPN); + netCap.setSingleUid(uid); + return netCap; + } + private NetworkRequest createDefaultInternetRequestForTransport( int transportType, NetworkRequest.Type type) { NetworkCapabilities netCap = new NetworkCapabilities(); @@ -1181,12 +1191,20 @@ public class ConnectivityService extends IConnectivityManager.Stub int vpnNetId = NETID_UNSET; synchronized (mVpns) { final Vpn vpn = mVpns.get(user); + // TODO : now that capabilities contain the UID, the appliesToUid test should + // be removed as the satisfying test below should be enough. if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId(); } NetworkAgentInfo nai; if (vpnNetId != NETID_UNSET) { nai = getNetworkAgentInfoForNetId(vpnNetId); - if (nai != null) return nai.network; + if (nai != null) { + final NetworkCapabilities requiredCaps = + createDefaultNetworkCapabilitiesForUid(uid); + if (requiredCaps.satisfiedByNetworkCapabilities(nai.networkCapabilities)) { + return nai.network; + } + } } nai = getDefaultNetwork(); if (nai != null @@ -1401,8 +1419,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private NetworkCapabilities networkCapabilitiesRestrictedForCallerPermissions( NetworkCapabilities nc, int callerPid, int callerUid) { final NetworkCapabilities newNc = new NetworkCapabilities(nc); - if (!checkSettingsPermission(callerPid, callerUid)) newNc.setUids(null); - if (!checkSettingsPermission(callerPid, callerUid)) newNc.setSSID(null); + if (!checkSettingsPermission(callerPid, callerUid)) { + newNc.setUids(null); + newNc.setSSID(null); + } return newNc; } @@ -4304,8 +4324,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // the default network request. This allows callers to keep track of // the system default network. if (type == NetworkRequest.Type.TRACK_DEFAULT) { - networkCapabilities = new NetworkCapabilities(mDefaultRequest.networkCapabilities); - networkCapabilities.removeCapability(NET_CAPABILITY_NOT_VPN); + networkCapabilities = createDefaultNetworkCapabilitiesForUid(Binder.getCallingUid()); enforceAccessPermission(); } else { networkCapabilities = new NetworkCapabilities(networkCapabilities); @@ -4562,7 +4581,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated. private final NetworkRequest mDefaultRequest; - + // Request used to optionally keep mobile data active even when higher // priority networks like Wi-Fi are active. private final NetworkRequest mDefaultMobileDataRequest; diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 2b3c5852ac8b..aaa42e575ae8 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -327,13 +327,16 @@ public class DeviceIdleController extends SystemService private final int[] mEventCmds = new int[EVENT_BUFFER_SIZE]; private final long[] mEventTimes = new long[EVENT_BUFFER_SIZE]; + private final String[] mEventReasons = new String[EVENT_BUFFER_SIZE]; - private void addEvent(int cmd) { + private void addEvent(int cmd, String reason) { if (mEventCmds[0] != cmd) { System.arraycopy(mEventCmds, 0, mEventCmds, 1, EVENT_BUFFER_SIZE - 1); System.arraycopy(mEventTimes, 0, mEventTimes, 1, EVENT_BUFFER_SIZE - 1); + System.arraycopy(mEventReasons, 0, mEventReasons, 1, EVENT_BUFFER_SIZE - 1); mEventCmds[0] = cmd; mEventTimes[0] = SystemClock.elapsedRealtime(); + mEventReasons[0] = reason; } } @@ -2061,7 +2064,7 @@ public class DeviceIdleController extends SystemService mMaintenanceStartTime = 0; resetIdleManagementLocked(); resetLightIdleManagementLocked(); - addEvent(EVENT_NORMAL); + addEvent(EVENT_NORMAL, activeReason); } } @@ -2158,7 +2161,7 @@ public class DeviceIdleController extends SystemService if (DEBUG) Slog.d(TAG, "Moved to LIGHT_STATE_IDLE."); mLightState = LIGHT_STATE_IDLE; EventLogTags.writeDeviceIdleLight(mLightState, reason); - addEvent(EVENT_LIGHT_IDLE); + addEvent(EVENT_LIGHT_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; @@ -2179,7 +2182,7 @@ public class DeviceIdleController extends SystemService "Moved from LIGHT_STATE_IDLE to LIGHT_STATE_IDLE_MAINTENANCE."); mLightState = LIGHT_STATE_IDLE_MAINTENANCE; EventLogTags.writeDeviceIdleLight(mLightState, reason); - addEvent(EVENT_LIGHT_MAINTENANCE); + addEvent(EVENT_LIGHT_MAINTENANCE, null); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); } else { // We'd like to do maintenance, but currently don't have network @@ -2284,7 +2287,7 @@ public class DeviceIdleController extends SystemService cancelLightAlarmLocked(); } EventLogTags.writeDeviceIdle(mState, reason); - addEvent(EVENT_DEEP_IDLE); + addEvent(EVENT_DEEP_IDLE, null); mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON); break; @@ -2303,7 +2306,7 @@ public class DeviceIdleController extends SystemService } mState = STATE_IDLE_MAINTENANCE; EventLogTags.writeDeviceIdle(mState, reason); - addEvent(EVENT_DEEP_MAINTENANCE); + addEvent(EVENT_DEEP_MAINTENANCE, null); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); break; } @@ -2414,7 +2417,7 @@ public class DeviceIdleController extends SystemService mCurIdleBudget = 0; mMaintenanceStartTime = 0; EventLogTags.writeDeviceIdle(mState, type); - addEvent(EVENT_NORMAL); + addEvent(EVENT_NORMAL, type); becomeInactive = true; } if (mLightState == LIGHT_STATE_OVERRIDE) { @@ -3273,8 +3276,14 @@ public class DeviceIdleController extends SystemService pw.print(" "); pw.print(label); pw.print(": "); - TimeUtils.formatDuration(mEventTimes[i], now, pw);; + TimeUtils.formatDuration(mEventTimes[i], now, pw); + if (mEventReasons[i] != null) { + pw.print(" ("); + pw.print(mEventReasons[i]); + pw.print(")"); + } pw.println(); + } } diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index cd90e3f9b076..33ca02fecb70 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -1101,9 +1101,11 @@ public class IpSecService extends IIpSecService.Stub { new RefcountedResource<SpiRecord>( new SpiRecord(resourceId, "", destinationAddress, spi), binder)); } catch (ServiceSpecificException e) { - // TODO: Add appropriate checks when other ServiceSpecificException types are supported - return new IpSecSpiResponse( - IpSecManager.Status.SPI_UNAVAILABLE, INVALID_RESOURCE_ID, spi); + if (e.errorCode == OsConstants.ENOENT) { + return new IpSecSpiResponse( + IpSecManager.Status.SPI_UNAVAILABLE, INVALID_RESOURCE_ID, spi); + } + throw e; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1115,7 +1117,6 @@ public class IpSecService extends IIpSecService.Stub { */ private void releaseResource(RefcountedResourceArray resArray, int resourceId) throws RemoteException { - resArray.getRefcountedResourceOrThrow(resourceId).userRelease(); } @@ -1315,15 +1316,12 @@ public class IpSecService extends IIpSecService.Stub { releaseNetId(ikey); releaseNetId(okey); throw e.rethrowFromSystemServer(); - } catch (ServiceSpecificException e) { - // FIXME: get the error code and throw is at an IOException from Errno Exception + } catch (Throwable t) { + // Release keys if we got an error. + releaseNetId(ikey); + releaseNetId(okey); + throw t; } - - // If we make it to here, then something has gone wrong and we couldn't create a VTI. - // Release the keys that we reserved, and return an error status. - releaseNetId(ikey); - releaseNetId(okey); - return new IpSecTunnelInterfaceResponse(IpSecManager.Status.RESOURCE_UNAVAILABLE); } /** @@ -1352,9 +1350,6 @@ public class IpSecService extends IIpSecService.Stub { localAddr.getPrefixLength()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); - } catch (ServiceSpecificException e) { - // If we get here, one of the arguments provided was invalid. Wrap the SSE, and throw. - throw new IllegalArgumentException(e); } } @@ -1384,9 +1379,6 @@ public class IpSecService extends IIpSecService.Stub { localAddr.getPrefixLength()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); - } catch (ServiceSpecificException e) { - // If we get here, one of the arguments provided was invalid. Wrap the SSE, and throw. - throw new IllegalArgumentException(e); } } @@ -1590,12 +1582,7 @@ public class IpSecService extends IIpSecService.Stub { dependencies.add(refcountedSpiRecord); SpiRecord spiRecord = refcountedSpiRecord.getResource(); - try { - createOrUpdateTransform(c, resourceId, spiRecord, socketRecord); - } catch (ServiceSpecificException e) { - // FIXME: get the error code and throw is at an IOException from Errno Exception - return new IpSecTransformResponse(IpSecManager.Status.RESOURCE_UNAVAILABLE); - } + createOrUpdateTransform(c, resourceId, spiRecord, socketRecord); // SA was created successfully, time to construct a record and lock it away userRecord.mTransformRecords.put( @@ -1642,23 +1629,15 @@ public class IpSecService extends IIpSecService.Stub { c.getMode() == IpSecTransform.MODE_TRANSPORT, "Transform mode was not Transport mode; cannot be applied to a socket"); - try { - mSrvConfig - .getNetdInstance() - .ipSecApplyTransportModeTransform( - socket.getFileDescriptor(), - resourceId, - direction, - c.getSourceAddress(), - c.getDestinationAddress(), - info.getSpiRecord().getSpi()); - } catch (ServiceSpecificException e) { - if (e.errorCode == EINVAL) { - throw new IllegalArgumentException(e.toString()); - } else { - throw e; - } - } + mSrvConfig + .getNetdInstance() + .ipSecApplyTransportModeTransform( + socket.getFileDescriptor(), + resourceId, + direction, + c.getSourceAddress(), + c.getDestinationAddress(), + info.getSpiRecord().getSpi()); } /** @@ -1670,13 +1649,9 @@ public class IpSecService extends IIpSecService.Stub { @Override public synchronized void removeTransportModeTransforms(ParcelFileDescriptor socket) throws RemoteException { - try { - mSrvConfig - .getNetdInstance() - .ipSecRemoveTransportModeTransform(socket.getFileDescriptor()); - } catch (ServiceSpecificException e) { - // FIXME: get the error code and throw is at an IOException from Errno Exception - } + mSrvConfig + .getNetdInstance() + .ipSecRemoveTransportModeTransform(socket.getFileDescriptor()); } /** diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 309a75a6a6de..7b02a4fb3fd8 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -86,6 +86,7 @@ import com.android.server.location.ActivityRecognitionProxy; import com.android.server.location.GeocoderProxy; import com.android.server.location.GeofenceManager; import com.android.server.location.GeofenceProxy; +import com.android.server.location.GnssBatchingProvider; import com.android.server.location.GnssLocationProvider; import com.android.server.location.GnssMeasurementsProvider; import com.android.server.location.GnssNavigationMessageProvider; @@ -244,7 +245,7 @@ public class LocationManagerService extends ILocationManager.Stub { private GnssLocationProvider.GnssMetricsProvider mGnssMetricsProvider; - private GnssLocationProvider.GnssBatchingProvider mGnssBatchingProvider; + private GnssBatchingProvider mGnssBatchingProvider; private IBatchedLocationCallback mGnssBatchingCallback; private LinkedCallback mGnssBatchingDeathCallback; private boolean mGnssBatchingInProgress = false; @@ -1176,7 +1177,7 @@ public class LocationManagerService extends ILocationManager.Stub { "Location Hardware permission not granted to access hardware batching"); if (hasGnssPermissions(packageName) && mGnssBatchingProvider != null) { - return mGnssBatchingProvider.getSize(); + return mGnssBatchingProvider.getBatchSize(); } else { return 0; } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 60d11d7e6f4b..41f413d5f07d 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -351,7 +351,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCallForwarding[i] = false; mCellLocation[i] = new Bundle(); mCellInfo.add(i, null); - mPhysicalChannelConfigs.add(i, null); + mPhysicalChannelConfigs.add(i, new ArrayList<PhysicalChannelConfig>()); } // Note that location can be null for non-phone builds like diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 83d2bf7320c5..ede870fbf02e 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -704,9 +704,11 @@ public class VibratorService extends IVibratorService.Stub VibrationEffect scaledEffect = null; if (vib.effect instanceof VibrationEffect.OneShot) { VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect; + oneShot = oneShot.resolve(mDefaultVibrationAmplitude); scaledEffect = oneShot.scale(gamma, maxAmplitude); } else if (vib.effect instanceof VibrationEffect.Waveform) { VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect; + waveform = waveform.resolve(mDefaultVibrationAmplitude); scaledEffect = waveform.scale(gamma, maxAmplitude); } else { Slog.w(TAG, "Unable to apply intensity scaling, unknown VibrationEffect type"); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 228171ff65f8..f413639a729a 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -422,13 +422,9 @@ public final class ActiveServices { } // If we're starting indirectly (e.g. from PendingIntent), figure out whether - // we're launching into an app in a background state. - final int uidState = mAm.getUidStateLocked(r.appInfo.uid); - if (DEBUG_SERVICE) { - Slog.v(TAG_SERVICE, "Uid state " + uidState + " indirect starting " + r.shortName); - } - final boolean bgLaunch = (uidState > - ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); + // we're launching into an app in a background state. This keys off of the same + // idleness state tracking as e.g. O+ background service start policy. + final boolean bgLaunch = !mAm.isUidActiveLocked(r.appInfo.uid); // If the app has strict background restrictions, we treat any bg service // start analogously to the legacy-app forced-restrictions case, regardless @@ -1197,10 +1193,13 @@ public final class ActiveServices { if (!ignoreForeground && appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) { - ignoreForeground = true; Slog.w(TAG, "Service.startForeground() not allowed due to bg restriction: service " + r.shortName); + // Back off of any foreground expectations around this service, since we've + // just turned down its fg request. + updateServiceForegroundLocked(r.app, false); + ignoreForeground = true; } // Apps under strict background restrictions simply don't get to have foreground diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index fac3f92463af..0f42103e4178 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -420,7 +420,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> if (!otherStack.inSplitScreenSecondaryWindowingMode()) { continue; } - otherStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + otherStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN, false /* animate */, + false /* showRecents */, false /* enteringSplitScreenMode */, + true /* deferEnsuringVisibility */); } } finally { final ActivityStack topFullscreenStack = @@ -450,7 +452,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack> } otherStack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, false /* animate */, false /* showRecents */, - true /* enteringSplitScreenMode */); + true /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */); } } finally { mSupervisor.mWindowManager.continueSurfaceLayout(); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 137e6ab69cd6..193d3f498317 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -433,6 +433,7 @@ import com.android.internal.util.Preconditions; import com.android.server.AlarmManagerInternal; import com.android.server.AppOpsService; import com.android.server.AttributeCache; +import com.android.server.BinderCallsStatsService; import com.android.server.DeviceIdleController; import com.android.server.IntentResolver; import com.android.server.IoThread; @@ -3413,6 +3414,11 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override + public void batteryStatsReset() { + BinderCallsStatsService.reset(); + } + + @Override public void batterySendBroadcast(Intent intent) { synchronized (this) { broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, @@ -5300,7 +5306,8 @@ public class ActivityManagerService extends IActivityManager.Stub final long origId = Binder.clearCallingIdentity(); try { synchronized (this) { - mWindowManager.cancelRecentsAnimation(restoreHomeStackPosition + // Cancel the recents animation synchronously (do not hold the WM lock) + mWindowManager.cancelRecentsAnimationSynchronously(restoreHomeStackPosition ? REORDER_MOVE_TO_ORIGINAL_POSITION : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation"); } @@ -8476,8 +8483,19 @@ public class ActivityManagerService extends IActivityManager.Stub if (!(sender instanceof PendingIntentRecord)) { return; } + boolean isCancelled; synchronized(this) { - ((PendingIntentRecord)sender).registerCancelListenerLocked(receiver); + PendingIntentRecord pendingIntent = (PendingIntentRecord) sender; + isCancelled = pendingIntent.canceled; + if (!isCancelled) { + pendingIntent.registerCancelListenerLocked(receiver); + } + } + if (isCancelled) { + try { + receiver.send(Activity.RESULT_CANCELED, null); + } catch (RemoteException e) { + } } } @@ -11253,7 +11271,7 @@ public class ActivityManagerService extends IActivityManager.Stub stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task); } stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents, - false /* enteringSplitScreenMode */); + false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */); return windowingMode != task.getWindowingMode(); } finally { Binder.restoreCallingIdentity(ident); @@ -22911,6 +22929,7 @@ public class ActivityManagerService extends IActivityManager.Stub private void noteUidProcessState(final int uid, final int state) { mBatteryStatsService.noteUidProcessState(uid, state); + mAppOpsService.updateUidProcState(uid, state); if (mTrackingAssociations) { for (int i1=0, N1=mAssociations.size(); i1<N1; i1++) { ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>> targetComponents @@ -26607,8 +26626,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean isUidActive(int uid) { synchronized (ActivityManagerService.this) { - final UidRecord uidRec = mActiveUids.get(uid); - return (uidRec != null) && !uidRec.idle; + return isUidActiveLocked(uid); } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 9fb3e11446ce..e86850e66071 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -515,11 +515,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai @Override public void setWindowingMode(int windowingMode) { setWindowingMode(windowingMode, false /* animate */, false /* showRecents */, - false /* enteringSplitScreenMode */); + false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */); } void setWindowingMode(int preferredWindowingMode, boolean animate, boolean showRecents, - boolean enteringSplitScreenMode) { + boolean enteringSplitScreenMode, boolean deferEnsuringVisibility) { final boolean creating = mWindowContainerController == null; final int currentMode = getWindowingMode(); final ActivityDisplay display = getDisplay(); @@ -555,7 +555,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // doesn't support split-screen mode, go ahead an dismiss split-screen and display a // warning toast about it. mService.mTaskChangeNotificationController.notifyActivityDismissingDockedStack(); - display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN); + display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN, + false /* animate */, false /* showRecents */, + false /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */); } } @@ -646,9 +648,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai wm.continueSurfaceLayout(); } - // Don't ensure visible activities if the windowing mode change was a side effect of us - // entering split-screen mode. - if (!enteringSplitScreenMode) { + if (!deferEnsuringVisibility) { mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS); mStackSupervisor.resumeFocusedStackTopActivityLocked(); } diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java index 6c4554646e6e..31ccf3530fb9 100644 --- a/services/core/java/com/android/server/am/ActivityStartController.java +++ b/services/core/java/com/android/server/am/ActivityStartController.java @@ -350,7 +350,8 @@ public class ActivityStartController { "FLAG_CANT_SAVE_STATE not supported here"); } - final SafeActivityOptions checkedOptions = i == intents.length - 1 + final boolean top = i == intents.length - 1; + final SafeActivityOptions checkedOptions = top ? options : null; final int res = obtainStarter(intent, reason) @@ -367,6 +368,10 @@ public class ActivityStartController { .setActivityOptions(checkedOptions) .setComponentSpecified(componentSpecified) .setOutActivity(outActivity) + + // Top activity decides on animation being run, so we allow only for the + // top one as otherwise an activity below might consume it. + .setAllowPendingRemoteAnimationRegistryLookup(top /* allowLookup*/) .execute(); if (res < 0) { diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index fb89e6711a18..7ff7d9a9b6c4 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -314,6 +314,12 @@ class ActivityStarter { WaitResult waitResult; /** + * If set to {@code true}, allows this activity start to look into + * {@link PendingRemoteAnimationRegistry} + */ + boolean allowPendingRemoteAnimationRegistryLookup; + + /** * Indicates that we should wait for the result of the start request. This flag is set when * {@link ActivityStarter#setMayWait(int)} is called. * {@see ActivityStarter#startActivityMayWait}. @@ -360,6 +366,7 @@ class ActivityStarter { waitResult = null; mayWait = false; avoidMoveToFront = false; + allowPendingRemoteAnimationRegistryLookup = true; } /** @@ -395,6 +402,8 @@ class ActivityStarter { waitResult = request.waitResult; mayWait = request.mayWait; avoidMoveToFront = request.avoidMoveToFront; + allowPendingRemoteAnimationRegistryLookup + = request.allowPendingRemoteAnimationRegistryLookup; } } @@ -477,7 +486,8 @@ class ActivityStarter { mRequest.resultWho, mRequest.requestCode, mRequest.startFlags, mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId, - mRequest.inTask, mRequest.reason); + mRequest.inTask, mRequest.reason, + mRequest.allowPendingRemoteAnimationRegistryLookup); } else { return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent, mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo, @@ -486,7 +496,8 @@ class ActivityStarter { mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.componentSpecified, - mRequest.outActivity, mRequest.inTask, mRequest.reason); + mRequest.outActivity, mRequest.inTask, mRequest.reason, + mRequest.allowPendingRemoteAnimationRegistryLookup); } } finally { onExecutionComplete(); @@ -517,7 +528,8 @@ class ActivityStarter { IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, - ActivityRecord[] outActivity, TaskRecord inTask, String reason) { + ActivityRecord[] outActivity, TaskRecord inTask, String reason, + boolean allowPendingRemoteAnimationRegistryLookup) { if (TextUtils.isEmpty(reason)) { throw new IllegalArgumentException("Need to specify a reason."); @@ -530,7 +542,7 @@ class ActivityStarter { aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord, - inTask); + inTask, allowPendingRemoteAnimationRegistryLookup); if (outActivity != null) { // mLastStartActivityRecord[0] is set in the call to startActivity above. @@ -560,7 +572,7 @@ class ActivityStarter { String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, - TaskRecord inTask) { + TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) { int err = ActivityManager.START_SUCCESS; // Pull the optional Ephemeral Installer-only bundle out of the options early. final Bundle verificationBundle @@ -709,8 +721,11 @@ class ActivityStarter { ActivityOptions checkedOptions = options != null ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null; - checkedOptions = mService.getActivityStartController().getPendingRemoteAnimationRegistry() - .overrideOptionsIfNeeded(callingPackage, checkedOptions); + if (allowPendingRemoteAnimationRegistryLookup) { + checkedOptions = mService.getActivityStartController() + .getPendingRemoteAnimationRegistry() + .overrideOptionsIfNeeded(callingPackage, checkedOptions); + } if (mService.mController != null) { try { // The Intent we give to the watcher has the extra data @@ -928,7 +943,8 @@ class ActivityStarter { IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity, - int userId, TaskRecord inTask, String reason) { + int userId, TaskRecord inTask, String reason, + boolean allowPendingRemoteAnimationRegistryLookup) { // Refuse possible leaked file descriptors if (intent != null && intent.hasFileDescriptors()) { throw new IllegalArgumentException("File descriptors passed in Intent"); @@ -1070,7 +1086,8 @@ class ActivityStarter { int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, - ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason); + ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason, + allowPendingRemoteAnimationRegistryLookup); Binder.restoreCallingIdentity(origId); @@ -2567,6 +2584,11 @@ class ActivityStarter { return this; } + ActivityStarter setAllowPendingRemoteAnimationRegistryLookup(boolean allowLookup) { + mRequest.allowPendingRemoteAnimationRegistryLookup = allowLookup; + return this; + } + void dump(PrintWriter pw, String prefix) { prefix = prefix + " "; pw.print(prefix); diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 35b7f2b4fe86..a6dafbb1db36 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -476,7 +476,8 @@ class AppErrors { } catch (IllegalArgumentException e) { // Hmm, that didn't work, app might have crashed before creating a // recents entry. Let's see if we have a safe-to-restart intent. - final Set<String> cats = task.intent.getCategories(); + final Set<String> cats = task.intent != null + ? task.intent.getCategories() : null; if (cats != null && cats.contains(Intent.CATEGORY_LAUNCHER)) { mService.getActivityStartController().startActivityInPackage( task.mCallingUid, callingPid, callingUid, task.mCallingPackage, diff --git a/services/core/java/com/android/server/am/AppWarnings.java b/services/core/java/com/android/server/am/AppWarnings.java index ea0251e2ce6a..30a384434675 100644 --- a/services/core/java/com/android/server/am/AppWarnings.java +++ b/services/core/java/com/android/server/am/AppWarnings.java @@ -122,7 +122,7 @@ class AppWarnings { return; } - // TODO(b/77862563): temp. fix while P is being finalized. To be reverted + // TODO(b/75318890): Need to move this to when the app actually crashes. if (/*ActivityManager.isRunningInTestHarness() &&*/ !mAlwaysShowUnsupportedCompileSdkWarningActivities.contains(r.realActivity)) { // Don't show warning if we are running in a test harness and we don't have to always diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index 2291e44d9e06..49fa902d161d 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -103,6 +103,9 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { @GuardedBy("this") private Future<?> mWakelockChangesUpdate; + @GuardedBy("this") + private Future<?> mBatteryLevelSync; + private final Object mWorkerLock = new Object(); @GuardedBy("mWorkerLock") @@ -117,6 +120,13 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0, 0); + /** + * Timestamp at which all external stats were last collected in + * {@link SystemClock#elapsedRealtime()} time base. + */ + @GuardedBy("this") + private long mLastCollectionTimeStamp; + BatteryExternalStatsWorker(Context context, BatteryStatsImpl stats) { mContext = context; mStats = stats; @@ -190,35 +200,75 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { @Override public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) { - if (mExecutorService.isShutdown()) { - return CompletableFuture.failedFuture(new IllegalStateException("worker shutdown")); + synchronized (BatteryExternalStatsWorker.this) { + mWakelockChangesUpdate = scheduleDelayedSyncLocked(mWakelockChangesUpdate, + () -> { + scheduleSync("wakelock-change", UPDATE_CPU); + scheduleRunnable(() -> mStats.postBatteryNeedsCpuUpdateMsg()); + }, + delayMillis); + return mWakelockChangesUpdate; } + } - if (mWakelockChangesUpdate != null) { - // If there's already a scheduled task, leave it as is if we're trying to re-schedule - // it again with a delay, otherwise cancel and re-schedule it. - if (delayMillis == 0) { + @Override + public void cancelCpuSyncDueToWakelockChange() { + synchronized (BatteryExternalStatsWorker.this) { + if (mWakelockChangesUpdate != null) { mWakelockChangesUpdate.cancel(false); - } else { - return mWakelockChangesUpdate; + mWakelockChangesUpdate = null; } } - - mWakelockChangesUpdate = mExecutorService.schedule(() -> { - scheduleSync("wakelock-change", UPDATE_CPU); - scheduleRunnable(() -> mStats.postBatteryNeedsCpuUpdateMsg()); - mWakelockChangesUpdate = null; - }, delayMillis, TimeUnit.MILLISECONDS); - return mWakelockChangesUpdate; } @Override - public void cancelCpuSyncDueToWakelockChange() { - if (mWakelockChangesUpdate != null) { - mWakelockChangesUpdate.cancel(false); + public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) { + synchronized (BatteryExternalStatsWorker.this) { + mBatteryLevelSync = scheduleDelayedSyncLocked(mBatteryLevelSync, + () -> scheduleSync("battery-level", UPDATE_ALL), + delayMillis); + return mBatteryLevelSync; } } + @GuardedBy("this") + private void cancelSyncDueToBatteryLevelChangeLocked() { + if (mBatteryLevelSync != null) { + mBatteryLevelSync.cancel(false); + mBatteryLevelSync = null; + } + } + + /** + * Schedule a sync {@param syncRunnable} with a delay. If there's already a scheduled sync, a + * new sync won't be scheduled unless it is being scheduled to run immediately (delayMillis=0). + * + * @param lastScheduledSync the task which was earlier scheduled to run + * @param syncRunnable the task that needs to be scheduled to run + * @param delayMillis time after which {@param syncRunnable} needs to be scheduled + * @return scheduled {@link Future} which can be used to check if task is completed or to + * cancel it if needed + */ + @GuardedBy("this") + private Future<?> scheduleDelayedSyncLocked(Future<?> lastScheduledSync, Runnable syncRunnable, + long delayMillis) { + if (mExecutorService.isShutdown()) { + return CompletableFuture.failedFuture(new IllegalStateException("worker shutdown")); + } + + if (lastScheduledSync != null) { + // If there's already a scheduled task, leave it as is if we're trying to + // re-schedule it again with a delay, otherwise cancel and re-schedule it. + if (delayMillis == 0) { + lastScheduledSync.cancel(false); + } else { + return lastScheduledSync; + } + } + + return mExecutorService.schedule(syncRunnable, delayMillis, TimeUnit.MILLISECONDS); + } + public synchronized Future<?> scheduleWrite() { if (mExecutorService.isShutdown()) { return CompletableFuture.failedFuture(new IllegalStateException("worker shutdown")); @@ -259,6 +309,12 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { return mCurrentFuture; } + long getLastCollectionTimeStamp() { + synchronized (this) { + return mLastCollectionTimeStamp; + } + } + private final Runnable mSyncTask = new Runnable() { @Override public void run() { @@ -281,6 +337,12 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { mUidsToRemove.clear(); mCurrentFuture = null; mUseLatestStates = true; + if ((updateFlags & UPDATE_ALL) != 0) { + cancelSyncDueToBatteryLevelChangeLocked(); + } + if ((updateFlags & UPDATE_CPU) != 0) { + cancelCpuSyncDueToWakelockChange(); + } } try { @@ -312,6 +374,10 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { } catch (Exception e) { Slog.wtf(TAG, "Error updating external stats: ", e); } + + synchronized (BatteryExternalStatsWorker.this) { + mLastCollectionTimeStamp = SystemClock.elapsedRealtime(); + } } }; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 9c2b1a5d17aa..0c328a89ef84 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -1541,7 +1541,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub } long ident = Binder.clearCallingIdentity(); try { - syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL); + if (shouldCollectExternalStats()) { + syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL); + } synchronized (mStats) { return getHealthStatsForUidLocked(requestUid); } @@ -1565,7 +1567,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub long ident = Binder.clearCallingIdentity(); int i=-1; try { - syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL); + if (shouldCollectExternalStats()) { + syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL); + } synchronized (mStats) { final int N = requestUids.length; final HealthStatsParceler[] results = new HealthStatsParceler[N]; @@ -1583,6 +1587,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + private boolean shouldCollectExternalStats() { + return (SystemClock.elapsedRealtime() - mWorker.getLastCollectionTimeStamp()) + > mStats.getExternalStatsCollectionRateLimitMs(); + } + /** * Returns whether the Binder.getCallingUid is the only thing in requestUids. */ diff --git a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java b/services/core/java/com/android/server/am/CarUserSwitchingDialog.java index 676f0c7dd28e..1149e8703a4f 100644 --- a/services/core/java/com/android/server/am/CarUserSwitchingDialog.java +++ b/services/core/java/com/android/server/am/CarUserSwitchingDialog.java @@ -23,6 +23,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.os.UserManager; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -59,11 +60,14 @@ final class CarUserSwitchingDialog extends UserSwitchingDialog { View view = LayoutInflater.from(getContext()).inflate(R.layout.car_user_switching_dialog, null); - FileDescriptor fileDescriptor = UserManagerService.getInstance() - .getUserIcon(mNewUser.id).getFileDescriptor(); - Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor); - ((ImageView) view.findViewById(R.id.user_loading_avatar)) - .setImageBitmap(bitmap); + UserManager userManager = + (UserManager) getContext().getSystemService(Context.USER_SERVICE); + Bitmap bitmap = userManager.getUserIcon(mNewUser.id); + if (bitmap != null) { + ((ImageView) view.findViewById(R.id.user_loading_avatar)) + .setImageBitmap(bitmap); + } + ((TextView) view.findViewById(R.id.user_loading)) .setText(res.getString(R.string.car_loading_profile)); setView(view); diff --git a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java index 84dca7fe1c8a..d9878cd09fe4 100644 --- a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java +++ b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java @@ -16,6 +16,9 @@ package com.android.server.am; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; +import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; + import android.app.AlertDialog; import android.content.Context; import android.content.Intent; @@ -23,6 +26,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.SystemPropertiesProto; +import android.util.Log; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; @@ -31,6 +35,8 @@ import com.android.internal.R; import com.android.server.utils.AppInstallerUtil; public class DeprecatedTargetSdkVersionDialog { + private static final String TAG = TAG_WITH_CLASS_NAME ? "DeprecatedTargetSdkVersionDialog" : TAG_AM; + private final AlertDialog mDialog; private final String mPackageName; @@ -74,6 +80,7 @@ public class DeprecatedTargetSdkVersionDialog { } public void show() { + Log.w(TAG, "Showing SDK deprecation warning for package " + mPackageName); mDialog.show(); } diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java index 328426da159f..1366c218299e 100644 --- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java @@ -19,6 +19,7 @@ package com.android.server.am; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; +import android.os.Build; import android.os.SystemProperties; import android.provider.Settings; import android.text.TextUtils; @@ -98,7 +99,14 @@ class GlobalSettingsToPropertiesMapper { try { systemPropertiesSet(key, value); } catch (Exception e) { - Slog.e(TAG, "Unable to set property " + key + " value '" + value + "'", e); + // Failure to set a property can be caused by SELinux denial. This usually indicates + // that the property wasn't whitelisted in sepolicy. + // No need to report it on all user devices, only on debug builds. + if (Build.IS_DEBUGGABLE) { + Slog.wtf(TAG, "Unable to set property " + key + " value '" + value + "'", e); + } else { + Slog.e(TAG, "Unable to set property " + key + " value '" + value + "'", e); + } } } diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index 1b7f75b2d52c..57643822b1a4 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -121,6 +121,8 @@ class KeyguardController { void setKeyguardShown(boolean keyguardShowing, boolean aodShowing, int secondaryDisplayShowing) { boolean showingChanged = keyguardShowing != mKeyguardShowing || aodShowing != mAodShowing; + // If keyguard is going away, but SystemUI aborted the transition, need to reset state. + showingChanged |= mKeyguardGoingAway && keyguardShowing; if (!showingChanged && secondaryDisplayShowing == mSecondaryDisplayShowing) { return; } diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index bef650b90f44..151ef4942432 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -555,11 +555,12 @@ public class LockTaskController { return; } - if (mLockTaskModeTasks.isEmpty()) { + final Intent taskIntent = task.intent; + if (mLockTaskModeTasks.isEmpty() && taskIntent != null) { mSupervisor.mRecentTasks.onLockTaskModeStateChanged(lockTaskModeState, task.userId); // Start lock task on the handler thread mHandler.post(() -> performStartLockTask( - task.intent.getComponent().getPackageName(), + taskIntent.getComponent().getPackageName(), task.userId, lockTaskModeState)); } diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS index 99640530a49b..f60c5c3208d9 100644 --- a/services/core/java/com/android/server/am/OWNERS +++ b/services/core/java/com/android/server/am/OWNERS @@ -1,4 +1,34 @@ + +# Applications & Processes +yamasani@google.com +jsharkey@google.com +hackbod@google.com +omakoto@google.com +fkupolov@google.com +ctate@google.com +huiyu@google.com +mwachens@google.com +sudheersai@google.com +suprabh@google.com + +# Windows & Activities +ogunwale@google.com +jjaggi@google.com +racarr@google.com +chaviw@google.com +brycelee@google.com +akulian@google.com +roosa@google.com + +# Permissions & Packages +svetoslavganov@google.com +toddke@google.com + +# Londoners +michaelwr@google.com +narayan@google.com + per-file GlobalSettingsToPropertiesMapper.java=fkupolov@google.com per-file GlobalSettingsToPropertiesMapper.java=omakoto@google.com per-file GlobalSettingsToPropertiesMapper.java=svetoslavganov@google.com -per-file GlobalSettingsToPropertiesMapper.java=yamasani@google.com
\ No newline at end of file +per-file GlobalSettingsToPropertiesMapper.java=yamasani@google.com diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 550c37af5db2..483fec67a429 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -219,6 +219,9 @@ final class PendingIntentRecord extends IIntentSender.Stub { } public void unregisterCancelListenerLocked(IResultReceiver receiver) { + if (mCancelCallbacks == null) { + return; // Already unregistered or detached. + } mCancelCallbacks.unregister(receiver); if (mCancelCallbacks.getRegisteredCallbackCount() <= 0) { mCancelCallbacks = null; diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index a20452bb5074..06a30780e9ea 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -22,8 +22,10 @@ import static android.app.ActivityManager.RECENT_WITH_EXCLUDED; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; @@ -550,7 +552,7 @@ class RecentTasks { continue; } - ComponentName cn = tr.intent.getComponent(); + ComponentName cn = tr.intent != null ? tr.intent.getComponent() : null; final boolean sameComponent = cn != null && cn.getPackageName().equals(packageName) && (filterByClasses == null || filterByClasses.contains(cn.getClassName())); if (sameComponent) { @@ -1255,7 +1257,8 @@ class RecentTasks { for (int i = 0; i < recentsCount; i++) { final TaskRecord tr = mTasks.get(i); if (task != tr) { - if (!task.hasCompatibleActivityType(tr) || task.userId != tr.userId) { + if (!hasCompatibleActivityTypeAndWindowingMode(task, tr) + || task.userId != tr.userId) { continue; } final Intent trIntent = tr.intent; @@ -1547,4 +1550,29 @@ class RecentTasks { return rti; } + + /** + * @return Whether the activity types and windowing modes of the two tasks are considered + * compatible. This is necessary because we currently don't persist the activity type + * or the windowing mode with the task, so they can be undefined when restored. + */ + private boolean hasCompatibleActivityTypeAndWindowingMode(TaskRecord t1, TaskRecord t2) { + final int activityType = t1.getActivityType(); + final int windowingMode = t1.getWindowingMode(); + final boolean isUndefinedType = activityType == ACTIVITY_TYPE_UNDEFINED; + final boolean isUndefinedMode = windowingMode == WINDOWING_MODE_UNDEFINED; + final int otherActivityType = t2.getActivityType(); + final int otherWindowingMode = t2.getWindowingMode(); + final boolean isOtherUndefinedType = otherActivityType == ACTIVITY_TYPE_UNDEFINED; + final boolean isOtherUndefinedMode = otherWindowingMode == WINDOWING_MODE_UNDEFINED; + + // An activity type and windowing mode is compatible if they are the exact same type/mode, + // or if one of the type/modes is undefined + final boolean isCompatibleType = activityType == otherActivityType + || isUndefinedType || isOtherUndefinedType; + final boolean isCompatibleMode = windowingMode == otherWindowingMode + || isUndefinedMode || isOtherUndefinedMode; + + return isCompatibleType && isCompatibleMode; + } } diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java index f2ed6a29e412..b5047aed8570 100644 --- a/services/core/java/com/android/server/am/RecentsAnimation.java +++ b/services/core/java/com/android/server/am/RecentsAnimation.java @@ -101,9 +101,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks { : ACTIVITY_TYPE_HOME; final ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); - ActivityRecord targetActivity = targetStack != null - ? targetStack.getTopActivity() - : null; + ActivityRecord targetActivity = getTargetActivity(targetStack, intent.getComponent()); final boolean hasExistingActivity = targetActivity != null; if (hasExistingActivity) { final ActivityDisplay display = targetActivity.getDisplay(); @@ -149,6 +147,14 @@ class RecentsAnimation implements RecentsAnimationCallbacks { display.moveStackBehindBottomMostVisibleStack(targetStack); if (DEBUG) Slog.d(TAG, "Moved stack=" + targetStack + " behind stack=" + display.getStackAbove(targetStack)); + + // If there are multiple tasks in the target stack (ie. the home stack, with 3p + // and default launchers coexisting), then move the task to the top as a part of + // moving the stack to the front + if (targetStack.topTask() != targetActivity.getTask()) { + targetStack.addTask(targetActivity.getTask(), true /* toTop */, + "startRecentsActivity"); + } } else { // No recents activity ActivityOptions options = ActivityOptions.makeBasic(); @@ -179,8 +185,9 @@ class RecentsAnimation implements RecentsAnimationCallbacks { targetActivity.mLaunchTaskBehind = true; // Fetch all the surface controls and pass them to the client to get the animation - // started - mWindowManager.cancelRecentsAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, + // started. Cancel any existing recents animation running synchronously (do not hold the + // WM lock) + mWindowManager.cancelRecentsAnimationSynchronously(REORDER_MOVE_TO_ORIGINAL_POSITION, "startRecentsActivity"); mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner, this, display.mDisplayId, mStackSupervisor.mRecentTasks.getRecentTaskIds()); @@ -200,12 +207,11 @@ class RecentsAnimation implements RecentsAnimationCallbacks { } } - @Override - public void onAnimationFinished(@RecentsAnimationController.ReorderMode int reorderMode) { + private void finishAnimation(@RecentsAnimationController.ReorderMode int reorderMode) { synchronized (mService) { if (DEBUG) Slog.d(TAG, "onAnimationFinished(): controller=" - + mWindowManager.getRecentsAnimationController() - + " reorderMode=" + reorderMode); + + mWindowManager.getRecentsAnimationController() + + " reorderMode=" + reorderMode); // Cancel the associated assistant data request if (mAssistDataRequester != null) { @@ -298,6 +304,16 @@ class RecentsAnimation implements RecentsAnimationCallbacks { } } + @Override + public void onAnimationFinished(@RecentsAnimationController.ReorderMode int reorderMode, + boolean runSychronously) { + if (runSychronously) { + finishAnimation(reorderMode); + } else { + mService.mHandler.post(() -> finishAnimation(reorderMode)); + } + } + /** * Called only when the animation should be canceled prior to starting. */ @@ -322,4 +338,22 @@ class RecentsAnimation implements RecentsAnimationCallbacks { } return null; } + + /** + * @return the top activity in the {@param targetStack} matching the {@param component}, or just + * the top activity of the top task if no task matches the component. + */ + private ActivityRecord getTargetActivity(ActivityStack targetStack, ComponentName component) { + if (targetStack == null) { + return null; + } + + for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { + final TaskRecord task = (TaskRecord) targetStack.getChildAt(i); + if (task.getBaseIntent().getComponent().equals(component)) { + return task.getTopActivity(); + } + } + return targetStack.getTopActivity(); + } } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 0e418ad4cb88..9a5b1a60219e 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -203,7 +203,8 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi String rootAffinity; // Initial base affinity, or null; does not change from initial root. final IVoiceInteractionSession voiceSession; // Voice interaction session driving task final IVoiceInteractor voiceInteractor; // Associated interactor to provide to app - Intent intent; // The original intent that started the task. + Intent intent; // The original intent that started the task. Note that this value can + // be null. Intent affinityIntent; // Intent of affinity-moved activity that started this task. int effectiveUid; // The current effective uid of the identity of this task. ComponentName origActivity; // The non-alias activity component of the intent. @@ -897,12 +898,12 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi // the real activity that will be launched not the alias, so we need to use an intent with // the component name pointing to the real activity not the alias in the activity record. intent.setComponent(r.realActivity); - return this.intent.filterEquals(intent); + return intent.filterEquals(this.intent); } boolean returnsToHomeStack() { final int returnHomeFlags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME; - return (intent.getFlags() & returnHomeFlags) == returnHomeFlags; + return intent != null && (intent.getFlags() & returnHomeFlags) == returnHomeFlags; } void setPrevAffiliate(TaskRecord prevAffiliate) { @@ -1819,7 +1820,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi final StackWindowController stackController = mStack.getWindowContainerController(); stackController.adjustConfigurationForBounds(bounds, insetBounds, mTmpNonDecorBounds, mTmpStableBounds, overrideWidth, overrideHeight, density, - config, parentConfig); + config, parentConfig, getWindowingMode()); } else { throw new IllegalArgumentException("Expected stack when calculating override config"); } @@ -2165,9 +2166,11 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi out.endTag(null, TAG_AFFINITYINTENT); } - out.startTag(null, TAG_INTENT); - intent.saveToXml(out); - out.endTag(null, TAG_INTENT); + if (intent != null) { + out.startTag(null, TAG_INTENT); + intent.saveToXml(out); + out.endTag(null, TAG_INTENT); + } final ArrayList<ActivityRecord> activities = mActivities; final int numActivities = activities.size(); diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index ff864536e9af..dc564ba69e0d 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -267,6 +267,7 @@ public final class PlaybackActivityMonitor public void releasePlayer(int piid, int binderUid) { if (DEBUG) { Log.v(TAG, "releasePlayer() for piid=" + piid); } + boolean change = false; synchronized(mPlayerLock) { final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid)); if (checkConfigurationCaller(piid, apc, binderUid)) { @@ -275,9 +276,12 @@ public final class PlaybackActivityMonitor mPlayers.remove(new Integer(piid)); mDuckingManager.removeReleased(apc); checkVolumeForPrivilegedAlarm(apc, AudioPlaybackConfiguration.PLAYER_STATE_RELEASED); - apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED); + change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED); } } + if (change) { + dispatchPlaybackChange(true /*iplayerreleased*/); + } } // Implementation of AudioPlaybackConfiguration.PlayerDeathMonitor diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index f74ac4709890..5db20b029105 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -621,7 +621,7 @@ public class ClipboardService extends SystemService { private boolean clipboardAccessAllowed(int op, String callingPackage, int callingUid) { // Check the AppOp. - if (mAppOps.checkOp(op, callingUid, callingPackage) != AppOpsManager.MODE_ALLOWED) { + if (mAppOps.noteOp(op, callingUid, callingPackage) != AppOpsManager.MODE_ALLOWED) { return false; } try { diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java index 37035c3a343c..030c91532135 100644 --- a/services/core/java/com/android/server/display/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/ColorDisplayService.java @@ -293,7 +293,7 @@ public final class ColorDisplayService extends SystemService mColorMatrixAnimator.cancel(); } - setCoefficientMatrix(getContext(), mode == ColorDisplayController.COLOR_MODE_SATURATED); + setCoefficientMatrix(getContext(), DisplayTransformManager.isColorModeNative(mode)); setMatrix(mController.getColorTemperature(), mMatrixNight); final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class); diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java index a94f049f7ef8..57d88e190720 100644 --- a/services/core/java/com/android/server/display/DisplayTransformManager.java +++ b/services/core/java/com/android/server/display/DisplayTransformManager.java @@ -60,14 +60,24 @@ public class DisplayTransformManager { private static final int SURFACE_FLINGER_TRANSACTION_DALTONIZER = 1014; private static final String PERSISTENT_PROPERTY_SATURATION = "persist.sys.sf.color_saturation"; - private static final String PERSISTENT_PROPERTY_NATIVE_MODE = "persist.sys.sf.native_mode"; + private static final String PERSISTENT_PROPERTY_DISPLAY_COLOR = "persist.sys.sf.native_mode"; + /** + * SurfaceFlinger global saturation factor. + */ private static final int SURFACE_FLINGER_TRANSACTION_SATURATION = 1022; - private static final int SURFACE_FLINGER_TRANSACTION_NATIVE_MODE = 1023; + /** + * SurfaceFlinger display color (managed, unmanaged, etc.). + */ + private static final int SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR = 1023; private static final float COLOR_SATURATION_NATURAL = 1.0f; private static final float COLOR_SATURATION_BOOSTED = 1.1f; + private static final int DISPLAY_COLOR_MANAGED = 0; + private static final int DISPLAY_COLOR_UNMANAGED = 1; + private static final int DISPLAY_COLOR_ENHANCED = 2; + /** * Map of level -> color transformation matrix. */ @@ -220,20 +230,37 @@ public class DisplayTransformManager { } } + /** + * Return true when colors are stretched from the working color space to the + * native color space. + */ public static boolean isNativeModeEnabled() { - return SystemProperties.getBoolean(PERSISTENT_PROPERTY_NATIVE_MODE, false); + return SystemProperties.getInt(PERSISTENT_PROPERTY_DISPLAY_COLOR, + DISPLAY_COLOR_MANAGED) != DISPLAY_COLOR_MANAGED; + } + + /** + * Return true when the specified colorMode stretches colors from the + * working color space to the native color space. + */ + public static boolean isColorModeNative(int colorMode) { + return !(colorMode == ColorDisplayController.COLOR_MODE_NATURAL || + colorMode == ColorDisplayController.COLOR_MODE_BOOSTED); } public boolean setColorMode(int colorMode, float[] nightDisplayMatrix) { if (colorMode == ColorDisplayController.COLOR_MODE_NATURAL) { applySaturation(COLOR_SATURATION_NATURAL); - setNativeMode(false); + setDisplayColor(DISPLAY_COLOR_MANAGED); } else if (colorMode == ColorDisplayController.COLOR_MODE_BOOSTED) { applySaturation(COLOR_SATURATION_BOOSTED); - setNativeMode(false); + setDisplayColor(DISPLAY_COLOR_MANAGED); } else if (colorMode == ColorDisplayController.COLOR_MODE_SATURATED) { applySaturation(COLOR_SATURATION_NATURAL); - setNativeMode(true); + setDisplayColor(DISPLAY_COLOR_UNMANAGED); + } else if (colorMode == ColorDisplayController.COLOR_MODE_AUTOMATIC) { + applySaturation(COLOR_SATURATION_NATURAL); + setDisplayColor(DISPLAY_COLOR_ENHANCED); } setColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY, nightDisplayMatrix); @@ -265,17 +292,17 @@ public class DisplayTransformManager { /** * Toggles native mode on/off in SurfaceFlinger. */ - private void setNativeMode(boolean enabled) { - SystemProperties.set(PERSISTENT_PROPERTY_NATIVE_MODE, enabled ? "1" : "0"); + private void setDisplayColor(int color) { + SystemProperties.set(PERSISTENT_PROPERTY_DISPLAY_COLOR, Integer.toString(color)); final IBinder flinger = ServiceManager.getService(SURFACE_FLINGER); if (flinger != null) { final Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); - data.writeInt(enabled ? 1 : 0); + data.writeInt(color); try { - flinger.transact(SURFACE_FLINGER_TRANSACTION_NATIVE_MODE, data, null, 0); + flinger.transact(SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR, data, null, 0); } catch (RemoteException ex) { - Log.e(TAG, "Failed to set native mode", ex); + Log.e(TAG, "Failed to set display color", ex); } finally { data.recycle(); } diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index ef40a1cb2def..c9f92d2534d9 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -619,6 +619,15 @@ public class FingerprintService extends SystemService implements IHwBinder.Death void startRemove(IBinder token, int fingerId, int groupId, int userId, IFingerprintServiceReceiver receiver, boolean restricted, boolean internal) { + if (token == null) { + Slog.w(TAG, "startRemove: token is null"); + return; + } + if (receiver == null) { + Slog.w(TAG, "startRemove: receiver is null"); + return; + } + IBiometricsFingerprint daemon = getFingerprintDaemon(); if (daemon == null) { Slog.w(TAG, "startRemove: no fingerprint HAL!"); diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java index fa48b5e974f6..04d579500df9 100644 --- a/services/core/java/com/android/server/job/controllers/TimeController.java +++ b/services/core/java/com/android/server/job/controllers/TimeController.java @@ -90,7 +90,10 @@ public final class TimeController extends StateController { return; } else if (job.hasTimingDelayConstraint() && evaluateTimingDelayConstraint(job, nowElapsedMillis)) { - return; + if (!job.hasDeadlineConstraint()) { + // If it doesn't have a deadline, we'll never have to touch it again. + return; + } } boolean isInsert = false; diff --git a/services/core/java/com/android/server/location/GnssBatchingProvider.java b/services/core/java/com/android/server/location/GnssBatchingProvider.java new file mode 100644 index 000000000000..f3918ee9e8ff --- /dev/null +++ b/services/core/java/com/android/server/location/GnssBatchingProvider.java @@ -0,0 +1,145 @@ +package com.android.server.location; + +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; + +/** + * Manages GNSS Batching operations. + * + * <p>This class is not thread safe (It's client's responsibility to make sure calls happen on + * the same thread). + */ +public class GnssBatchingProvider { + + private static final String TAG = "GnssBatchingProvider"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private final GnssBatchingProviderNative mNative; + private boolean mEnabled; + private boolean mStarted; + private long mPeriodNanos; + private boolean mWakeOnFifoFull; + + GnssBatchingProvider() { + this(new GnssBatchingProviderNative()); + } + + @VisibleForTesting + GnssBatchingProvider(GnssBatchingProviderNative gnssBatchingProviderNative) { + mNative = gnssBatchingProviderNative; + } + + /** + * Returns the GNSS batching size + */ + public int getBatchSize() { + return mNative.getBatchSize(); + } + + /** Enable GNSS batching. */ + public void enable() { + mEnabled = mNative.initBatching(); + if (!mEnabled) { + Log.e(TAG, "Failed to initialize GNSS batching"); + } + } + + /** + * Starts the hardware batching operation + */ + public boolean start(long periodNanos, boolean wakeOnFifoFull) { + if (!mEnabled) { + throw new IllegalStateException(); + } + if (periodNanos <= 0) { + Log.e(TAG, "Invalid periodNanos " + periodNanos + + " in batching request, not started"); + return false; + } + mStarted = mNative.startBatch(periodNanos, wakeOnFifoFull); + if (mStarted) { + mPeriodNanos = periodNanos; + mWakeOnFifoFull = wakeOnFifoFull; + } + return mStarted; + } + + /** + * Forces a flush of existing locations from the hardware batching + */ + public void flush() { + if (!mStarted) { + Log.w(TAG, "Cannot flush since GNSS batching has not started."); + return; + } + mNative.flushBatch(); + } + + /** + * Stops the batching operation + */ + public boolean stop() { + boolean stopped = mNative.stopBatch(); + if (stopped) { + mStarted = false; + } + return stopped; + } + + /** Disable GNSS batching. */ + public void disable() { + stop(); + mNative.cleanupBatching(); + mEnabled = false; + } + + // TODO(b/37460011): Use this with death recovery logic. + void resumeIfStarted() { + if (DEBUG) { + Log.d(TAG, "resumeIfStarted"); + } + if (mStarted) { + mNative.startBatch(mPeriodNanos, mWakeOnFifoFull); + } + } + + @VisibleForTesting + static class GnssBatchingProviderNative { + public int getBatchSize() { + return native_get_batch_size(); + } + + public boolean startBatch(long periodNanos, boolean wakeOnFifoFull) { + return native_start_batch(periodNanos, wakeOnFifoFull); + } + + public void flushBatch() { + native_flush_batch(); + } + + public boolean stopBatch() { + return native_stop_batch(); + } + + public boolean initBatching() { + return native_init_batching(); + } + + public void cleanupBatching() { + native_cleanup_batching(); + } + } + + private static native int native_get_batch_size(); + + private static native boolean native_start_batch(long periodNanos, boolean wakeOnFifoFull); + + private static native void native_flush_batch(); + + private static native boolean native_stop_batch(); + + private static native boolean native_init_batching(); + + private static native void native_cleanup_batching(); +} diff --git a/services/core/java/com/android/server/location/GnssGeofenceProvider.java b/services/core/java/com/android/server/location/GnssGeofenceProvider.java new file mode 100644 index 000000000000..6ac4aeb7f9ea --- /dev/null +++ b/services/core/java/com/android/server/location/GnssGeofenceProvider.java @@ -0,0 +1,188 @@ +package com.android.server.location; + +import android.location.IGpsGeofenceHardware; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.util.Log; +import android.util.SparseArray; + +import com.android.internal.annotations.VisibleForTesting; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +/** + * Manages GNSS Geofence operations. + */ +class GnssGeofenceProvider extends IGpsGeofenceHardware.Stub { + + private static final String TAG = "GnssGeofenceProvider"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + /** Holds the parameters of a geofence. */ + private static class GeofenceEntry { + public int geofenceId; + public double latitude; + public double longitude; + public double radius; + public int lastTransition; + public int monitorTransitions; + public int notificationResponsiveness; + public int unknownTimer; + public boolean paused; + } + + private final GnssGeofenceProviderNative mNative; + private final SparseArray<GeofenceEntry> mGeofenceEntries = new SparseArray<>(); + private final Handler mHandler; + + GnssGeofenceProvider(Looper looper) { + this(looper, new GnssGeofenceProviderNative()); + } + + @VisibleForTesting + GnssGeofenceProvider(Looper looper, GnssGeofenceProviderNative gnssGeofenceProviderNative) { + mHandler = new Handler(looper); + mNative = gnssGeofenceProviderNative; + } + + // TODO(b/37460011): use this method in HAL death recovery. + void resumeIfStarted() { + if (DEBUG) { + Log.d(TAG, "resumeIfStarted"); + } + mHandler.post(() -> { + for (int i = 0; i < mGeofenceEntries.size(); i++) { + GeofenceEntry entry = mGeofenceEntries.valueAt(i); + boolean added = mNative.addGeofence(entry.geofenceId, entry.latitude, + entry.longitude, + entry.radius, + entry.lastTransition, entry.monitorTransitions, + entry.notificationResponsiveness, entry.unknownTimer); + if (added && entry.paused) { + mNative.pauseGeofence(entry.geofenceId); + } + } + }); + } + + private boolean runOnHandlerThread(Callable<Boolean> callable) { + FutureTask<Boolean> futureTask = new FutureTask<>(callable); + mHandler.post(futureTask); + try { + return futureTask.get(); + } catch (InterruptedException | ExecutionException e) { + Log.e(TAG, "Failed running callable.", e); + } + return false; + } + + @Override + public boolean isHardwareGeofenceSupported() { + return runOnHandlerThread(mNative::isGeofenceSupported); + } + + @Override + public boolean addCircularHardwareGeofence(int geofenceId, double latitude, + double longitude, double radius, int lastTransition, int monitorTransitions, + int notificationResponsiveness, int unknownTimer) { + return runOnHandlerThread(() -> { + boolean added = mNative.addGeofence(geofenceId, latitude, longitude, radius, + lastTransition, monitorTransitions, notificationResponsiveness, + unknownTimer); + if (added) { + GeofenceEntry entry = new GeofenceEntry(); + entry.geofenceId = geofenceId; + entry.latitude = latitude; + entry.longitude = longitude; + entry.radius = radius; + entry.lastTransition = lastTransition; + entry.monitorTransitions = monitorTransitions; + entry.notificationResponsiveness = notificationResponsiveness; + entry.unknownTimer = unknownTimer; + mGeofenceEntries.put(geofenceId, entry); + } + return added; + }); + } + + @Override + public boolean removeHardwareGeofence(int geofenceId) { + return runOnHandlerThread(() -> { + boolean removed = mNative.removeGeofence(geofenceId); + if (removed) { + mGeofenceEntries.remove(geofenceId); + } + return removed; + }); + } + + @Override + public boolean pauseHardwareGeofence(int geofenceId) { + return runOnHandlerThread(() -> { + boolean paused = mNative.pauseGeofence(geofenceId); + if (paused) { + GeofenceEntry entry = mGeofenceEntries.get(geofenceId); + if (entry != null) { + entry.paused = true; + } + } + return paused; + }); + } + + @Override + public boolean resumeHardwareGeofence(int geofenceId, int monitorTransitions) { + return runOnHandlerThread(() -> { + boolean resumed = mNative.resumeGeofence(geofenceId, monitorTransitions); + if (resumed) { + GeofenceEntry entry = mGeofenceEntries.get(geofenceId); + if (entry != null) { + entry.paused = false; + entry.monitorTransitions = monitorTransitions; + } + } + return resumed; + }); + } + + @VisibleForTesting + static class GnssGeofenceProviderNative { + public boolean isGeofenceSupported() { + return native_is_geofence_supported(); + } + + public boolean addGeofence(int geofenceId, double latitude, double longitude, double radius, + int lastTransition, int monitorTransitions, int notificationResponsiveness, + int unknownTimer) { + return native_add_geofence(geofenceId, latitude, longitude, radius, lastTransition, + monitorTransitions, notificationResponsiveness, unknownTimer); + } + + public boolean removeGeofence(int geofenceId) { + return native_remove_geofence(geofenceId); + } + + public boolean resumeGeofence(int geofenceId, int transitions) { + return native_resume_geofence(geofenceId, transitions); + } + + public boolean pauseGeofence(int geofenceId) { + return native_pause_geofence(geofenceId); + } + } + + private static native boolean native_is_geofence_supported(); + + private static native boolean native_add_geofence(int geofenceId, double latitude, + double longitude, double radius, int lastTransition, int monitorTransitions, + int notificationResponsivenes, int unknownTimer); + + private static native boolean native_remove_geofence(int geofenceId); + + private static native boolean native_resume_geofence(int geofenceId, int transitions); + + private static native boolean native_pause_geofence(int geofenceId); +} diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index a8082986614c..64750b00368b 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -418,6 +418,8 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt private final LocationChangeListener mNetworkLocationListener = new NetworkLocationListener(); private final LocationChangeListener mFusedLocationListener = new FusedLocationListener(); private final NtpTimeHelper mNtpTimeHelper; + private final GnssBatchingProvider mGnssBatchingProvider; + private final GnssGeofenceProvider mGnssGeofenceProvider; // Handler for processing events private Handler mHandler; @@ -492,7 +494,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } public IGpsGeofenceHardware getGpsGeofenceProxy() { - return mGpsGeofenceBinder; + return mGnssGeofenceProvider; } public GnssMeasurementsProvider getGnssMeasurementsProvider() { @@ -816,37 +818,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } }; - mGnssMeasurementsProvider = new GnssMeasurementsProvider(mHandler) { - @Override - public boolean isAvailableInPlatform() { - return native_is_measurement_supported(); - } - - @Override - protected int registerWithService() { - int devOptions = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Global.DEVELOPMENT_SETTINGS_ENABLED , 0); - int fullTrackingToggled = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING , 0); - boolean result = false; - if (devOptions == 1 /* Developer Mode enabled */ - && fullTrackingToggled == 1 /* Raw Measurements Full Tracking enabled */) { - result = native_start_measurement_collection(true /* enableFullTracking */); - } else { - result = native_start_measurement_collection(false /* enableFullTracking */); - } - if (result) { - return RemoteListenerHelper.RESULT_SUCCESS; - } else { - return RemoteListenerHelper.RESULT_INTERNAL_ERROR; - } - } - - @Override - protected void unregisterFromService() { - native_stop_measurement_collection(); - } - + mGnssMeasurementsProvider = new GnssMeasurementsProvider(mContext, mHandler) { @Override protected boolean isGpsEnabled() { return isEnabled(); @@ -855,26 +827,6 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(mHandler) { @Override - protected boolean isAvailableInPlatform() { - return native_is_navigation_message_supported(); - } - - @Override - protected int registerWithService() { - boolean result = native_start_navigation_message_collection(); - if (result) { - return RemoteListenerHelper.RESULT_SUCCESS; - } else { - return RemoteListenerHelper.RESULT_INTERNAL_ERROR; - } - } - - @Override - protected void unregisterFromService() { - native_stop_navigation_message_collection(); - } - - @Override protected boolean isGpsEnabled() { return isEnabled(); } @@ -885,6 +837,8 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt mGnssSatelliteBlacklistHelper = new GnssSatelliteBlacklistHelper(mContext, looper, this); mHandler.post(mGnssSatelliteBlacklistHelper::updateSatelliteBlacklist); + mGnssBatchingProvider = new GnssBatchingProvider(); + mGnssGeofenceProvider = new GnssGeofenceProvider(looper); } /** @@ -1028,7 +982,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt Log.e(TAG, "Invalid status to release SUPL connection: " + agpsDataConnStatus); } } - + private void handleRequestLocation(boolean independentFromGnss) { if (isRequestLocationRateLimited()) { if (DEBUG) { @@ -1061,6 +1015,12 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt locationListener = mFusedLocationListener; } + if (!locationManager.isProviderEnabled(provider)) { + Log.w(TAG, "Unable to request location since " + provider + + " provider does not exist or is not enabled."); + return; + } + Log.i(TAG, String.format( "GNSS HAL Requesting location updates from %s provider for %d millis.", @@ -1267,7 +1227,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt mGnssMeasurementsProvider.onGpsEnabledChanged(); mGnssNavigationMessageProvider.onGpsEnabledChanged(); - enableBatching(); + mGnssBatchingProvider.enable(); } else { synchronized (mLock) { mEnabled = false; @@ -1299,7 +1259,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt mAlarmManager.cancel(mWakeupIntent); mAlarmManager.cancel(mTimeoutIntent); - disableBatching(); + mGnssBatchingProvider.disable(); // do this before releasing wakelock native_cleanup(); @@ -1493,31 +1453,6 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } } - private IGpsGeofenceHardware mGpsGeofenceBinder = new IGpsGeofenceHardware.Stub() { - public boolean isHardwareGeofenceSupported() { - return native_is_geofence_supported(); - } - - public boolean addCircularHardwareGeofence(int geofenceId, double latitude, - double longitude, double radius, int lastTransition, int monitorTransitions, - int notificationResponsiveness, int unknownTimer) { - return native_add_geofence(geofenceId, latitude, longitude, radius, - lastTransition, monitorTransitions, notificationResponsiveness, unknownTimer); - } - - public boolean removeHardwareGeofence(int geofenceId) { - return native_remove_geofence(geofenceId); - } - - public boolean pauseHardwareGeofence(int geofenceId) { - return native_pause_geofence(geofenceId); - } - - public boolean resumeHardwareGeofence(int geofenceId, int monitorTransition) { - return native_resume_geofence(geofenceId, monitorTransition); - } - }; - private boolean deleteAidingData(Bundle extras) { int flags; @@ -2001,58 +1936,11 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt }; } - public interface GnssBatchingProvider { - /** - * Returns the GNSS batching size - */ - int getSize(); - - /** - * Starts the hardware batching operation - */ - boolean start(long periodNanos, boolean wakeOnFifoFull); - - /** - * Forces a flush of existing locations from the hardware batching - */ - void flush(); - - /** - * Stops the batching operation - */ - boolean stop(); - } - /** * @hide */ public GnssBatchingProvider getGnssBatchingProvider() { - return new GnssBatchingProvider() { - @Override - public int getSize() { - return native_get_batch_size(); - } - - @Override - public boolean start(long periodNanos, boolean wakeOnFifoFull) { - if (periodNanos <= 0) { - Log.e(TAG, "Invalid periodNanos " + periodNanos + - "in batching request, not started"); - return false; - } - return native_start_batch(periodNanos, wakeOnFifoFull); - } - - @Override - public void flush() { - native_flush_batch(); - } - - @Override - public boolean stop() { - return native_stop_batch(); - } - }; + return mGnssBatchingProvider; } public interface GnssMetricsProvider { @@ -2075,23 +1963,6 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } /** - * Initialize Batching if enabled - */ - private void enableBatching() { - if (!native_init_batching()) { - Log.e(TAG, "Failed to initialize GNSS batching"); - } - } - - /** - * Disable batching - */ - private void disableBatching() { - native_stop_batch(); - native_cleanup_batching(); - } - - /** * called from native code - GNSS location batch callback */ private void reportLocationBatch(Location[] locationArray) { @@ -2869,33 +2740,6 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt private native void native_update_network_state(boolean connected, int type, boolean roaming, boolean available, String extraInfo, String defaultAPN); - // Hardware Geofence support. - private static native boolean native_is_geofence_supported(); - - private static native boolean native_add_geofence(int geofenceId, double latitude, - double longitude, double radius, int lastTransition, int monitorTransitions, - int notificationResponsivenes, int unknownTimer); - - private static native boolean native_remove_geofence(int geofenceId); - - private static native boolean native_resume_geofence(int geofenceId, int transitions); - - private static native boolean native_pause_geofence(int geofenceId); - - // Gps Hal measurements support. - private static native boolean native_is_measurement_supported(); - - private native boolean native_start_measurement_collection(boolean enableFullTracking); - - private native boolean native_stop_measurement_collection(); - - // Gps Navigation message support. - private static native boolean native_is_navigation_message_supported(); - - private native boolean native_start_navigation_message_collection(); - - private native boolean native_stop_navigation_message_collection(); - // GNSS Configuration private static native boolean native_set_supl_version(int version); @@ -2912,19 +2756,5 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt private static native boolean native_set_emergency_supl_pdn(int emergencySuplPdn); private static native boolean native_set_satellite_blacklist(int[] constellations, int[] svIds); - - // GNSS Batching - private static native int native_get_batch_size(); - - private static native boolean native_start_batch(long periodNanos, boolean wakeOnFifoFull); - - private static native void native_flush_batch(); - - private static native boolean native_stop_batch(); - - private static native boolean native_init_batching(); - - private static native void native_cleanup_batching(); - } diff --git a/services/core/java/com/android/server/location/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/GnssMeasurementsProvider.java index 477dae65c651..0add86315487 100644 --- a/services/core/java/com/android/server/location/GnssMeasurementsProvider.java +++ b/services/core/java/com/android/server/location/GnssMeasurementsProvider.java @@ -16,12 +16,16 @@ package com.android.server.location; +import android.content.Context; import android.location.GnssMeasurementsEvent; import android.location.IGnssMeasurementsListener; import android.os.Handler; import android.os.RemoteException; +import android.provider.Settings; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; + /** * An base implementation for GPS measurements provider. * It abstracts out the responsibility of handling listeners, while still allowing technology @@ -29,22 +33,73 @@ import android.util.Log; * * @hide */ -public abstract class GnssMeasurementsProvider - extends RemoteListenerHelper<IGnssMeasurementsListener> { +public abstract class GnssMeasurementsProvider extends + RemoteListenerHelper<IGnssMeasurementsListener> { private static final String TAG = "GnssMeasurementsProvider"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private final Context mContext; + private final GnssMeasurementProviderNative mNative; + + private boolean mIsCollectionStarted; + private boolean mEnableFullTracking; + + protected GnssMeasurementsProvider(Context context, Handler handler) { + this(context, handler, new GnssMeasurementProviderNative()); + } - protected GnssMeasurementsProvider(Handler handler) { + @VisibleForTesting + GnssMeasurementsProvider(Context context, Handler handler, + GnssMeasurementProviderNative aNative) { super(handler, TAG); + mContext = context; + mNative = aNative; + } + + // TODO(b/37460011): Use this with death recovery logic. + void resumeIfStarted() { + if (DEBUG) { + Log.d(TAG, "resumeIfStarted"); + } + if (mIsCollectionStarted) { + mNative.startMeasurementCollection(mEnableFullTracking); + } + } + + @Override + public boolean isAvailableInPlatform() { + return mNative.isMeasurementSupported(); + } + + @Override + protected int registerWithService() { + int devOptions = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); + int fullTrackingToggled = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, 0); + boolean enableFullTracking = (devOptions == 1 /* Developer Mode enabled */) + && (fullTrackingToggled == 1 /* Raw Measurements Full Tracking enabled */); + boolean result = mNative.startMeasurementCollection(enableFullTracking); + if (result) { + mIsCollectionStarted = true; + mEnableFullTracking = enableFullTracking; + return RemoteListenerHelper.RESULT_SUCCESS; + } else { + return RemoteListenerHelper.RESULT_INTERNAL_ERROR; + } + } + + @Override + protected void unregisterFromService() { + boolean stopped = mNative.stopMeasurementCollection(); + if (stopped) { + mIsCollectionStarted = false; + } } public void onMeasurementsAvailable(final GnssMeasurementsEvent event) { ListenerOperation<IGnssMeasurementsListener> operation = - new ListenerOperation<IGnssMeasurementsListener>() { - @Override - public void execute(IGnssMeasurementsListener listener) throws RemoteException { - listener.onGnssMeasurementsReceived(event); - } - }; + listener -> listener.onGnssMeasurementsReceived(event); foreach(operation); } @@ -98,4 +153,25 @@ public abstract class GnssMeasurementsProvider listener.onStatusChanged(mStatus); } } + + @VisibleForTesting + static class GnssMeasurementProviderNative { + public boolean isMeasurementSupported() { + return native_is_measurement_supported(); + } + + public boolean startMeasurementCollection(boolean enableFullTracking) { + return native_start_measurement_collection(enableFullTracking); + } + + public boolean stopMeasurementCollection() { + return native_stop_measurement_collection(); + } + } + + private static native boolean native_is_measurement_supported(); + + private static native boolean native_start_measurement_collection(boolean enableFullTracking); + + private static native boolean native_stop_measurement_collection(); } diff --git a/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java b/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java index df3c49bd2ed5..1b4fd187051a 100644 --- a/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java +++ b/services/core/java/com/android/server/location/GnssNavigationMessageProvider.java @@ -22,6 +22,8 @@ import android.os.Handler; import android.os.RemoteException; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; + /** * An base implementation for GPS navigation messages provider. * It abstracts out the responsibility of handling listeners, while still allowing technology @@ -32,9 +34,53 @@ import android.util.Log; public abstract class GnssNavigationMessageProvider extends RemoteListenerHelper<IGnssNavigationMessageListener> { private static final String TAG = "GnssNavigationMessageProvider"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private final GnssNavigationMessageProviderNative mNative; + private boolean mCollectionStarted; protected GnssNavigationMessageProvider(Handler handler) { + this(handler, new GnssNavigationMessageProviderNative()); + } + + @VisibleForTesting + GnssNavigationMessageProvider(Handler handler, GnssNavigationMessageProviderNative aNative) { super(handler, TAG); + mNative = aNative; + } + + // TODO(b/37460011): Use this with death recovery logic. + void resumeIfStarted() { + if (DEBUG) { + Log.d(TAG, "resumeIfStarted"); + } + if (mCollectionStarted) { + mNative.startNavigationMessageCollection(); + } + } + + @Override + protected boolean isAvailableInPlatform() { + return mNative.isNavigationMessageSupported(); + } + + @Override + protected int registerWithService() { + boolean result = mNative.startNavigationMessageCollection(); + if (result) { + mCollectionStarted = true; + return RemoteListenerHelper.RESULT_SUCCESS; + } else { + return RemoteListenerHelper.RESULT_INTERNAL_ERROR; + } + } + + @Override + protected void unregisterFromService() { + boolean stopped = mNative.stopNavigationMessageCollection(); + if (stopped) { + mCollectionStarted = false; + } } public void onNavigationMessageAvailable(final GnssNavigationMessage event) { @@ -96,4 +142,25 @@ public abstract class GnssNavigationMessageProvider listener.onStatusChanged(mStatus); } } + + @VisibleForTesting + static class GnssNavigationMessageProviderNative { + public boolean isNavigationMessageSupported() { + return native_is_navigation_message_supported(); + } + + public boolean startNavigationMessageCollection() { + return native_start_navigation_message_collection(); + } + + public boolean stopNavigationMessageCollection() { + return native_stop_navigation_message_collection(); + } + } + + private static native boolean native_is_navigation_message_supported(); + + private static native boolean native_start_navigation_message_collection(); + + private static native boolean native_stop_navigation_message_collection(); } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index f1fd00b4ea2a..1078f6eefa76 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -1742,7 +1742,8 @@ public class LockSettingsService extends ILockSettings.Stub { if (storedHash.type == LockPatternUtils.CREDENTIAL_TYPE_PATTERN) { hash = LockPatternUtils.patternToHash(LockPatternUtils.stringToPattern(credential)); } else { - hash = mLockPatternUtils.passwordToHash(credential, userId); + hash = mLockPatternUtils.legacyPasswordToHash(credential, userId) + .getBytes(StandardCharsets.UTF_8); } if (Arrays.equals(hash, storedHash.hash)) { if (storedHash.type == LockPatternUtils.CREDENTIAL_TYPE_PATTERN) { @@ -2532,6 +2533,33 @@ public class LockSettingsService extends ILockSettings.Stub { mRecoverableKeyStoreManager.lockScreenSecretChanged(credentialType, credential, userId); } + /** + * Returns a fixed pseudorandom byte string derived from the user's synthetic password. + * This is used to salt the password history hash to protect the hash against offline + * bruteforcing, since rederiving this value requires a successful authentication. + */ + @Override + public byte[] getHashFactor(String currentCredential, int userId) throws RemoteException { + checkPasswordReadPermission(userId); + if (TextUtils.isEmpty(currentCredential)) { + currentCredential = null; + } + synchronized (mSpManager) { + if (!isSyntheticPasswordBasedCredentialLocked(userId)) { + Slog.w(TAG, "Synthetic password not enabled"); + return null; + } + long handle = getSyntheticPasswordHandleLocked(userId); + AuthenticationResult auth = mSpManager.unwrapPasswordBasedSyntheticPassword( + getGateKeeperService(), handle, currentCredential, userId, null); + if (auth.authToken == null) { + Slog.w(TAG, "Current credential is incorrect"); + return null; + } + return auth.authToken.derivePasswordHashFactor(); + } + } + private long addEscrowToken(byte[] token, int userId) throws RemoteException { if (DEBUG) Slog.d(TAG, "addEscrowToken: user=" + userId); synchronized (mSpManager) { diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index 0700ab35df1b..596daeb1427b 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -123,6 +123,7 @@ public class SyntheticPasswordManager { private static final byte[] PERSONALIZATION_FBE_KEY = "fbe-key".getBytes(); private static final byte[] PERSONALIZATION_AUTHSECRET_KEY = "authsecret-hal".getBytes(); private static final byte[] PERSONALIZATION_SP_SPLIT = "sp-split".getBytes(); + private static final byte[] PERSONALIZATION_PASSWORD_HASH = "pw-hash".getBytes(); private static final byte[] PERSONALIZATION_E0 = "e0-encryption".getBytes(); private static final byte[] PERSONALISATION_WEAVER_PASSWORD = "weaver-pwd".getBytes(); private static final byte[] PERSONALISATION_WEAVER_KEY = "weaver-key".getBytes(); @@ -165,6 +166,11 @@ public class SyntheticPasswordManager { syntheticPassword.getBytes()); } + public byte[] derivePasswordHashFactor() { + return SyntheticPasswordCrypto.personalisedHash(PERSONALIZATION_PASSWORD_HASH, + syntheticPassword.getBytes()); + } + private void initialize(byte[] P0, byte[] P1) { this.P1 = P1; this.syntheticPassword = String.valueOf(HexEncoding.encode( diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 269a0dac41ab..f7becd518861 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -72,6 +72,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * Manages the lifecycle of application-provided services bound by system server. @@ -336,7 +338,7 @@ abstract public class ManagedServices { loadAllowedComponentsFromSettings(); } - public void readXml(XmlPullParser parser) + public void readXml(XmlPullParser parser, Predicate<String> allowedManagedServicePackages) throws XmlPullParserException, IOException { // upgrade xml int xmlVersion = XmlUtils.readIntAttribute(parser, ATT_VERSION, 0); @@ -361,10 +363,14 @@ abstract public class ManagedServices { final int userId = XmlUtils.readIntAttribute(parser, ATT_USER_ID, 0); final boolean isPrimary = XmlUtils.readBooleanAttribute(parser, ATT_IS_PRIMARY, true); - if (mUm.getUserInfo(userId) != null) { - addApprovedList(approved, userId, isPrimary); + + if (allowedManagedServicePackages == null || + allowedManagedServicePackages.test(getPackageName(approved))) { + if (mUm.getUserInfo(userId) != null) { + addApprovedList(approved, userId, isPrimary); + } + mUseXml = true; } - mUseXml = true; } } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 594886458b6e..ec3949f9a441 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -233,6 +233,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; /** {@hide} */ public class NotificationManagerService extends SystemService { @@ -397,6 +398,7 @@ public class NotificationManagerService extends SystemService { private boolean mIsTelevision; private MetricsLogger mMetricsLogger; + private Predicate<String> mAllowedManagedServicePackages; private static class Archive { final int mBufferSize; @@ -518,18 +520,15 @@ public class NotificationManagerService extends SystemService { } else if (RankingHelper.TAG_RANKING.equals(parser.getName())){ mRankingHelper.readXml(parser, forRestore); } - // No non-system managed services are allowed on low ram devices - if (canUseManagedServices()) { - if (mListeners.getConfig().xmlTag.equals(parser.getName())) { - mListeners.readXml(parser); - migratedManagedServices = true; - } else if (mAssistants.getConfig().xmlTag.equals(parser.getName())) { - mAssistants.readXml(parser); - migratedManagedServices = true; - } else if (mConditionProviders.getConfig().xmlTag.equals(parser.getName())) { - mConditionProviders.readXml(parser); - migratedManagedServices = true; - } + if (mListeners.getConfig().xmlTag.equals(parser.getName())) { + mListeners.readXml(parser, mAllowedManagedServicePackages); + migratedManagedServices = true; + } else if (mAssistants.getConfig().xmlTag.equals(parser.getName())) { + mAssistants.readXml(parser, mAllowedManagedServicePackages); + migratedManagedServices = true; + } else if (mConditionProviders.getConfig().xmlTag.equals(parser.getName())) { + mConditionProviders.readXml(parser, mAllowedManagedServicePackages); + migratedManagedServices = true; } } @@ -1429,6 +1428,9 @@ public class NotificationManagerService extends SystemService { // This is a MangedServices object that keeps track of the assistant. mAssistants = notificationAssistants; + // Needs to be set before loadPolicyFile + mAllowedManagedServicePackages = this::canUseManagedServices; + mPolicyFile = policyFile; loadPolicyFile(); @@ -3218,7 +3220,7 @@ public class NotificationManagerService extends SystemService { checkCallerIsSystemOrShell(); final long identity = Binder.clearCallingIdentity(); try { - if (canUseManagedServices()) { + if (mAllowedManagedServicePackages.test(pkg)) { mConditionProviders.setPackageOrComponentEnabled( pkg, userId, true, granted); @@ -3349,7 +3351,7 @@ public class NotificationManagerService extends SystemService { checkCallerIsSystemOrShell(); final long identity = Binder.clearCallingIdentity(); try { - if (canUseManagedServices()) { + if (mAllowedManagedServicePackages.test(listener.getPackageName())) { mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(), userId, false, granted); mListeners.setPackageOrComponentEnabled(listener.flattenToString(), @@ -3375,7 +3377,7 @@ public class NotificationManagerService extends SystemService { checkCallerIsSystemOrShell(); final long identity = Binder.clearCallingIdentity(); try { - if (canUseManagedServices()) { + if (mAllowedManagedServicePackages.test(assistant.getPackageName())) { mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(), userId, false, granted); mAssistants.setPackageOrComponentEnabled(assistant.flattenToString(), @@ -6183,9 +6185,19 @@ public class NotificationManagerService extends SystemService { } } - private boolean canUseManagedServices() { - return !mActivityManager.isLowRamDevice() + @VisibleForTesting + boolean canUseManagedServices(String pkg) { + boolean canUseManagedServices = !mActivityManager.isLowRamDevice() || mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_WATCH); + + for (String whitelisted : getContext().getResources().getStringArray( + R.array.config_allowedManagedServicesOnLowRamDevices)) { + if (whitelisted.equals(pkg)) { + canUseManagedServices = true; + } + } + + return canUseManagedServices; } private class TrimCache { diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index fd51be577308..3b8a994c4e87 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -694,25 +694,32 @@ public final class OverlayManagerService extends SystemService { private final class OverlayChangeListener implements OverlayManagerServiceImpl.OverlayChangeListener { @Override - public void onOverlaysChanged(@NonNull final String targetPackageName, final int userId) { + public void onChanged(@NonNull final String targetPackageName, final int userId, + boolean targetChanged, boolean overlayChanged) { schedulePersistSettings(); FgThread.getHandler().post(() -> { - updateAssets(userId, targetPackageName); + // Update the targets' overlays if a change to the target or an overlay occurs + if (targetChanged || overlayChanged) { + updateAssets(userId, targetPackageName); + } - final Intent intent = new Intent(Intent.ACTION_OVERLAY_CHANGED, - Uri.fromParts("package", targetPackageName, null)); - intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + // Create the broadcast if the overlay changes + if (overlayChanged) { + final Intent intent = new Intent(Intent.ACTION_OVERLAY_CHANGED, + Uri.fromParts("package", targetPackageName, null)); + intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - if (DEBUG) { - Slog.d(TAG, "send broadcast " + intent); - } + if (DEBUG) { + Slog.d(TAG, "send broadcast " + intent); + } - try { - ActivityManager.getService().broadcastIntent(null, intent, null, null, 0, - null, null, null, android.app.AppOpsManager.OP_NONE, null, false, false, - userId); - } catch (RemoteException e) { - // Intentionally left empty. + try { + ActivityManager.getService().broadcastIntent(null, intent, null, null, 0, + null, null, null, android.app.AppOpsManager.OP_NONE, null, false, + false, userId); + } catch (RemoteException e) { + // Intentionally left empty. + } } }); } diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 74eb2ea25e49..a487ae970821 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -207,9 +207,7 @@ final class OverlayManagerServiceImpl { Slog.d(TAG, "onTargetPackageAdded packageName=" + packageName + " userId=" + userId); } - if (updateAllOverlaysForTarget(packageName, userId, 0)) { - mListener.onOverlaysChanged(packageName, userId); - } + updateAllOverlaysForTarget(packageName, userId, 0); } void onTargetPackageChanged(@NonNull final String packageName, final int userId) { @@ -217,9 +215,7 @@ final class OverlayManagerServiceImpl { Slog.d(TAG, "onTargetPackageChanged packageName=" + packageName + " userId=" + userId); } - if (updateAllOverlaysForTarget(packageName, userId, 0)) { - mListener.onOverlaysChanged(packageName, userId); - } + updateAllOverlaysForTarget(packageName, userId, 0); } void onTargetPackageUpgrading(@NonNull final String packageName, final int userId) { @@ -228,9 +224,7 @@ final class OverlayManagerServiceImpl { + userId); } - if (updateAllOverlaysForTarget(packageName, userId, FLAG_TARGET_IS_UPGRADING)) { - mListener.onOverlaysChanged(packageName, userId); - } + updateAllOverlaysForTarget(packageName, userId, FLAG_TARGET_IS_UPGRADING); } void onTargetPackageUpgraded(@NonNull final String packageName, final int userId) { @@ -238,9 +232,7 @@ final class OverlayManagerServiceImpl { Slog.d(TAG, "onTargetPackageUpgraded packageName=" + packageName + " userId=" + userId); } - if (updateAllOverlaysForTarget(packageName, userId, 0)) { - mListener.onOverlaysChanged(packageName, userId); - } + updateAllOverlaysForTarget(packageName, userId, 0); } void onTargetPackageRemoved(@NonNull final String packageName, final int userId) { @@ -248,17 +240,17 @@ final class OverlayManagerServiceImpl { Slog.d(TAG, "onTargetPackageRemoved packageName=" + packageName + " userId=" + userId); } - if (updateAllOverlaysForTarget(packageName, userId, 0)) { - mListener.onOverlaysChanged(packageName, userId); - } + updateAllOverlaysForTarget(packageName, userId, 0); } /** - * Returns true if the settings were modified for this target. + * Calls OverlayChangeListener#onChanged if the settings for the overlay target were modified, + * and calls OverlayChangeListener#onTargetChanged to signal a change in the target package that + * requires updating target overlays. */ - private boolean updateAllOverlaysForTarget(@NonNull final String targetPackageName, + private void updateAllOverlaysForTarget(@NonNull final String targetPackageName, final int userId, final int flags) { - boolean modified = false; + boolean overlayModified = false; final List<OverlayInfo> ois = mSettings.getOverlaysForTarget(targetPackageName, userId); final int N = ois.size(); for (int i = 0; i < N; i++) { @@ -266,18 +258,19 @@ final class OverlayManagerServiceImpl { final PackageInfo overlayPackage = mPackageManager.getPackageInfo(oi.packageName, userId); if (overlayPackage == null) { - modified |= mSettings.remove(oi.packageName, oi.userId); + overlayModified |= mSettings.remove(oi.packageName, oi.userId); removeIdmapIfPossible(oi); } else { try { - modified |= updateState(targetPackageName, oi.packageName, userId, flags); + overlayModified |= updateState(targetPackageName, oi.packageName, userId, flags); } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to update settings", e); - modified |= mSettings.remove(oi.packageName, userId); + overlayModified |= mSettings.remove(oi.packageName, userId); } } } - return modified; + + mListener.onChanged(targetPackageName, userId, /* targetChanged */ true, overlayModified); } void onOverlayPackageAdded(@NonNull final String packageName, final int userId) { @@ -298,7 +291,8 @@ final class OverlayManagerServiceImpl { overlayPackage.overlayCategory); try { if (updateState(overlayPackage.overlayTarget, packageName, userId, 0)) { - mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId); + mListener.onChanged(overlayPackage.overlayTarget, userId, + /* targetChanged */ false, /* overlayChanged */ true); } } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to update settings", e); @@ -314,7 +308,8 @@ final class OverlayManagerServiceImpl { try { final OverlayInfo oi = mSettings.getOverlayInfo(packageName, userId); if (updateState(oi.targetPackageName, packageName, userId, 0)) { - mListener.onOverlaysChanged(oi.targetPackageName, userId); + mListener.onChanged(oi.targetPackageName, userId, + /* targetChanged */ false, /* overlayChanged */ true); } } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to update settings", e); @@ -331,7 +326,8 @@ final class OverlayManagerServiceImpl { final OverlayInfo oi = mSettings.getOverlayInfo(packageName, userId); if (updateState(oi.targetPackageName, packageName, userId, FLAG_OVERLAY_IS_UPGRADING)) { removeIdmapIfPossible(oi); - mListener.onOverlaysChanged(oi.targetPackageName, userId); + mListener.onChanged(oi.targetPackageName, userId, + /* targetChanged */ false, /* overlayChanged */ true); } } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to update settings", e); @@ -365,7 +361,8 @@ final class OverlayManagerServiceImpl { } if (updateState(pkg.overlayTarget, packageName, userId, 0)) { - mListener.onOverlaysChanged(pkg.overlayTarget, userId); + mListener.onChanged(pkg.overlayTarget, userId, + /* targetChanged */ false, /* overlayChanged */ true); } } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to update settings", e); @@ -379,7 +376,8 @@ final class OverlayManagerServiceImpl { removeIdmapIfPossible(overlayInfo); if (overlayInfo.isEnabled()) { // Only trigger updates if the overlay was enabled. - mListener.onOverlaysChanged(overlayInfo.targetPackageName, userId); + mListener.onChanged(overlayInfo.targetPackageName, userId, + /* targetChanged */ false, /* overlayChanged */ true); } } } catch (OverlayManagerSettings.BadKeyException e) { @@ -427,7 +425,8 @@ final class OverlayManagerServiceImpl { modified |= updateState(oi.targetPackageName, oi.packageName, userId, 0); if (modified) { - mListener.onOverlaysChanged(oi.targetPackageName, userId); + mListener.onChanged(oi.targetPackageName, userId, + /* targetChanged */ false, /* overlayChanged */ true); } return true; } catch (OverlayManagerSettings.BadKeyException e) { @@ -486,7 +485,8 @@ final class OverlayManagerServiceImpl { modified |= updateState(targetPackageName, packageName, userId, 0); if (modified) { - mListener.onOverlaysChanged(targetPackageName, userId); + mListener.onChanged(targetPackageName, userId, + /* targetChanged */ false, /* overlayChanged */ true); } return true; } catch (OverlayManagerSettings.BadKeyException e) { @@ -519,7 +519,8 @@ final class OverlayManagerServiceImpl { } if (mSettings.setPriority(packageName, newParentPackageName, userId)) { - mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId); + mListener.onChanged(overlayPackage.overlayTarget, userId, + /* targetChanged */ false, /* overlayChanged */ true); } return true; } @@ -539,7 +540,8 @@ final class OverlayManagerServiceImpl { } if (mSettings.setHighestPriority(packageName, userId)) { - mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId); + mListener.onChanged(overlayPackage.overlayTarget, userId, + /* targetChanged */ false, /* overlayChanged */ true); } return true; } @@ -559,7 +561,8 @@ final class OverlayManagerServiceImpl { } if (mSettings.setLowestPriority(packageName, userId)) { - mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId); + mListener.onChanged(overlayPackage.overlayTarget, userId, + /* targetChanged */ false, /* overlayChanged */ true); } return true; } @@ -690,7 +693,8 @@ final class OverlayManagerServiceImpl { } interface OverlayChangeListener { - void onOverlaysChanged(@NonNull String targetPackage, int userId); + void onChanged(@NonNull String targetPackage, int userId, + boolean targetChanged, boolean overlayChanged); } interface PackageManagerHelper { diff --git a/services/core/java/com/android/server/os/SchedulingPolicyService.java b/services/core/java/com/android/server/os/SchedulingPolicyService.java index c64e745a3ac2..5cbe1a1e9816 100644 --- a/services/core/java/com/android/server/os/SchedulingPolicyService.java +++ b/services/core/java/com/android/server/os/SchedulingPolicyService.java @@ -24,6 +24,8 @@ import android.os.Process; import android.os.RemoteException; import android.util.Log; +import com.android.server.SystemServerInitThreadPool; + /** * The implementation of the scheduling policy service interface. * @@ -62,11 +64,18 @@ public class SchedulingPolicyService extends ISchedulingPolicyService.Stub { // (Note that if mediaserver thinks we're in boosted state before the crash, // the state could go out of sync temporarily until mediaserver enables/disable // boost next time, but this won't be a big issue.) - int[] nativePids = Process.getPidsForCommands(MEDIA_PROCESS_NAMES); - if (nativePids != null && nativePids.length == 1) { - mBoostedPid = nativePids[0]; - disableCpusetBoost(nativePids[0]); - } + SystemServerInitThreadPool.get().submit(() -> { + synchronized (mDeathRecipient) { + // only do this if we haven't already got a request to boost. + if (mBoostedPid == -1) { + int[] nativePids = Process.getPidsForCommands(MEDIA_PROCESS_NAMES); + if (nativePids != null && nativePids.length == 1) { + mBoostedPid = nativePids[0]; + disableCpusetBoost(nativePids[0]); + } + } + } + }, TAG + ".<init>"); } // TODO(b/35196900) We should pass the period in time units, rather @@ -107,7 +116,9 @@ public class SchedulingPolicyService extends ISchedulingPolicyService.Stub { // Request to move media.codec process between SP_FOREGROUND and SP_TOP_APP. public int requestCpusetBoost(boolean enable, IBinder client) { - if (!isPermitted()) { + // Can only allow mediaserver to call this. + if (Binder.getCallingPid() != Process.myPid() && + Binder.getCallingUid() != Process.MEDIA_UID) { return PackageManager.PERMISSION_DENIED; } @@ -201,7 +212,6 @@ public class SchedulingPolicyService extends ISchedulingPolicyService.Stub { switch (Binder.getCallingUid()) { case Process.AUDIOSERVER_UID: // fastcapture, fastmixer - case Process.MEDIA_UID: // mediaserver case Process.CAMERASERVER_UID: // camera high frame rate recording case Process.BLUETOOTH_UID: // Bluetooth audio playback return true; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a20023128ff5..bb1f5c02f864 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4223,6 +4223,11 @@ public class PackageManagerService extends IPackageManager.Stub || appId == Process.ROOT_UID) { return false; } + // Installer gets to see all static libs. + if (PackageManager.PERMISSION_GRANTED + == checkUidPermission(Manifest.permission.INSTALL_PACKAGES, uid)) { + return false; + } } // No package means no static lib as it is always on internal storage @@ -9974,8 +9979,12 @@ public class PackageManagerService extends IPackageManager.Stub } // Scan as privileged apps that share a user with a priv-app. - if (((scanFlags & SCAN_AS_PRIVILEGED) == 0) && !pkg.isPrivileged() - && (pkg.mSharedUserId != null)) { + final boolean skipVendorPrivilegeScan = ((scanFlags & SCAN_AS_VENDOR) != 0) + && SystemProperties.getInt("ro.vndk.version", 28) < 28; + if (((scanFlags & SCAN_AS_PRIVILEGED) == 0) + && !pkg.isPrivileged() + && (pkg.mSharedUserId != null) + && !skipVendorPrivilegeScan) { SharedUserSetting sharedUserSetting = null; try { sharedUserSetting = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0, 0, false); @@ -13625,25 +13634,15 @@ public class PackageManagerService extends IPackageManager.Stub // install reason correctly. return installReason; } - - final IDevicePolicyManager dpm = IDevicePolicyManager.Stub.asInterface( - ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); - if (dpm != null) { - ComponentName owner = null; - try { - owner = dpm.getDeviceOwnerComponent(true /* callingUserOnly */); - if (owner == null) { - owner = dpm.getProfileOwner(UserHandle.getUserId(installerUid)); - } - } catch (RemoteException e) { - } - if (owner != null && owner.getPackageName().equals(installerPackageName)) { - // If the install is being performed by a device or profile owner, the install - // reason should be enterprise policy. - return PackageManager.INSTALL_REASON_POLICY; - } + final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage( + UserHandle.getUserId(installerUid)); + if (ownerPackage != null && ownerPackage.equals(installerPackageName)) { + // If the install is being performed by a device or profile owner, the install + // reason should be enterprise policy. + return PackageManager.INSTALL_REASON_POLICY; } + if (installReason == PackageManager.INSTALL_REASON_POLICY) { // If the install is being performed by a regular app (i.e. neither system app nor // device or profile owner), we have no reason to believe that the app is acting on @@ -14040,7 +14039,11 @@ public class PackageManagerService extends IPackageManager.Stub throw new IllegalArgumentException("CallingPackage " + callingPackage + " does not" + " belong to calling app id " + UserHandle.getAppId(callingUid)); } - + if (!PLATFORM_PACKAGE_NAME.equals(callingPackage) + && mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId) != null) { + throw new UnsupportedOperationException("Cannot suspend/unsuspend packages. User " + + userId + " has an active DO or PO"); + } if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } @@ -17425,6 +17428,7 @@ public class PackageManagerService extends IPackageManager.Stub // 1) it is not forward locked. // 2) it is not on on an external ASEC container. // 3) it is not an instant app or if it is then dexopt is enabled via gservices. + // 4) it is not debuggable. // // Note that we do not dexopt instant apps by default. dexopt can take some time to // complete, so we skip this step during installation. Instead, we'll take extra time @@ -17436,7 +17440,8 @@ public class PackageManagerService extends IPackageManager.Stub && !forwardLocked && !pkg.applicationInfo.isExternalAsec() && (!instantApp || Global.getInt(mContext.getContentResolver(), - Global.INSTANT_APP_DEXOPT_ENABLED, 0) != 0); + Global.INSTANT_APP_DEXOPT_ENABLED, 0) != 0) + && ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0); if (performDexopt) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt"); diff --git a/services/core/java/com/android/server/pm/ProtectedPackages.java b/services/core/java/com/android/server/pm/ProtectedPackages.java index e67364a26e5c..a374e1484b28 100644 --- a/services/core/java/com/android/server/pm/ProtectedPackages.java +++ b/services/core/java/com/android/server/pm/ProtectedPackages.java @@ -88,6 +88,13 @@ public class ProtectedPackages { return false; } + public synchronized String getDeviceOwnerOrProfileOwnerPackage(int userId) { + if (mDeviceOwnerUserId == userId) { + return mDeviceOwnerPackage; + } + return mProfileOwnerPackages.get(userId); + } + /** * Returns {@code true} if a given package is protected. Otherwise, returns {@code false}. * diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index bd4210c1b034..1d5b1a38bbee 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6094,7 +6094,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Cancel any pending remote recents animations before handling the button itself. In the // case where we are going home and the recents animation has already started, just cancel // the recents animation, leaving the home stack in place for the pending start activity - if (isNavBarVirtKey && !down) { + if (isNavBarVirtKey && !down && !canceled) { boolean isHomeKey = keyCode == KeyEvent.KEYCODE_HOME; mActivityManagerInternal.cancelRecentsAnimation(!isHomeKey); } diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java index a9cdafd9aeaa..507f0a8b7bb8 100644 --- a/services/core/java/com/android/server/slice/SliceManagerService.java +++ b/services/core/java/com/android/server/slice/SliceManagerService.java @@ -155,11 +155,10 @@ public class SliceManagerService extends ISliceManager.Stub { enforceAccess(pkg, uri); int user = Binder.getCallingUserHandle().getIdentifier(); uri = maybeAddUserId(uri, user); - getOrCreatePinnedSlice(uri, pkg).pin(pkg, specs, token); + String slicePkg = getProviderPkg(uri, user); + getOrCreatePinnedSlice(uri, slicePkg).pin(pkg, specs, token); - Uri finalUri = uri; mHandler.post(() -> { - String slicePkg = getProviderPkg(finalUri, user); if (slicePkg != null && !Objects.equals(pkg, slicePkg)) { mAppUsageStats.reportEvent(slicePkg, user, isAssistant(pkg, user) || isDefaultHomeApp(pkg, user) diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index c7617546780d..2f174c2f5170 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -984,6 +984,7 @@ public class AppTransition implements Dump { (height - thumbnailSize) / 2, (width + thumbnailSize) / 2, (height + thumbnailSize) / 2); + drawable.setTint(mContext.getColor(android.R.color.white)); drawable.draw(canvas); picture.endRecording(); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index a701d42986e3..a9560e65db09 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1984,7 +1984,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree final Rect frame = win.mFrame; final int thumbnailDrawableRes = getTask().mUserId == mService.mCurrentUserId ? R.drawable.ic_account_circle - : R.drawable.ic_corp_badge_no_background; + : R.drawable.ic_corp_badge; final GraphicBuffer thumbnail = mService.mAppTransition .createCrossProfileAppsThumbnail(thumbnailDrawableRes, frame); diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java index 112d93c75059..b2a12bef5283 100644 --- a/services/core/java/com/android/server/wm/BoundsAnimationController.java +++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java @@ -401,12 +401,13 @@ public class BoundsAnimationController { + " replacing=" + replacing); if (replacing) { - if (existing.isAnimatingTo(to)) { + if (existing.isAnimatingTo(to) && (!moveToFullscreen || existing.mMoveToFullscreen) + && (!moveFromFullscreen || existing.mMoveFromFullscreen)) { // Just let the current animation complete if it has the same destination as the - // one we are trying to start. - if (DEBUG) Slog.d(TAG, "animateBounds: same destination as existing=" + existing - + " ignoring..."); - + // one we are trying to start, and, if moveTo/FromFullscreen was requested, already + // has that flag set. + if (DEBUG) Slog.d(TAG, "animateBounds: same destination and moveTo/From flags as " + + "existing=" + existing + ", ignoring..."); return existing; } @@ -434,6 +435,13 @@ public class BoundsAnimationController { } } + // We need to keep the previous moveTo/FromFullscreen flag, unless the new animation + // specifies a direction. + if (!moveFromFullscreen && !moveToFullscreen) { + moveToFullscreen = existing.mMoveToFullscreen; + moveFromFullscreen = existing.mMoveFromFullscreen; + } + // Since we are replacing, we skip both animation start and end callbacks existing.cancel(); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 4fd31ff26b01..38fb30e855e3 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3906,7 +3906,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * with {@link #WindowState#assignLayer} */ void assignRelativeLayerForImeTargetChild(SurfaceControl.Transaction t, WindowContainer child) { - t.setRelativeLayer(child.getSurfaceControl(), mImeWindowsContainers.getSurfaceControl(), 1); + child.assignRelativeLayer(t, mImeWindowsContainers.getSurfaceControl(), 1); } @Override diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS new file mode 100644 index 000000000000..fff42c5d0a5f --- /dev/null +++ b/services/core/java/com/android/server/wm/OWNERS @@ -0,0 +1,7 @@ +ogunwale@google.com +jjaggi@google.com +racarr@google.com +chaviw@google.com +brycelee@google.com +akulian@google.com +roosa@google.com diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 79b230d45110..85e4ac7fe4ce 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -47,7 +47,9 @@ import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import android.view.inputmethod.InputMethodManagerInternal; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.LocalServices; import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; import com.android.server.wm.utils.InsetUtils; import com.google.android.collect.Sets; @@ -81,9 +83,8 @@ public class RecentsAnimationController implements DeathRecipient { private final RecentsAnimationCallbacks mCallbacks; private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>(); private final int mDisplayId; - private final Runnable mFailsafeRunnable = () -> { - cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "failSafeRunnable"); - }; + private final Runnable mFailsafeRunnable = () -> + cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "failSafeRunnable"); // The recents component app token that is shown behind the visibile tasks private AppWindowToken mTargetAppToken; @@ -110,7 +111,7 @@ public class RecentsAnimationController implements DeathRecipient { private boolean mLinkedToDeathOfRunner; public interface RecentsAnimationCallbacks { - void onAnimationFinished(@ReorderMode int reorderMode); + void onAnimationFinished(@ReorderMode int reorderMode, boolean runSychronously); } private final IRecentsAnimationController mController = @@ -162,7 +163,8 @@ public class RecentsAnimationController implements DeathRecipient { // prior to calling the callback mCallbacks.onAnimationFinished(moveHomeToTop ? REORDER_MOVE_TO_TOP - : REORDER_MOVE_TO_ORIGINAL_POSITION); + : REORDER_MOVE_TO_ORIGINAL_POSITION, + true /* runSynchronously */); } finally { Binder.restoreCallingIdentity(token); } @@ -220,6 +222,20 @@ public class RecentsAnimationController implements DeathRecipient { Binder.restoreCallingIdentity(token); } } + + @Override + public void hideCurrentInputMethod() { + final long token = Binder.clearCallingIdentity(); + try { + final InputMethodManagerInternal inputMethodManagerInternal = + LocalServices.getService(InputMethodManagerInternal.class); + if (inputMethodManagerInternal != null) { + inputMethodManagerInternal.hideCurrentInputMethod(); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } }; /** @@ -369,7 +385,17 @@ public class RecentsAnimationController implements DeathRecipient { } void cancelAnimation(@ReorderMode int reorderMode, String reason) { - if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation(): reason=" + reason); + cancelAnimation(reorderMode, false /* runSynchronously */, reason); + } + + void cancelAnimationSynchronously(@ReorderMode int reorderMode, String reason) { + cancelAnimation(reorderMode, true /* runSynchronously */, reason); + } + + private void cancelAnimation(@ReorderMode int reorderMode, boolean runSynchronously, + String reason) { + if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation(): reason=" + reason + + " runSynchronously=" + runSynchronously); synchronized (mService.getWindowManagerLock()) { if (mCanceled) { // We've already canceled the animation @@ -385,8 +411,7 @@ public class RecentsAnimationController implements DeathRecipient { } // Clean up and return to the previous app - // Don't hold the WM lock here as it calls back to AM/RecentsAnimation - mCallbacks.onAnimationFinished(reorderMode); + mCallbacks.onAnimationFinished(reorderMode, runSynchronously); } void cleanupAnimation(@ReorderMode int reorderMode) { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index fd965fbc8ac7..50d0d0a5f1f9 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -692,6 +692,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { wallpaperDestroyed = true; } win.destroySurfaceUnchecked(); + win.mWinAnimator.destroyPreservedSurfaceLocked(); } while (i > 0); mService.mDestroySurface.clear(); } diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java index ddb67b4d4628..653850aa288f 100644 --- a/services/core/java/com/android/server/wm/StackWindowController.java +++ b/services/core/java/com/android/server/wm/StackWindowController.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import android.app.WindowConfiguration; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Handler; @@ -244,12 +245,15 @@ public class StackWindowController } /** - * Adjusts the screen size in dp's for the {@param config} for the given params. + * Adjusts the screen size in dp's for the {@param config} for the given params. The provided + * params represent the desired state of a configuration change. Since this utility is used + * before mContainer has been updated, any relevant properties (like {@param windowingMode}) + * need to be passed in. */ public void adjustConfigurationForBounds(Rect bounds, Rect insetBounds, Rect nonDecorBounds, Rect stableBounds, boolean overrideWidth, boolean overrideHeight, float density, Configuration config, - Configuration parentConfig) { + Configuration parentConfig, int windowingMode) { synchronized (mWindowMap) { final TaskStack stack = mContainer; final DisplayContent displayContent = stack.getDisplayContent(); @@ -272,10 +276,10 @@ public class StackWindowController config.windowConfiguration.setAppBounds(!bounds.isEmpty() ? bounds : null); boolean intersectParentBounds = false; - if (stack.getWindowConfiguration().tasksAreFloating()) { + if (WindowConfiguration.isFloating(windowingMode)) { // Floating tasks should not be resized to the screen's bounds. - if (stack.inPinnedWindowingMode() + if (windowingMode == WindowConfiguration.WINDOWING_MODE_PINNED && bounds.width() == mTmpDisplayBounds.width() && bounds.height() == mTmpDisplayBounds.height()) { // If the bounds we are animating is the same as the fullscreen stack @@ -316,7 +320,7 @@ public class StackWindowController config.screenWidthDp = width; config.screenHeightDp = height; config.smallestScreenWidthDp = getSmallestWidthForTaskBounds( - insetBounds != null ? insetBounds : bounds, density); + insetBounds != null ? insetBounds : bounds, density, windowingMode); } } @@ -338,11 +342,12 @@ public class StackWindowController } /** - * Calculates the smallest width for a task given the {@param bounds}. + * Calculates the smallest width for a task given the target {@param bounds} and + * {@param windowingMode}. Avoid using values from mContainer since they can be out-of-date. * * @return the smallest width to be used in the Configuration, in dips */ - private int getSmallestWidthForTaskBounds(Rect bounds, float density) { + private int getSmallestWidthForTaskBounds(Rect bounds, float density, int windowingMode) { final DisplayContent displayContent = mContainer.getDisplayContent(); final DisplayInfo displayInfo = displayContent.getDisplayInfo(); @@ -350,7 +355,7 @@ public class StackWindowController bounds.height() == displayInfo.logicalHeight)) { // If the bounds are fullscreen, return the value of the fullscreen configuration return displayContent.getConfiguration().smallestScreenWidthDp; - } else if (mContainer.getWindowConfiguration().tasksAreFloating()) { + } else if (WindowConfiguration.isFloating(windowingMode)) { // For floating tasks, calculate the smallest width from the bounds of the task return (int) (Math.min(bounds.width(), bounds.height()) / density); } else { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 5f9d679d7f07..6b13edd072cd 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -273,9 +273,8 @@ class TaskSnapshotController { return null; } return new TaskSnapshot(buffer, top.getConfiguration().orientation, - getInsets(mainWindow), - isLowRamDevice /* reduced */, scaleFraction /* scale */, - true /* isRealSnapshot */); + getInsets(mainWindow), isLowRamDevice /* reduced */, scaleFraction /* scale */, + true /* isRealSnapshot */, task.getWindowingMode()); } private boolean shouldDisableSnapshots() { @@ -365,7 +364,7 @@ class TaskSnapshotController { return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(), topChild.getConfiguration().orientation, mainWindow.mStableInsets, ActivityManager.isLowRamDeviceStatic() /* reduced */, 1.0f /* scale */, - false /* isRealSnapshot */); + false /* isRealSnapshot */, task.getWindowingMode()); } /** diff --git a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java index 31da5f3ff1c8..b682a3262da1 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java @@ -90,7 +90,7 @@ class TaskSnapshotLoader { return new TaskSnapshot(buffer, proto.orientation, new Rect(proto.insetLeft, proto.insetTop, proto.insetRight, proto.insetBottom), reducedResolution, reducedResolution ? REDUCED_SCALE : 1f, - proto.isRealSnapshot); + proto.isRealSnapshot, proto.windowingMode); } catch (IOException e) { Slog.w(TAG, "Unable to load task snapshot data for taskId=" + taskId); return null; diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java index 086fffa9d621..408fb3ce36c9 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java @@ -24,9 +24,7 @@ import android.annotation.TestApi; import android.app.ActivityManager; import android.app.ActivityManager.TaskSnapshot; import android.graphics.Bitmap; -import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.Config; -import android.graphics.GraphicBuffer; import android.os.Process; import android.os.SystemClock; import android.util.ArraySet; @@ -41,7 +39,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayDeque; -import java.util.ArrayList; /** * Persists {@link TaskSnapshot}s to disk. @@ -319,6 +316,7 @@ class TaskSnapshotPersister { proto.insetRight = mSnapshot.getContentInsets().right; proto.insetBottom = mSnapshot.getContentInsets().bottom; proto.isRealSnapshot = mSnapshot.isRealSnapshot(); + proto.windowingMode = mSnapshot.getWindowingMode(); final byte[] bytes = TaskSnapshotProto.toByteArray(proto); final File file = getProtoFile(mTaskId, mUserId); final AtomicFile atomicFile = new AtomicFile(file); diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index ae9e80268741..018765d1ecdc 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -751,8 +751,9 @@ public class TaskStack extends WindowContainer<Task> implements * Used to make room for shadows in the pinned windowing mode. */ int getStackOutset() { - if (inPinnedWindowingMode()) { - final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics(); + DisplayContent displayContent = getDisplayContent(); + if (inPinnedWindowingMode() && displayContent != null) { + final DisplayMetrics displayMetrics = displayContent.getDisplayMetrics(); // We multiply by two to match the client logic for converting view elevation // to insets, as in {@link WindowManager.LayoutParams#setSurfaceInsets} @@ -1721,6 +1722,9 @@ public class TaskStack extends WindowContainer<Task> implements return true; } final Task homeTask = homeStack.getTopChild(); + if (homeTask == null) { + return true; + } final AppWindowToken homeApp = homeTask.getTopVisibleAppToken(); if (!homeTask.isVisible() || homeApp == null) { return true; diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 331a0bd3da11..19c5a3d6452a 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -183,6 +183,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // build a surface. mSurfaceControl = makeSurface().build(); getPendingTransaction().show(mSurfaceControl); + updateSurfacePosition(); } else { // If we have a surface but a new parent, we just need to perform a reparent. Go through // surface animator such that hierarchy is preserved when animating, i.e. @@ -921,6 +922,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< * @return Whether this WindowContainer should be magnified by the accessibility magnifier. */ boolean shouldMagnify() { + if (mSurfaceControl == null) { + return false; + } + for (int i = 0; i < mChildren.size(); i++) { if (!mChildren.get(i).shouldMagnify()) { return false; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 94b853f595a9..10dfdf2a982e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2204,7 +2204,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mInputMethodWindow == win) { setInputMethodWindowLocked(null); } - boolean stopped = win.mAppToken != null ? win.mAppToken.mAppStopped : false; + boolean stopped = win.mAppToken != null ? win.mAppToken.mAppStopped : true; // We set mDestroying=true so AppWindowToken#notifyAppStopped in-to destroy surfaces // will later actually destroy the surface if we do not do so here. Normally we leave // this to the exit animation. @@ -2732,17 +2732,15 @@ public class WindowManagerService extends IWindowManager.Stub /** * Cancels any running recents animation. The caller should NOT hold the WM lock while calling - * this method, as it can call back into AM, and locking will be done in the animation - * controller itself. + * this method, as it will call back into AM and may cause a deadlock. Any locking will be done + * in the animation controller itself. */ - public void cancelRecentsAnimation(@RecentsAnimationController.ReorderMode int reorderMode, - String reason) { - // Note: Do not hold the WM lock, this will lock appropriately in the call which also - // calls through to AM/RecentsAnimation.onAnimationFinished() + public void cancelRecentsAnimationSynchronously( + @RecentsAnimationController.ReorderMode int reorderMode, String reason) { if (mRecentsAnimationController != null) { // This call will call through to cleanupAnimation() below after the animation is // canceled - mRecentsAnimationController.cancelAnimation(reorderMode, reason); + mRecentsAnimationController.cancelAnimationSynchronously(reorderMode, reason); } } @@ -7491,7 +7489,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean hasWideColorGamutSupport() { return mHasWideColorGamutSupport && - !SystemProperties.getBoolean("persist.sys.sf.native_mode", false); + SystemProperties.getInt("persist.sys.sf.native_mode", 0) != 1; } void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6c2821d9d740..86aed47a3482 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3865,9 +3865,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP windowInfo.title = mAttrs.accessibilityTitle; // Panel windows have no public way to set the a11y title directly. Use the // regular title as a fallback. - if (TextUtils.isEmpty(windowInfo.title) - && (mAttrs.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW) - && (mAttrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW)) { + final boolean isPanelWindow = (mAttrs.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW) + && (mAttrs.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW); + // Accessibility overlays should have titles that work for accessibility, and can't set + // the a11y title themselves. + final boolean isAccessibilityOverlay = + windowInfo.type == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; + if (TextUtils.isEmpty(windowInfo.title) && (isPanelWindow || isAccessibilityOverlay)) { windowInfo.title = mAttrs.getTitle(); } windowInfo.accessibilityIdOfAnchor = mAttrs.accessibilityIdOfAnchor; @@ -4270,6 +4274,24 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + private boolean skipDecorCrop() { + // The decor frame is used to specify the region not covered by the system + // decorations (nav bar, status bar). In case this is empty, for example with + // FLAG_TRANSLUCENT_NAVIGATION, we don't need to do any cropping. + if (mDecorFrame.isEmpty()) { + return true; + } + + // But if we have a frame, and are an application window, then we must be cropped. + if (mAppToken != null) { + return false; + } + + // For non application windows, we may be allowed to extend over the decor bars + // depending on our type and permissions assosciated with our token. + return mToken.canLayerAboveSystemBars(); + } + /** * Calculate the window crop according to system decor policy. In general this is * the system decor rect (see #calculateSystemDecorRect), but we also have some @@ -4287,7 +4309,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP policyCrop.intersect(-mCompatFrame.left, -mCompatFrame.top, displayInfo.logicalWidth - mCompatFrame.left, displayInfo.logicalHeight - mCompatFrame.top); - } else if (mDecorFrame.isEmpty()) { + } else if (skipDecorCrop()) { // Windows without policy decor aren't cropped. policyCrop.set(0, 0, mCompatFrame.width(), mCompatFrame.height()); } else { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 14680d94f63a..b97460ae9eb8 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -17,7 +17,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; - +import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; @@ -336,4 +336,16 @@ class WindowToken extends WindowContainer<WindowState> { boolean okToAnimate() { return mDisplayContent != null && mDisplayContent.okToAnimate(); } + + /** + * Return whether windows from this token can layer above the + * system bars, or in other words extend outside of the "Decor Frame" + */ + boolean canLayerAboveSystemBars() { + int layer = mService.mPolicy.getWindowLayerFromTypeLw(windowType, + mOwnerCanManageAppTokens); + int navLayer = mService.mPolicy.getWindowLayerFromTypeLw(TYPE_NAVIGATION_BAR, + mOwnerCanManageAppTokens); + return mOwnerCanManageAppTokens && (layer > navLayer); + } } diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index e18eee267610..a3a7e1e7d1b2 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1745,12 +1745,12 @@ static void android_location_GnssLocationProvider_update_network_state(JNIEnv* e } } -static jboolean android_location_GnssLocationProvider_is_geofence_supported( +static jboolean android_location_GnssGeofenceProvider_is_geofence_supported( JNIEnv* /* env */, jobject /* obj */) { return (gnssGeofencingIface != nullptr) ? JNI_TRUE : JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_add_geofence(JNIEnv* /* env */, +static jboolean android_location_GnssGeofenceProvider_add_geofence(JNIEnv* /* env */, jobject /* obj */, jint geofenceId, jdouble latitude, jdouble longitude, jdouble radius, jint last_transition, jint monitor_transition, jint notification_responsiveness, jint unknown_timer) { @@ -1766,7 +1766,7 @@ static jboolean android_location_GnssLocationProvider_add_geofence(JNIEnv* /* en return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_remove_geofence(JNIEnv* /* env */, +static jboolean android_location_GnssGeofenceProvider_remove_geofence(JNIEnv* /* env */, jobject /* obj */, jint geofenceId) { if (gnssGeofencingIface != nullptr) { auto result = gnssGeofencingIface->removeGeofence(geofenceId); @@ -1777,7 +1777,7 @@ static jboolean android_location_GnssLocationProvider_remove_geofence(JNIEnv* /* return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_pause_geofence(JNIEnv* /* env */, +static jboolean android_location_GnssGeofenceProvider_pause_geofence(JNIEnv* /* env */, jobject /* obj */, jint geofenceId) { if (gnssGeofencingIface != nullptr) { auto result = gnssGeofencingIface->pauseGeofence(geofenceId); @@ -1788,7 +1788,7 @@ static jboolean android_location_GnssLocationProvider_pause_geofence(JNIEnv* /* return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_resume_geofence(JNIEnv* /* env */, +static jboolean android_location_GnssGeofenceProvider_resume_geofence(JNIEnv* /* env */, jobject /* obj */, jint geofenceId, jint monitor_transition) { if (gnssGeofencingIface != nullptr) { auto result = gnssGeofencingIface->resumeGeofence(geofenceId, monitor_transition); @@ -1799,7 +1799,7 @@ static jboolean android_location_GnssLocationProvider_resume_geofence(JNIEnv* /* return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_is_measurement_supported( +static jboolean android_location_GnssMeasurementsProvider_is_measurement_supported( JNIEnv* env, jclass clazz) { if (gnssMeasurementIface != nullptr) { return JNI_TRUE; @@ -1808,7 +1808,7 @@ static jboolean android_location_GnssLocationProvider_is_measurement_supported( return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_start_measurement_collection( +static jboolean android_location_GnssMeasurementsProvider_start_measurement_collection( JNIEnv* /* env */, jobject /* obj */, jboolean enableFullTracking) { @@ -1842,7 +1842,7 @@ static jboolean android_location_GnssLocationProvider_start_measurement_collecti return JNI_TRUE; } -static jboolean android_location_GnssLocationProvider_stop_measurement_collection( +static jboolean android_location_GnssMeasurementsProvider_stop_measurement_collection( JNIEnv* env, jobject obj) { if (gnssMeasurementIface == nullptr) { @@ -1854,7 +1854,7 @@ static jboolean android_location_GnssLocationProvider_stop_measurement_collectio return boolToJbool(result.isOk()); } -static jboolean android_location_GnssLocationProvider_is_navigation_message_supported( +static jboolean android_location_GnssNavigationMessageProvider_is_navigation_message_supported( JNIEnv* env, jclass clazz) { if (gnssNavigationMessageIface != nullptr) { @@ -1863,7 +1863,7 @@ static jboolean android_location_GnssLocationProvider_is_navigation_message_supp return JNI_FALSE; } -static jboolean android_location_GnssLocationProvider_start_navigation_message_collection( +static jboolean android_location_GnssNavigationMessageProvider_start_navigation_message_collection( JNIEnv* env, jobject obj) { if (gnssNavigationMessageIface == nullptr) { @@ -1884,7 +1884,7 @@ static jboolean android_location_GnssLocationProvider_start_navigation_message_c return JNI_TRUE; } -static jboolean android_location_GnssLocationProvider_stop_navigation_message_collection( +static jboolean android_location_GnssNavigationMessageProvider_stop_navigation_message_collection( JNIEnv* env, jobject obj) { if (gnssNavigationMessageIface == nullptr) { @@ -2050,7 +2050,7 @@ static jboolean android_location_GnssLocationProvider_set_satellite_blacklist( } -static jint android_location_GnssLocationProvider_get_batch_size(JNIEnv*, jclass) { +static jint android_location_GnssBatchingProvider_get_batch_size(JNIEnv*, jclass) { if (gnssBatchingIface == nullptr) { return 0; // batching not supported, size = 0 } @@ -2062,7 +2062,7 @@ static jint android_location_GnssLocationProvider_get_batch_size(JNIEnv*, jclass } } -static jboolean android_location_GnssLocationProvider_init_batching(JNIEnv*, jclass) { +static jboolean android_location_GnssBatchingProvider_init_batching(JNIEnv*, jclass) { if (gnssBatchingIface == nullptr) { return JNI_FALSE; // batching not supported } @@ -2071,14 +2071,14 @@ static jboolean android_location_GnssLocationProvider_init_batching(JNIEnv*, jcl return static_cast<jboolean>(gnssBatchingIface->init(gnssBatchingCbIface)); } -static void android_location_GnssLocationProvider_cleanup_batching(JNIEnv*, jclass) { +static void android_location_GnssBatchingProvider_cleanup_batching(JNIEnv*, jclass) { if (gnssBatchingIface == nullptr) { return; // batching not supported } gnssBatchingIface->cleanup(); } -static jboolean android_location_GnssLocationProvider_start_batch(JNIEnv*, jclass, +static jboolean android_location_GnssBatchingProvider_start_batch(JNIEnv*, jclass, jlong periodNanos, jboolean wakeOnFifoFull) { if (gnssBatchingIface == nullptr) { return JNI_FALSE; // batching not supported @@ -2095,7 +2095,7 @@ static jboolean android_location_GnssLocationProvider_start_batch(JNIEnv*, jclas return static_cast<jboolean>(gnssBatchingIface->start(options)); } -static void android_location_GnssLocationProvider_flush_batch(JNIEnv*, jclass) { +static void android_location_GnssBatchingProvider_flush_batch(JNIEnv*, jclass) { if (gnssBatchingIface == nullptr) { return; // batching not supported } @@ -2103,7 +2103,7 @@ static void android_location_GnssLocationProvider_flush_batch(JNIEnv*, jclass) { gnssBatchingIface->flush(); } -static jboolean android_location_GnssLocationProvider_stop_batch(JNIEnv*, jclass) { +static jboolean android_location_GnssBatchingProvider_stop_batch(JNIEnv*, jclass) { if (gnssBatchingIface == nullptr) { return JNI_FALSE; // batching not supported } @@ -2178,44 +2178,6 @@ static const JNINativeMethod sMethods[] = { {"native_update_network_state", "(ZIZZLjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(android_location_GnssLocationProvider_update_network_state)}, - {"native_is_geofence_supported", - "()Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_is_geofence_supported)}, - {"native_add_geofence", - "(IDDDIIII)Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_add_geofence)}, - {"native_remove_geofence", - "(I)Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_remove_geofence)}, - {"native_pause_geofence", "(I)Z", reinterpret_cast<void *>( - android_location_GnssLocationProvider_pause_geofence)}, - {"native_resume_geofence", - "(II)Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_resume_geofence)}, - {"native_is_measurement_supported", - "()Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_is_measurement_supported)}, - {"native_start_measurement_collection", - "(Z)Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_start_measurement_collection)}, - {"native_stop_measurement_collection", - "()Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_stop_measurement_collection)}, - {"native_is_navigation_message_supported", - "()Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_is_navigation_message_supported)}, - {"native_start_navigation_message_collection", - "()Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_start_navigation_message_collection)}, - {"native_stop_navigation_message_collection", - "()Z", - reinterpret_cast<void *>( - android_location_GnssLocationProvider_stop_navigation_message_collection)}, {"native_set_supl_es", "(I)Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_set_supl_es)}, @@ -2241,30 +2203,101 @@ static const JNINativeMethod sMethods[] = { {"native_set_satellite_blacklist", "([I[I)Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_set_satellite_blacklist)}, +}; + +static const JNINativeMethod sMethodsBatching[] = { + /* name, signature, funcPtr */ {"native_get_batch_size", "()I", - reinterpret_cast<void *>(android_location_GnssLocationProvider_get_batch_size)}, - {"native_init_batching", - "()Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_init_batching)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_get_batch_size)}, {"native_start_batch", "(JZ)Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_start_batch)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_start_batch)}, {"native_flush_batch", "()V", - reinterpret_cast<void *>(android_location_GnssLocationProvider_flush_batch)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_flush_batch)}, {"native_stop_batch", "()Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_stop_batch)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_stop_batch)}, {"native_init_batching", "()Z", - reinterpret_cast<void *>(android_location_GnssLocationProvider_init_batching)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_init_batching)}, {"native_cleanup_batching", "()V", - reinterpret_cast<void *>(android_location_GnssLocationProvider_cleanup_batching)}, + reinterpret_cast<void *>(android_location_GnssBatchingProvider_cleanup_batching)}, +}; + +static const JNINativeMethod sGeofenceMethods[] = { + /* name, signature, funcPtr */ + {"native_is_geofence_supported", + "()Z", + reinterpret_cast<void *>(android_location_GnssGeofenceProvider_is_geofence_supported)}, + {"native_add_geofence", + "(IDDDIIII)Z", + reinterpret_cast<void *>(android_location_GnssGeofenceProvider_add_geofence)}, + {"native_remove_geofence", + "(I)Z", + reinterpret_cast<void *>(android_location_GnssGeofenceProvider_remove_geofence)}, + {"native_pause_geofence", "(I)Z", reinterpret_cast<void *>( + android_location_GnssGeofenceProvider_pause_geofence)}, + {"native_resume_geofence", + "(II)Z", + reinterpret_cast<void *>(android_location_GnssGeofenceProvider_resume_geofence)}, +}; + +static const JNINativeMethod sMeasurementMethods[] = { + /* name, signature, funcPtr */ + {"native_is_measurement_supported", + "()Z", + reinterpret_cast<void *>( + android_location_GnssMeasurementsProvider_is_measurement_supported)}, + {"native_start_measurement_collection", + "(Z)Z", + reinterpret_cast<void *>( + android_location_GnssMeasurementsProvider_start_measurement_collection)}, + {"native_stop_measurement_collection", + "()Z", + reinterpret_cast<void *>( + android_location_GnssMeasurementsProvider_stop_measurement_collection)}, +}; + +static const JNINativeMethod sNavigationMessageMethods[] = { + /* name, signature, funcPtr */ + {"native_is_navigation_message_supported", + "()Z", + reinterpret_cast<void *>( + android_location_GnssNavigationMessageProvider_is_navigation_message_supported)}, + {"native_start_navigation_message_collection", + "()Z", + reinterpret_cast<void *>( + android_location_GnssNavigationMessageProvider_start_navigation_message_collection)}, + {"native_stop_navigation_message_collection", + "()Z", + reinterpret_cast<void *>( + android_location_GnssNavigationMessageProvider_stop_navigation_message_collection)}, }; int register_android_server_location_GnssLocationProvider(JNIEnv* env) { + jniRegisterNativeMethods( + env, + "com/android/server/location/GnssBatchingProvider", + sMethodsBatching, + NELEM(sMethodsBatching)); + jniRegisterNativeMethods( + env, + "com/android/server/location/GnssGeofenceProvider", + sGeofenceMethods, + NELEM(sGeofenceMethods)); + jniRegisterNativeMethods( + env, + "com/android/server/location/GnssMeasurementsProvider", + sMeasurementMethods, + NELEM(sMeasurementMethods)); + jniRegisterNativeMethods( + env, + "com/android/server/location/GnssNavigationMessageProvider", + sNavigationMessageMethods, + NELEM(sNavigationMessageMethods)); return jniRegisterNativeMethods( env, "com/android/server/location/GnssLocationProvider", diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index e07b89f232b1..94f8f38739bc 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -73,6 +73,9 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER; import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER; + +import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; + import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.TEXT; @@ -3958,8 +3961,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { DevicePolicyData policy = getUserData(credentialOwner); PasswordMetrics metrics = getUserPasswordMetricsLocked(credentialOwner); if (metrics == null) { - Slog.wtf(LOG_TAG, "Should have had a valid password metrics for updating checkpoint " + - "validity."); metrics = new PasswordMetrics(); } policy.mPasswordValidAtLastCheckpoint = @@ -4508,7 +4509,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } if (metrics == null) { - Slog.wtf(LOG_TAG, "FBE device, should have been unlocked and had valid metrics."); + // This could happen if the user never had a password set, for example, so + // setActivePasswordState has never been called for it. metrics = new PasswordMetrics(); } return isPasswordSufficientForUserWithoutCheckpointLocked(metrics, userHandle, parent); @@ -9193,8 +9195,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { long id = mInjector.binderClearCallingIdentity(); try { - return mIPackageManager.setPackagesSuspendedAsUser( - packageNames, suspended, null, null, null, "android", callingUserId); + return mIPackageManager.setPackagesSuspendedAsUser(packageNames, suspended, + null, null, null, PLATFORM_PACKAGE_NAME, callingUserId); } catch (RemoteException re) { // Shouldn't happen. Slog.e(LOG_TAG, "Failed talking to the package manager", re); diff --git a/services/net/java/android/net/apf/ApfCapabilities.java b/services/net/java/android/net/apf/ApfCapabilities.java index 703b41560290..dec8ca207343 100644 --- a/services/net/java/android/net/apf/ApfCapabilities.java +++ b/services/net/java/android/net/apf/ApfCapabilities.java @@ -49,4 +49,14 @@ public class ApfCapabilities { return String.format("%s{version: %d, maxSize: %d, format: %d}", getClass().getSimpleName(), apfVersionSupported, maximumApfProgramSize, apfPacketFormat); } + + /** + * Returns true if the APF interpreter advertises support for the data buffer access opcodes + * LDDW and STDW. + * + * Full LDDW and STDW support is present from APFv4 on. + */ + public boolean hasDataAccess() { + return apfVersionSupported >= 4; + } } diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java index 9a97ba7b0b57..2bf6e92f26a8 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -24,6 +24,7 @@ import static com.android.internal.util.BitUtils.getUint32; import static com.android.internal.util.BitUtils.getUint8; import static com.android.internal.util.BitUtils.uint32; +import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -102,6 +103,70 @@ public class ApfFilter { UPDATE_EXPIRY // APF program updated for expiry } + /** + * APF packet counters. + * + * Packet counters are 32bit big-endian values, and allocated near the end of the APF data + * buffer, using negative byte offsets, where -4 is equivalent to maximumApfProgramSize - 4, + * the last writable 32bit word. + */ + @VisibleForTesting + private static enum Counter { + RESERVED_OOB, // Points to offset 0 from the end of the buffer (out-of-bounds) + TOTAL_PACKETS, + PASSED_ARP, + PASSED_DHCP, + PASSED_IPV4, + PASSED_IPV6_NON_ICMP, + PASSED_IPV4_UNICAST, + PASSED_IPV6_ICMP, + PASSED_IPV6_UNICAST_NON_ICMP, + PASSED_ARP_NON_IPV4, + PASSED_ARP_UNKNOWN, + PASSED_ARP_UNICAST_REPLY, + PASSED_NON_IP_UNICAST, + DROPPED_ETH_BROADCAST, + DROPPED_RA, + DROPPED_GARP_REPLY, + DROPPED_ARP_OTHER_HOST, + DROPPED_IPV4_L2_BROADCAST, + DROPPED_IPV4_BROADCAST_ADDR, + DROPPED_IPV4_BROADCAST_NET, + DROPPED_IPV4_MULTICAST, + DROPPED_IPV6_ROUTER_SOLICITATION, + DROPPED_IPV6_MULTICAST_NA, + DROPPED_IPV6_MULTICAST, + DROPPED_IPV6_MULTICAST_PING, + DROPPED_IPV6_NON_ICMP_MULTICAST, + DROPPED_802_3_FRAME, + DROPPED_ETHERTYPE_BLACKLISTED; + + // Returns the negative byte offset from the end of the APF data segment for + // a given counter. + public int offset() { + return - this.ordinal() * 4; // Currently, all counters are 32bit long. + } + + // Returns the total size of the data segment in bytes. + public static int totalSize() { + return (Counter.class.getEnumConstants().length - 1) * 4; + } + } + + /** + * When APFv4 is supported, loads R1 with the offset of the specified counter. + */ + private void maybeSetCounter(ApfGenerator gen, Counter c) { + if (mApfCapabilities.hasDataAccess()) { + gen.addLoadImmediate(Register.R1, c.offset()); + } + } + + // When APFv4 is supported, these point to the trampolines generated by emitEpilogue(). + // Otherwise, they're just aliases for PASS_LABEL and DROP_LABEL. + private final String mCountAndPassLabel; + private final String mCountAndDropLabel; + // Thread to listen for RAs. @VisibleForTesting class ReceiveThread extends Thread { @@ -289,6 +354,16 @@ public class ApfFilter { mDrop802_3Frames = config.ieee802_3Filter; mContext = context; + if (mApfCapabilities.hasDataAccess()) { + mCountAndPassLabel = "countAndPass"; + mCountAndDropLabel = "countAndDrop"; + } else { + // APFv4 unsupported: turn jumps to the counter trampolines to immediately PASS or DROP, + // preserving the original pre-APFv4 behavior. + mCountAndPassLabel = ApfGenerator.PASS_LABEL; + mCountAndDropLabel = ApfGenerator.DROP_LABEL; + } + // Now fill the black list from the passed array mEthTypeBlackList = filterEthTypeBlackList(config.ethTypeBlackList); @@ -302,6 +377,10 @@ public class ApfFilter { new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)); } + public synchronized void setDataSnapshot(byte[] data) { + mDataSnapshot = data; + } + private void log(String s) { Log.d(TAG, "(" + mInterfaceParams.name + "): " + s); } @@ -350,6 +429,10 @@ public class ApfFilter { try { mHardwareAddress = mInterfaceParams.macAddr.toByteArray(); synchronized(this) { + // Clear APF memory. + byte[] zeroes = new byte[mApfCapabilities.maximumApfProgramSize]; + mIpClientCallback.installPacketFilter(zeroes); + // Install basic filters installNewProgramLocked(); } @@ -729,7 +812,8 @@ public class ApfFilter { gen.addJumpIfR0LessThan(filterLifetime, nextFilterLabel); } } - gen.addJump(gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_RA); + gen.addJump(mCountAndDropLabel); gen.defineLabel(nextFilterLabel); return filterLifetime; } @@ -764,6 +848,16 @@ public class ApfFilter { @GuardedBy("this") private byte[] mLastInstalledProgram; + /** + * For debugging only. Contains the latest APF buffer snapshot captured from the firmware. + * + * A typical size for this buffer is 4KB. It is present only if the WiFi HAL supports + * IWifiStaIface#readApfPacketFilterData(), and the APF interpreter advertised support for + * the opcodes to access the data buffer (LDDW and STDW). + */ + @GuardedBy("this") @Nullable + private byte[] mDataSnapshot; + // How many times the program was updated since we started. @GuardedBy("this") private int mNumProgramUpdates = 0; @@ -799,31 +893,37 @@ public class ApfFilter { // Pass if not ARP IPv4. gen.addLoadImmediate(Register.R0, ARP_HEADER_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, ARP_IPV4_HEADER, gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_ARP_NON_IPV4); + gen.addJumpIfBytesNotEqual(Register.R0, ARP_IPV4_HEADER, mCountAndPassLabel); // Pass if unknown ARP opcode. gen.addLoad16(Register.R0, ARP_OPCODE_OFFSET); gen.addJumpIfR0Equals(ARP_OPCODE_REQUEST, checkTargetIPv4); // Skip to unicast check - gen.addJumpIfR0NotEquals(ARP_OPCODE_REPLY, gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_ARP_UNKNOWN); + gen.addJumpIfR0NotEquals(ARP_OPCODE_REPLY, mCountAndPassLabel); // Pass if unicast reply. gen.addLoadImmediate(Register.R0, ETH_DEST_ADDR_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_ARP_UNICAST_REPLY); + gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, mCountAndPassLabel); // Either a unicast request, a unicast reply, or a broadcast reply. gen.defineLabel(checkTargetIPv4); if (mIPv4Address == null) { // When there is no IPv4 address, drop GARP replies (b/29404209). gen.addLoad32(Register.R0, ARP_TARGET_IP_ADDRESS_OFFSET); - gen.addJumpIfR0Equals(IPV4_ANY_HOST_ADDRESS, gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_GARP_REPLY); + gen.addJumpIfR0Equals(IPV4_ANY_HOST_ADDRESS, mCountAndDropLabel); } else { // When there is an IPv4 address, drop unicast/broadcast requests // and broadcast replies with a different target IPv4 address. gen.addLoadImmediate(Register.R0, ARP_TARGET_IP_ADDRESS_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, mIPv4Address, gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_ARP_OTHER_HOST); + gen.addJumpIfBytesNotEqual(Register.R0, mIPv4Address, mCountAndDropLabel); } - gen.addJump(gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_ARP); + gen.addJump(mCountAndPassLabel); } /** @@ -866,7 +966,8 @@ public class ApfFilter { // NOTE: Relies on R1 containing IPv4 header offset. gen.addAddR1(); gen.addJumpIfBytesNotEqual(Register.R0, mHardwareAddress, skipDhcpv4Filter); - gen.addJump(gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_DHCP); + gen.addJump(mCountAndPassLabel); // Drop all multicasts/broadcasts. gen.defineLabel(skipDhcpv4Filter); @@ -874,24 +975,31 @@ public class ApfFilter { // If IPv4 destination address is in multicast range, drop. gen.addLoad8(Register.R0, IPV4_DEST_ADDR_OFFSET); gen.addAnd(0xf0); - gen.addJumpIfR0Equals(0xe0, gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_IPV4_MULTICAST); + gen.addJumpIfR0Equals(0xe0, mCountAndDropLabel); // If IPv4 broadcast packet, drop regardless of L2 (b/30231088). + maybeSetCounter(gen, Counter.DROPPED_IPV4_BROADCAST_ADDR); gen.addLoad32(Register.R0, IPV4_DEST_ADDR_OFFSET); - gen.addJumpIfR0Equals(IPV4_BROADCAST_ADDRESS, gen.DROP_LABEL); + gen.addJumpIfR0Equals(IPV4_BROADCAST_ADDRESS, mCountAndDropLabel); if (mIPv4Address != null && mIPv4PrefixLength < 31) { + maybeSetCounter(gen, Counter.DROPPED_IPV4_BROADCAST_NET); int broadcastAddr = ipv4BroadcastAddress(mIPv4Address, mIPv4PrefixLength); - gen.addJumpIfR0Equals(broadcastAddr, gen.DROP_LABEL); + gen.addJumpIfR0Equals(broadcastAddr, mCountAndDropLabel); } // If L2 broadcast packet, drop. + // TODO: can we invert this condition to fall through to the common pass case below? + maybeSetCounter(gen, Counter.PASSED_IPV4_UNICAST); gen.addLoadImmediate(Register.R0, ETH_DEST_ADDR_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, gen.PASS_LABEL); - gen.addJump(gen.DROP_LABEL); + gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, mCountAndPassLabel); + maybeSetCounter(gen, Counter.DROPPED_IPV4_L2_BROADCAST); + gen.addJump(mCountAndDropLabel); } // Otherwise, pass - gen.addJump(gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_IPV4); + gen.addJump(mCountAndPassLabel); } @@ -938,14 +1046,17 @@ public class ApfFilter { // Drop all other packets sent to ff00::/8 (multicast prefix). gen.defineLabel(dropAllIPv6MulticastsLabel); + maybeSetCounter(gen, Counter.DROPPED_IPV6_NON_ICMP_MULTICAST); gen.addLoad8(Register.R0, IPV6_DEST_ADDR_OFFSET); - gen.addJumpIfR0Equals(0xff, gen.DROP_LABEL); + gen.addJumpIfR0Equals(0xff, mCountAndDropLabel); // Not multicast. Pass. - gen.addJump(gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_IPV6_UNICAST_NON_ICMP); + gen.addJump(mCountAndPassLabel); gen.defineLabel(skipIPv6MulticastFilterLabel); } else { // If not ICMPv6, pass. - gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, gen.PASS_LABEL); + maybeSetCounter(gen, Counter.PASSED_IPV6_NON_ICMP); + gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, mCountAndPassLabel); } // If we got this far, the packet is ICMPv6. Drop some specific types. @@ -954,7 +1065,8 @@ public class ApfFilter { String skipUnsolicitedMulticastNALabel = "skipUnsolicitedMulticastNA"; gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET); // Drop all router solicitations (b/32833400) - gen.addJumpIfR0Equals(ICMPV6_ROUTER_SOLICITATION, gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_IPV6_ROUTER_SOLICITATION); + gen.addJumpIfR0Equals(ICMPV6_ROUTER_SOLICITATION, mCountAndDropLabel); // If not neighbor announcements, skip filter. gen.addJumpIfR0NotEquals(ICMPV6_NEIGHBOR_ADVERTISEMENT, skipUnsolicitedMulticastNALabel); // If to ff02::1, drop. @@ -962,7 +1074,8 @@ public class ApfFilter { gen.addLoadImmediate(Register.R0, IPV6_DEST_ADDR_OFFSET); gen.addJumpIfBytesNotEqual(Register.R0, IPV6_ALL_NODES_ADDRESS, skipUnsolicitedMulticastNALabel); - gen.addJump(gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_IPV6_MULTICAST_NA); + gen.addJump(mCountAndDropLabel); gen.defineLabel(skipUnsolicitedMulticastNALabel); } @@ -985,10 +1098,18 @@ public class ApfFilter { * </ul> */ @GuardedBy("this") - private ApfGenerator beginProgramLocked() throws IllegalInstructionException { + private ApfGenerator emitPrologueLocked() throws IllegalInstructionException { // This is guaranteed to succeed because of the check in maybeCreate. ApfGenerator gen = new ApfGenerator(mApfCapabilities.apfVersionSupported); + if (mApfCapabilities.hasDataAccess()) { + // Increment TOTAL_PACKETS + maybeSetCounter(gen, Counter.TOTAL_PACKETS); + gen.addLoadData(Register.R0, 0); // load counter + gen.addAdd(1); + gen.addStoreData(Register.R0, 0); // write-back counter + } + // Here's a basic summary of what the initial program does: // // if it's a 802.3 Frame (ethtype < 0x0600): @@ -1009,12 +1130,14 @@ public class ApfFilter { if (mDrop802_3Frames) { // drop 802.3 frames (ethtype < 0x0600) - gen.addJumpIfR0LessThan(ETH_TYPE_MIN, gen.DROP_LABEL); + maybeSetCounter(gen, Counter.DROPPED_802_3_FRAME); + gen.addJumpIfR0LessThan(ETH_TYPE_MIN, mCountAndDropLabel); } // Handle ether-type black list + maybeSetCounter(gen, Counter.DROPPED_ETHERTYPE_BLACKLISTED); for (int p : mEthTypeBlackList) { - gen.addJumpIfR0Equals(p, gen.DROP_LABEL); + gen.addJumpIfR0Equals(p, mCountAndDropLabel); } // Add ARP filters: @@ -1041,8 +1164,10 @@ public class ApfFilter { // Drop non-IP non-ARP broadcasts, pass the rest gen.addLoadImmediate(Register.R0, ETH_DEST_ADDR_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, gen.PASS_LABEL); - gen.addJump(gen.DROP_LABEL); + maybeSetCounter(gen, Counter.PASSED_NON_IP_UNICAST); + gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, mCountAndPassLabel); + maybeSetCounter(gen, Counter.DROPPED_ETH_BROADCAST); + gen.addJump(mCountAndDropLabel); // Add IPv6 filters: gen.defineLabel(ipv6FilterLabel); @@ -1051,6 +1176,39 @@ public class ApfFilter { } /** + * Append packet counting epilogue to the APF program. + * + * Currently, the epilogue consists of two trampolines which count passed and dropped packets + * before jumping to the actual PASS and DROP labels. + */ + @GuardedBy("this") + private void emitEpilogue(ApfGenerator gen) throws IllegalInstructionException { + // If APFv4 is unsupported, no epilogue is necessary: if execution reached this far, it + // will just fall-through to the PASS label. + if (!mApfCapabilities.hasDataAccess()) return; + + // Execution will reach the bottom of the program if none of the filters match, + // which will pass the packet to the application processor. + maybeSetCounter(gen, Counter.PASSED_IPV6_ICMP); + + // Append the count & pass trampoline, which increments the counter at the data address + // pointed to by R1, then jumps to the pass label. This saves a few bytes over inserting + // the entire sequence inline for every counter. + gen.defineLabel(mCountAndPassLabel); + gen.addLoadData(Register.R0, 0); // R0 = *(R1 + 0) + gen.addAdd(1); // R0++ + gen.addStoreData(Register.R0, 0); // *(R1 + 0) = R0 + gen.addJump(gen.PASS_LABEL); + + // Same as above for the count & drop trampoline. + gen.defineLabel(mCountAndDropLabel); + gen.addLoadData(Register.R0, 0); // R0 = *(R1 + 0) + gen.addAdd(1); // R0++ + gen.addStoreData(Register.R0, 0); // *(R1 + 0) = R0 + gen.addJump(gen.DROP_LABEL); + } + + /** * Generate and install a new filter program. */ @GuardedBy("this") @@ -1060,22 +1218,39 @@ public class ApfFilter { ArrayList<Ra> rasToFilter = new ArrayList<>(); final byte[] program; long programMinLifetime = Long.MAX_VALUE; + long maximumApfProgramSize = mApfCapabilities.maximumApfProgramSize; + if (mApfCapabilities.hasDataAccess()) { + // Reserve space for the counters. + maximumApfProgramSize -= Counter.totalSize(); + } + try { // Step 1: Determine how many RA filters we can fit in the program. - ApfGenerator gen = beginProgramLocked(); + ApfGenerator gen = emitPrologueLocked(); + + // The epilogue normally goes after the RA filters, but add it early to include its + // length when estimating the total. + emitEpilogue(gen); + + // Can't fit the program even without any RA filters? + if (gen.programLengthOverEstimate() > maximumApfProgramSize) { + Log.e(TAG, "Program exceeds maximum size " + maximumApfProgramSize); + return; + } + for (Ra ra : mRas) { ra.generateFilterLocked(gen); // Stop if we get too big. - if (gen.programLengthOverEstimate() > mApfCapabilities.maximumApfProgramSize) break; + if (gen.programLengthOverEstimate() > maximumApfProgramSize) break; rasToFilter.add(ra); } + // Step 2: Actually generate the program - gen = beginProgramLocked(); + gen = emitPrologueLocked(); for (Ra ra : rasToFilter) { programMinLifetime = Math.min(programMinLifetime, ra.generateFilterLocked(gen)); } - // Execution will reach the end of the program if no filters match, which will pass the - // packet to the AP. + emitEpilogue(gen); program = gen.generate(); } catch (IllegalInstructionException|IllegalStateException e) { Log.e(TAG, "Failed to generate APF program.", e); @@ -1278,6 +1453,23 @@ public class ApfFilter { installNewProgramLocked(); } + static public long counterValue(byte[] data, Counter counter) + throws ArrayIndexOutOfBoundsException { + // Follow the same wrap-around addressing scheme of the interpreter. + int offset = counter.offset(); + if (offset < 0) { + offset = data.length + offset; + } + + // Decode 32bit big-endian integer into a long so we can count up beyond 2^31. + long value = 0; + for (int i = 0; i < 4; i++) { + value = value << 8 | (data[offset] & 0xFF); + offset++; + } + return value; + } + public synchronized void dump(IndentingPrintWriter pw) { pw.println("Capabilities: " + mApfCapabilities); pw.println("Receive thread: " + (mReceiveThread != null ? "RUNNING" : "STOPPED")); @@ -1319,6 +1511,32 @@ public class ApfFilter { pw.println(HexDump.toHexString(mLastInstalledProgram, false /* lowercase */)); pw.decreaseIndent(); } + + pw.println("APF packet counters: "); + pw.increaseIndent(); + if (!mApfCapabilities.hasDataAccess()) { + pw.println("APF counters not supported"); + } else if (mDataSnapshot == null) { + pw.println("No last snapshot."); + } else { + try { + Counter[] counters = Counter.class.getEnumConstants(); + for (Counter c : Arrays.asList(counters).subList(1, counters.length)) { + long value = counterValue(mDataSnapshot, c); + // Only print non-zero counters + if (value != 0) { + pw.println(c.toString() + ": " + value); + } + } + } catch (ArrayIndexOutOfBoundsException e) { + pw.println("Uh-oh: " + e); + } + if (VDBG) { + pw.println("Raw data dump: "); + pw.println(HexDump.dumpHexString(mDataSnapshot)); + } + } + pw.decreaseIndent(); } // TODO: move to android.net.NetworkUtils diff --git a/services/net/java/android/net/apf/ApfGenerator.java b/services/net/java/android/net/apf/ApfGenerator.java index 99b2fc6db472..87a1b5ea8b4d 100644 --- a/services/net/java/android/net/apf/ApfGenerator.java +++ b/services/net/java/android/net/apf/ApfGenerator.java @@ -378,8 +378,7 @@ public class ApfGenerator { } /** - * Returns true if the specified {@code version} is supported by the ApfGenerator, otherwise - * false. + * Returns true if the ApfGenerator supports the specified {@code version}, otherwise false. */ public static boolean supportsVersion(int version) { return version >= MIN_APF_VERSION; @@ -753,7 +752,7 @@ public class ApfGenerator { /** * Add an instruction to the end of the program to jump to {@code target} if the bytes of the - * packet at, an offset specified by {@code register}, match {@code bytes}. + * packet at an offset specified by {@code register} match {@code bytes}. */ public ApfGenerator addJumpIfBytesNotEqual(Register register, byte[] bytes, String target) throws IllegalInstructionException { diff --git a/services/net/java/android/net/dns/ResolvUtil.java b/services/net/java/android/net/dns/ResolvUtil.java index 97d20f4b2922..a2a6615e5f48 100644 --- a/services/net/java/android/net/dns/ResolvUtil.java +++ b/services/net/java/android/net/dns/ResolvUtil.java @@ -62,4 +62,13 @@ public class ResolvUtil { final long netidForResolv = NETID_USE_LOCAL_NAMESERVERS | (long) network.netId; return new Network((int) netidForResolv); } + + public static Network makeNetworkWithPrivateDnsBypass(Network network) { + return new Network(network) { + @Override + public InetAddress[] getAllByName(String host) throws UnknownHostException { + return blockingResolveAllLocally(network, host); + } + }; + } } diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java index 9fdb31e11f50..d6999ddf07f6 100644 --- a/services/net/java/android/net/ip/IpClient.java +++ b/services/net/java/android/net/ip/IpClient.java @@ -624,7 +624,14 @@ public class IpClient extends StateMachine { private ApfFilter mApfFilter; private boolean mMulticastFiltering; private long mStartTimeMillis; - private byte[] mApfDataSnapshot; + + /** + * Reading the snapshot is an asynchronous operation initiated by invoking + * Callback.startReadPacketFilter() and completed when the WiFi Service responds with an + * EVENT_READ_PACKET_FILTER_COMPLETE message. The mApfDataSnapshotComplete condition variable + * signals when a new snapshot is ready. + */ + private final ConditionVariable mApfDataSnapshotComplete = new ConditionVariable(); public static class Dependencies { public INetworkManagementService getNMS() { @@ -881,13 +888,21 @@ public class IpClient extends StateMachine { final ProvisioningConfiguration provisioningConfig = mConfiguration; final ApfCapabilities apfCapabilities = (provisioningConfig != null) ? provisioningConfig.mApfCapabilities : null; - final byte[] apfDataSnapshot = mApfDataSnapshot; IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); pw.println(mTag + " APF dump:"); pw.increaseIndent(); if (apfFilter != null) { + if (apfCapabilities.hasDataAccess()) { + // Request a new snapshot, then wait for it. + mApfDataSnapshotComplete.close(); + mCallback.startReadPacketFilter(); + if (!mApfDataSnapshotComplete.block(1000)) { + pw.print("TIMEOUT: DUMPING STALE APF SNAPSHOT"); + } + } apfFilter.dump(pw); + } else { pw.print("No active ApfFilter; "); if (provisioningConfig == null) { @@ -899,15 +914,6 @@ public class IpClient extends StateMachine { } } pw.decreaseIndent(); - pw.println(mTag + " latest APF data snapshot: "); - pw.increaseIndent(); - if (apfDataSnapshot != null) { - pw.println(HexDump.dumpHexString(apfDataSnapshot)); - } else { - pw.println("No last snapshot."); - } - pw.decreaseIndent(); - pw.println(); pw.println(mTag + " current ProvisioningConfiguration:"); pw.increaseIndent(); @@ -1704,7 +1710,10 @@ public class IpClient extends StateMachine { } case EVENT_READ_PACKET_FILTER_COMPLETE: { - mApfDataSnapshot = (byte[]) msg.obj; + if (mApfFilter != null) { + mApfFilter.setDataSnapshot((byte[]) msg.obj); + } + mApfDataSnapshotComplete.open(); break; } diff --git a/services/robotests/src/com/android/server/location/GnssBatchingProviderTest.java b/services/robotests/src/com/android/server/location/GnssBatchingProviderTest.java new file mode 100644 index 000000000000..504609472fa6 --- /dev/null +++ b/services/robotests/src/com/android/server/location/GnssBatchingProviderTest.java @@ -0,0 +1,91 @@ +package com.android.server.location; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.platform.test.annotations.Presubmit; + +import com.android.server.location.GnssBatchingProvider.GnssBatchingProviderNative; +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +/** + * Unit tests for {@link GnssBatchingProvider}. + */ +@RunWith(FrameworkRobolectricTestRunner.class) +@Config( + manifest = Config.NONE, + shadows = { + }, + sdk = 27 +) +@SystemLoaderPackages({"com.android.server.location"}) +@Presubmit +public class GnssBatchingProviderTest { + + private static final long PERIOD_NANOS = (long) 1e9; + private static final boolean WAKE_ON_FIFO_FULL = true; + private static final int BATCH_SIZE = 3; + @Mock + private GnssBatchingProviderNative mMockNative; + private GnssBatchingProvider mTestProvider; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mMockNative.initBatching()).thenReturn(true); + when(mMockNative.startBatch(anyLong(), anyBoolean())).thenReturn(true); + when(mMockNative.stopBatch()).thenReturn(true); + when(mMockNative.getBatchSize()).thenReturn(BATCH_SIZE); + mTestProvider = new GnssBatchingProvider(mMockNative); + mTestProvider.enable(); + mTestProvider.start(PERIOD_NANOS, WAKE_ON_FIFO_FULL); + } + + @Test + public void start_nativeStarted() { + verify(mMockNative).startBatch(eq(PERIOD_NANOS), eq(WAKE_ON_FIFO_FULL)); + } + + @Test + public void stop_nativeStopped() { + mTestProvider.stop(); + verify(mMockNative).stopBatch(); + } + + @Test + public void flush_nativeFlushed() { + mTestProvider.flush(); + verify(mMockNative).flushBatch(); + } + + @Test + public void getBatchSize_nativeGetBatchSize() { + assertThat(mTestProvider.getBatchSize()).isEqualTo(BATCH_SIZE); + } + + @Test + public void started_resume_started() { + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(2)).startBatch(eq(PERIOD_NANOS), eq(WAKE_ON_FIFO_FULL)); + } + + @Test + public void stopped_resume_notStarted() { + mTestProvider.stop(); + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(1)).startBatch(eq(PERIOD_NANOS), eq(WAKE_ON_FIFO_FULL)); + } +} diff --git a/services/robotests/src/com/android/server/location/GnssGeofenceProviderTest.java b/services/robotests/src/com/android/server/location/GnssGeofenceProviderTest.java new file mode 100644 index 000000000000..187303cc93d6 --- /dev/null +++ b/services/robotests/src/com/android/server/location/GnssGeofenceProviderTest.java @@ -0,0 +1,121 @@ +package com.android.server.location; + +import static org.mockito.Matchers.anyDouble; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.os.Looper; +import android.os.RemoteException; +import android.platform.test.annotations.Presubmit; + +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +/** + * Unit tests for {@link GnssGeofenceProvider}. + */ +@RunWith(FrameworkRobolectricTestRunner.class) +@Config( + manifest = Config.NONE, + sdk = 27 +) +@SystemLoaderPackages({"com.android.server.location"}) +@Presubmit +public class GnssGeofenceProviderTest { + private static final int GEOFENCE_ID = 12345; + private static final double LATITUDE = 10.0; + private static final double LONGITUDE = 20.0; + private static final double RADIUS = 5.0; + private static final int LAST_TRANSITION = 0; + private static final int MONITOR_TRANSITIONS = 0; + private static final int NOTIFICATION_RESPONSIVENESS = 0; + private static final int UNKNOWN_TIMER = 0; + @Mock + private GnssGeofenceProvider.GnssGeofenceProviderNative mMockNative; + private GnssGeofenceProvider mTestProvider; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mMockNative.addGeofence(anyInt(), anyDouble(), anyDouble(), anyDouble(), anyInt(), + anyInt(), anyInt(), anyInt())).thenReturn(true); + when(mMockNative.pauseGeofence(anyInt())).thenReturn(true); + when(mMockNative.removeGeofence(anyInt())).thenReturn(true); + when(mMockNative.resumeGeofence(anyInt(), anyInt())).thenReturn(true); + mTestProvider = new GnssGeofenceProvider(Looper.myLooper(), mMockNative); + mTestProvider.addCircularHardwareGeofence(GEOFENCE_ID, LATITUDE, + LONGITUDE, RADIUS, LAST_TRANSITION, MONITOR_TRANSITIONS, + NOTIFICATION_RESPONSIVENESS, + UNKNOWN_TIMER); + } + + @Test + public void addGeofence_nativeAdded() { + verify(mMockNative).addGeofence(eq(GEOFENCE_ID), eq(LATITUDE), eq(LONGITUDE), + eq(RADIUS), eq(LAST_TRANSITION), eq(MONITOR_TRANSITIONS), + eq(NOTIFICATION_RESPONSIVENESS), + eq(UNKNOWN_TIMER)); + } + + @Test + public void pauseGeofence_nativePaused() { + mTestProvider.pauseHardwareGeofence(GEOFENCE_ID); + verify(mMockNative).pauseGeofence(eq(GEOFENCE_ID)); + } + + @Test + public void removeGeofence_nativeRemoved() { + mTestProvider.removeHardwareGeofence(GEOFENCE_ID); + verify(mMockNative).removeGeofence(eq(GEOFENCE_ID)); + } + + @Test + public void resumeGeofence_nativeResumed() { + mTestProvider.pauseHardwareGeofence(GEOFENCE_ID); + mTestProvider.resumeHardwareGeofence(GEOFENCE_ID, MONITOR_TRANSITIONS); + verify(mMockNative).resumeGeofence(eq(GEOFENCE_ID), eq(MONITOR_TRANSITIONS)); + } + + @Test + public void addGeofence_restart_added() throws RemoteException { + mTestProvider.resumeIfStarted(); + + verify(mMockNative, times(2)).addGeofence(eq(GEOFENCE_ID), eq(LATITUDE), eq(LONGITUDE), + eq(RADIUS), eq(LAST_TRANSITION), eq(MONITOR_TRANSITIONS), + eq(NOTIFICATION_RESPONSIVENESS), + eq(UNKNOWN_TIMER)); + } + + @Test + public void removeGeofence_restart_notAdded() throws RemoteException { + mTestProvider.removeHardwareGeofence(GEOFENCE_ID); + mTestProvider.resumeIfStarted(); + + verify(mMockNative, times(1)).addGeofence(eq(GEOFENCE_ID), eq(LATITUDE), eq(LONGITUDE), + eq(RADIUS), eq(LAST_TRANSITION), eq(MONITOR_TRANSITIONS), + eq(NOTIFICATION_RESPONSIVENESS), + eq(UNKNOWN_TIMER)); + } + + @Test + public void pauseGeofence_restart_paused() throws RemoteException { + mTestProvider.pauseHardwareGeofence(GEOFENCE_ID); + mTestProvider.resumeIfStarted(); + + verify(mMockNative, times(2)).addGeofence(eq(GEOFENCE_ID), eq(LATITUDE), eq(LONGITUDE), + eq(RADIUS), eq(LAST_TRANSITION), eq(MONITOR_TRANSITIONS), + eq(NOTIFICATION_RESPONSIVENESS), + eq(UNKNOWN_TIMER)); + verify(mMockNative, times(2)).pauseGeofence(eq(GEOFENCE_ID)); + } +} diff --git a/services/robotests/src/com/android/server/location/GnssMeasurementsProviderTest.java b/services/robotests/src/com/android/server/location/GnssMeasurementsProviderTest.java new file mode 100644 index 000000000000..23d6cf69edc6 --- /dev/null +++ b/services/robotests/src/com/android/server/location/GnssMeasurementsProviderTest.java @@ -0,0 +1,90 @@ +package com.android.server.location; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.os.Handler; +import android.os.Looper; +import android.platform.test.annotations.Presubmit; + +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +/** + * Unit tests for {@link GnssMeasurementsProvider}. + */ +@RunWith(FrameworkRobolectricTestRunner.class) +@Config( + manifest = Config.NONE, + sdk = 27 +) +@SystemLoaderPackages({"com.android.server.location"}) +@Presubmit +public class GnssMeasurementsProviderTest { + @Mock + private GnssMeasurementsProvider.GnssMeasurementProviderNative mMockNative; + private GnssMeasurementsProvider mTestProvider; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mMockNative.startMeasurementCollection(anyBoolean())).thenReturn(true); + when(mMockNative.stopMeasurementCollection()).thenReturn(true); + + mTestProvider = new GnssMeasurementsProvider(RuntimeEnvironment.application, + new Handler(Looper.myLooper()), mMockNative) { + @Override + public boolean isGpsEnabled() { + return true; + } + }; + } + + @Test + public void register_nativeStarted() { + mTestProvider.registerWithService(); + verify(mMockNative).startMeasurementCollection(anyBoolean()); + } + + @Test + public void unregister_nativeStopped() { + mTestProvider.registerWithService(); + mTestProvider.unregisterFromService(); + verify(mMockNative).stopMeasurementCollection(); + } + + @Test + public void isSupported_nativeIsSupported() { + when(mMockNative.isMeasurementSupported()).thenReturn(true); + assertThat(mTestProvider.isAvailableInPlatform()).isTrue(); + + when(mMockNative.isMeasurementSupported()).thenReturn(false); + assertThat(mTestProvider.isAvailableInPlatform()).isFalse(); + } + + @Test + public void register_resume_started() { + mTestProvider.registerWithService(); + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(2)).startMeasurementCollection(anyBoolean()); + } + + @Test + public void unregister_resume_notStarted() { + mTestProvider.registerWithService(); + mTestProvider.unregisterFromService(); + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(1)).startMeasurementCollection(anyBoolean()); + } +} diff --git a/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java b/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java new file mode 100644 index 000000000000..8d3de3c9dbc1 --- /dev/null +++ b/services/robotests/src/com/android/server/location/GnssNavigationMessageProviderTest.java @@ -0,0 +1,89 @@ +package com.android.server.location; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.os.Handler; +import android.os.Looper; +import android.platform.test.annotations.Presubmit; + +import com.android.server.testing.FrameworkRobolectricTestRunner; +import com.android.server.testing.SystemLoaderPackages; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +/** + * Unit tests for {@link GnssNavigationMessageProvider}. + */ +@RunWith(FrameworkRobolectricTestRunner.class) +@Config( + manifest = Config.NONE, + sdk = 27 +) +@SystemLoaderPackages({"com.android.server.location"}) +@Presubmit +public class GnssNavigationMessageProviderTest { + @Mock + private GnssNavigationMessageProvider.GnssNavigationMessageProviderNative mMockNative; + private GnssNavigationMessageProvider mTestProvider; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mMockNative.startNavigationMessageCollection()).thenReturn(true); + when(mMockNative.stopNavigationMessageCollection()).thenReturn(true); + + mTestProvider = new GnssNavigationMessageProvider(new Handler(Looper.myLooper()), + mMockNative) { + @Override + public boolean isGpsEnabled() { + return true; + } + }; + } + + @Test + public void register_nativeStarted() { + mTestProvider.registerWithService(); + verify(mMockNative).startNavigationMessageCollection(); + } + + @Test + public void unregister_nativeStopped() { + mTestProvider.registerWithService(); + mTestProvider.unregisterFromService(); + verify(mMockNative).stopNavigationMessageCollection(); + } + + @Test + public void isSupported_nativeIsSupported() { + when(mMockNative.isNavigationMessageSupported()).thenReturn(true); + assertThat(mTestProvider.isAvailableInPlatform()).isTrue(); + + when(mMockNative.isNavigationMessageSupported()).thenReturn(false); + assertThat(mTestProvider.isAvailableInPlatform()).isFalse(); + } + + @Test + public void register_resume_started() { + mTestProvider.registerWithService(); + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(2)).startNavigationMessageCollection(); + } + + @Test + public void unregister_resume_notStarted() { + mTestProvider.registerWithService(); + mTestProvider.unregisterFromService(); + mTestProvider.resumeIfStarted(); + verify(mMockNative, times(1)).startNavigationMessageCollection(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java index 43701e900ab1..c004074d241b 100644 --- a/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java @@ -898,6 +898,10 @@ public class ColorDisplayServiceTest { @Test public void accessibility_colorInversion_transformActivated() { + if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) { + return; + } + setAccessibilityColorInversion(true); setColorMode(ColorDisplayController.COLOR_MODE_NATURAL); @@ -909,6 +913,10 @@ public class ColorDisplayServiceTest { @Test public void accessibility_colorCorrection_transformActivated() { + if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) { + return; + } + setAccessibilityColorCorrection(true); setColorMode(ColorDisplayController.COLOR_MODE_NATURAL); @@ -920,6 +928,10 @@ public class ColorDisplayServiceTest { @Test public void accessibility_all_transformActivated() { + if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) { + return; + } + setAccessibilityColorCorrection(true); setAccessibilityColorInversion(true); setColorMode(ColorDisplayController.COLOR_MODE_NATURAL); @@ -932,6 +944,10 @@ public class ColorDisplayServiceTest { @Test public void accessibility_none_transformActivated() { + if (!mContext.getResources().getConfiguration().isScreenWideColorGamut()) { + return; + } + setAccessibilityColorCorrection(false); setAccessibilityColorInversion(false); setColorMode(ColorDisplayController.COLOR_MODE_NATURAL); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java index 98bf53c9d55f..6ce7bbe6117e 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java @@ -17,14 +17,17 @@ package com.android.server.accessibility; import android.accessibilityservice.FingerprintGestureController; +import android.content.res.Resources; import android.hardware.fingerprint.IFingerprintService; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.view.KeyEvent; import com.android.server.accessibility.FingerprintGestureDispatcher.FingerprintGestureClient; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -49,16 +52,27 @@ public class FingerprintGestureDispatcherTest { private @Mock IFingerprintService mMockFingerprintService; private @Mock FingerprintGestureClient mNonGestureCapturingClient; private @Mock FingerprintGestureClient mGestureCapturingClient; - private @Mock FingerprintGestureDispatcher mFingerprintGestureDispatcher; + private @Mock Resources mMockResources; + private MessageCapturingHandler mMessageCapturingHandler; + private FingerprintGestureDispatcher mFingerprintGestureDispatcher; + + @BeforeClass + public static void oneTimeInitialization() { + if (Looper.myLooper() == null) { + Looper.prepare(); + } + } @Before public void setup() { MockitoAnnotations.initMocks(this); + // For most tests, we support fingerprint gestures + when(mMockResources.getBoolean(anyInt())).thenReturn(true); mMessageCapturingHandler = new MessageCapturingHandler( msg -> mFingerprintGestureDispatcher.handleMessage(msg)); mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(mMockFingerprintService, - new Object(), mMessageCapturingHandler); + mMockResources, new Object(), mMessageCapturingHandler); when(mNonGestureCapturingClient.isCapturingFingerprintGestures()).thenReturn(false); when(mGestureCapturingClient.isCapturingFingerprintGestures()).thenReturn(true); } @@ -149,10 +163,23 @@ public class FingerprintGestureDispatcherTest { } @Test - public void testIsGestureDetectionActive_dependsOnFingerprintService() throws Exception { + public void testIsGestureDetectionAvailable_dependsOnFingerprintService() throws Exception { when(mMockFingerprintService.isClientActive()).thenReturn(true); assertFalse(mFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable()); when(mMockFingerprintService.isClientActive()).thenReturn(false); assertTrue(mFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable()); } + + @Test + public void ifGestureDectionNotSupported_neverSaysAvailable() throws Exception { + when(mMockResources.getBoolean(anyInt())).thenReturn(false); + // Need to create a new dispatcher, since it picks up the resource value in its + // constructor. This is fine since hardware config values don't change dynamically. + FingerprintGestureDispatcher fingerprintGestureDispatcher = + new FingerprintGestureDispatcher(mMockFingerprintService, mMockResources, + new Object(), mMessageCapturingHandler); + + when(mMockFingerprintService.isClientActive()).thenReturn(false); + assertFalse(fingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable()); + } } diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java index 592f7b16470f..b73ac8934cb0 100644 --- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java +++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; @@ -303,6 +304,8 @@ public class RecentTasksTest extends ActivityTestsBase { @Test public void testAddTaskCompatibleActivityType_expectRemove() throws Exception { + // Test with undefined activity type since the type is not persisted by the task persister + // and we want to ensure that a new task will match a restored task Configuration config1 = new Configuration(); config1.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED); TaskRecord task1 = createTaskBuilder(".Task1") @@ -355,6 +358,65 @@ public class RecentTasksTest extends ActivityTestsBase { } @Test + public void testAddTaskCompatibleWindowingMode_expectRemove() throws Exception { + Configuration config1 = new Configuration(); + config1.windowConfiguration.setWindowingMode(WINDOWING_MODE_UNDEFINED); + TaskRecord task1 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + task1.onConfigurationChanged(config1); + assertTrue(task1.getWindowingMode() == WINDOWING_MODE_UNDEFINED); + mRecentTasks.add(task1); + mCallbacksRecorder.clear(); + + Configuration config2 = new Configuration(); + config2.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + TaskRecord task2 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + task2.onConfigurationChanged(config2); + assertTrue(task2.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + mRecentTasks.add(task2); + + assertTrue(mCallbacksRecorder.added.size() == 1); + assertTrue(mCallbacksRecorder.added.contains(task2)); + assertTrue(mCallbacksRecorder.trimmed.isEmpty()); + assertTrue(mCallbacksRecorder.removed.size() == 1); + assertTrue(mCallbacksRecorder.removed.contains(task1)); + } + + @Test + public void testAddTaskIncompatibleWindowingMode_expectNoRemove() throws Exception { + Configuration config1 = new Configuration(); + config1.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + TaskRecord task1 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + task1.onConfigurationChanged(config1); + assertTrue(task1.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + mRecentTasks.add(task1); + + Configuration config2 = new Configuration(); + config2.windowConfiguration.setWindowingMode(WINDOWING_MODE_PINNED); + TaskRecord task2 = createTaskBuilder(".Task1") + .setFlags(FLAG_ACTIVITY_NEW_TASK) + .setStack(mStack) + .build(); + task2.onConfigurationChanged(config2); + assertTrue(task2.getWindowingMode() == WINDOWING_MODE_PINNED); + mRecentTasks.add(task2); + + assertTrue(mCallbacksRecorder.added.size() == 2); + assertTrue(mCallbacksRecorder.added.contains(task1)); + assertTrue(mCallbacksRecorder.added.contains(task2)); + assertTrue(mCallbacksRecorder.trimmed.isEmpty()); + assertTrue(mCallbacksRecorder.removed.isEmpty()); + } + + @Test public void testUsersTasks() throws Exception { mRecentTasks.setOnlyTestVisibleRange(); diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java index c91e22f84a07..057fdc8c10bb 100644 --- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java +++ b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java @@ -17,6 +17,9 @@ package com.android.server.am; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -62,7 +65,7 @@ import java.util.Comparator; * Tests for exercising {@link TaskRecord}. * * Build/Install/Run: - * bit FrameworksServicesTests:com.android.server.am.TaskRecordTests + * atest FrameworksServicesTests:com.android.server.am.TaskRecordTests */ @MediumTest @Presubmit @@ -113,6 +116,18 @@ public class TaskRecordTests extends ActivityTestsBase { assertTrue(factory.mCreated); } + @Test + public void testReturnsToHomeStack() throws Exception { + final TaskRecord task = createTaskRecord(1); + assertFalse(task.returnsToHomeStack()); + task.intent = null; + assertFalse(task.returnsToHomeStack()); + task.intent = new Intent(); + assertFalse(task.returnsToHomeStack()); + task.intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME); + assertTrue(task.returnsToHomeStack()); + } + private File serializeToFile(TaskRecord r) throws IOException, XmlPullParserException { final File tmpFile = File.createTempFile(r.taskId + "_task_", "xml"); diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java index 6019958d0650..ff631e74e004 100644 --- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java @@ -545,7 +545,7 @@ public class BoundsAnimationControllerTests extends WindowTestsBase { .restart(BOUNDS_SMALLER_FLOATING, false /* expectStartedAndPipModeChangedCallback */) .end() - .expectEnded(SCHEDULE_PIP_MODE_CHANGED, !MOVE_TO_FULLSCREEN); + .expectEnded(SCHEDULE_PIP_MODE_CHANGED, MOVE_TO_FULLSCREEN); } /** !F->!F w/ CANCEL **/ diff --git a/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java index 51b019a4d61e..204e26cee532 100644 --- a/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java @@ -24,27 +24,29 @@ import static org.junit.Assert.assertTrue; public class RootWindowContainerTests extends WindowTestsBase { @Test public void testSetDisplayOverrideConfigurationIfNeeded() throws Exception { - // Add first stack we expect to be updated with configuration change. - final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); - stack.getOverrideConfiguration().windowConfiguration.setBounds(new Rect(0, 0, 5, 5)); - - // Add second task that will be set for deferred removal that should not be returned - // with the configuration change. - final TaskStack deferredDeletedStack = createTaskStackOnDisplay(mDisplayContent); - deferredDeletedStack.getOverrideConfiguration().windowConfiguration.setBounds( - new Rect(0, 0, 5, 5)); - deferredDeletedStack.mDeferRemoval = true; - - final Configuration override = new Configuration( - mDisplayContent.getOverrideConfiguration()); - override.windowConfiguration.setBounds(new Rect(0, 0, 10, 10)); - - // Set display override. - final int[] results = sWm.mRoot.setDisplayOverrideConfigurationIfNeeded(override, - mDisplayContent.getDisplayId()); - - // Ensure only first stack is returned. - assertTrue(results.length == 1); - assertTrue(results[0] == stack.mStackId); + synchronized (sWm.mWindowMap) { + // Add first stack we expect to be updated with configuration change. + final TaskStack stack = createTaskStackOnDisplay(mDisplayContent); + stack.getOverrideConfiguration().windowConfiguration.setBounds(new Rect(0, 0, 5, 5)); + + // Add second task that will be set for deferred removal that should not be returned + // with the configuration change. + final TaskStack deferredDeletedStack = createTaskStackOnDisplay(mDisplayContent); + deferredDeletedStack.getOverrideConfiguration().windowConfiguration.setBounds( + new Rect(0, 0, 5, 5)); + deferredDeletedStack.mDeferRemoval = true; + + final Configuration override = new Configuration( + mDisplayContent.getOverrideConfiguration()); + override.windowConfiguration.setBounds(new Rect(0, 0, 10, 10)); + + // Set display override. + final int[] results = sWm.mRoot.setDisplayOverrideConfigurationIfNeeded(override, + mDisplayContent.getDisplayId()); + + // Ensure only first stack is returned. + assertTrue(results.length == 1); + assertTrue(results[0] == stack.mStackId); + } } } diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java index 80cbf2aae3f0..13478dfded34 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java @@ -16,6 +16,8 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -164,8 +166,10 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa @Test public void testIsRealSnapshotPersistAndLoadSnapshot() { - TaskSnapshot a = createSnapshot(1f /* scale */, true /* isRealSnapshot */); - TaskSnapshot b = createSnapshot(1f /* scale */, false /* isRealSnapshot */); + TaskSnapshot a = createSnapshot(1f /* scale */, true /* isRealSnapshot */, + WINDOWING_MODE_FULLSCREEN); + TaskSnapshot b = createSnapshot(1f /* scale */, false /* isRealSnapshot */, + WINDOWING_MODE_FULLSCREEN); assertTrue(a.isRealSnapshot()); assertFalse(b.isRealSnapshot()); mPersister.persistSnapshot(1, mTestUserId, a); @@ -180,6 +184,25 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa } @Test + public void testWindowingModePersistAndLoadSnapshot() { + TaskSnapshot a = createSnapshot(1f /* scale */, true /* isRealSnapshot */, + WINDOWING_MODE_FULLSCREEN); + TaskSnapshot b = createSnapshot(1f /* scale */, true /* isRealSnapshot */, + WINDOWING_MODE_PINNED); + assertTrue(a.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + assertTrue(b.getWindowingMode() == WINDOWING_MODE_PINNED); + mPersister.persistSnapshot(1, mTestUserId, a); + mPersister.persistSnapshot(2, mTestUserId, b); + mPersister.waitForQueueEmpty(); + final TaskSnapshot snapshotA = mLoader.loadTask(1, mTestUserId, false /* reduced */); + final TaskSnapshot snapshotB = mLoader.loadTask(2, mTestUserId, false /* reduced */); + assertNotNull(snapshotA); + assertNotNull(snapshotB); + assertTrue(snapshotA.getWindowingMode() == WINDOWING_MODE_FULLSCREEN); + assertTrue(snapshotB.getWindowingMode() == WINDOWING_MODE_PINNED); + } + + @Test public void testRemoveObsoleteFiles() { mPersister.persistSnapshot(1, mTestUserId, createSnapshot()); mPersister.persistSnapshot(2, mTestUserId, createSnapshot()); diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java index 2ad5bf404052..6a4acbe47beb 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE; import static android.graphics.GraphicBuffer.USAGE_SW_READ_RARELY; @@ -84,16 +85,16 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase { } TaskSnapshot createSnapshot(float scale) { - return createSnapshot(scale, true /* isRealSnapshot */); + return createSnapshot(scale, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN); } - TaskSnapshot createSnapshot(float scale, boolean isRealSnapshot) { + TaskSnapshot createSnapshot(float scale, boolean isRealSnapshot, int windowingMode) { final GraphicBuffer buffer = GraphicBuffer.create(100, 100, PixelFormat.RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_READ_RARELY | USAGE_SW_READ_RARELY); Canvas c = buffer.lockCanvas(); c.drawColor(Color.RED); buffer.unlockCanvasAndPost(c); return new TaskSnapshot(buffer, ORIENTATION_PORTRAIT, TEST_INSETS, - scale < 1f /* reducedResolution */, scale, isRealSnapshot); + scale < 1f /* reducedResolution */, scale, isRealSnapshot, windowingMode); } } diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java index d5334babc1a6..54d02d4f2ad2 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static org.junit.Assert.assertEquals; @@ -60,7 +61,8 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase { final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888, GraphicBuffer.USAGE_SW_READ_NEVER | GraphicBuffer.USAGE_SW_WRITE_NEVER); final TaskSnapshot snapshot = new TaskSnapshot(buffer, - ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */); + ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */, + WINDOWING_MODE_FULLSCREEN); mSurface = new TaskSnapshotSurface(sWm, new Window(), new Surface(), snapshot, "Test", Color.WHITE, Color.RED, Color.BLUE, sysuiVis, windowFlags, 0, taskBounds, ORIENTATION_PORTRAIT); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java index 41e446b95fba..513c1ecda990 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java @@ -208,7 +208,8 @@ public class WindowConfigurationTests extends WindowTestsBase { final WindowConfiguration winConfig = config.windowConfiguration; stackController.adjustConfigurationForBounds(bounds, null /*insetBounds*/, new Rect() /*nonDecorBounds*/, new Rect() /*stableBounds*/, false /*overrideWidth*/, - false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig); + false /*overrideHeight*/, mDisplayInfo.logicalDensityDpi, config, parentConfig, + windowingMode); // Assert that both expected and actual are null or are equal to each other assertEquals(expectedConfigBounds, winConfig.getAppBounds()); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java index 8446d252323f..6c7830e5cf79 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java @@ -17,6 +17,8 @@ package com.android.server.wm; import android.support.test.filters.FlakyTest; +import android.view.SurfaceControl; +import android.view.SurfaceSession; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,6 +45,9 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyFloat; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -108,6 +113,21 @@ public class WindowContainerTests extends WindowTestsBase { } @Test + public void testAddChildSetsSurfacePosition() throws Exception { + MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(); + + final SurfaceControl.Transaction transaction = mock(SurfaceControl.Transaction.class); + sWm.mTransactionFactory = () -> transaction; + + WindowContainer child = new WindowContainer(sWm); + child.setBounds(1, 1, 10, 10); + + verify(transaction, never()).setPosition(any(), anyFloat(), anyFloat()); + top.addChild(child, 0); + verify(transaction, times(1)).setPosition(any(), eq(1.f), eq(1.f)); + } + + @Test public void testAdd_AlreadyHasParent() throws Exception { final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(); final TestWindowContainer root = builder.setLayer(0).build(); @@ -825,4 +845,28 @@ public class WindowContainerTests extends WindowTestsBase { return new TestWindowContainer(mLayer, mIsAnimating, mIsVisible, mOrientation); } } + + private class MockSurfaceBuildingContainer extends WindowContainer<WindowContainer> { + final SurfaceSession mSession = new SurfaceSession(); + + MockSurfaceBuildingContainer() { + super(sWm); + } + + class MockSurfaceBuilder extends SurfaceControl.Builder { + MockSurfaceBuilder(SurfaceSession ss) { + super(ss); + } + + @Override + public SurfaceControl build() { + return mock(SurfaceControl.class); + } + } + + @Override + SurfaceControl.Builder makeChildSurface(WindowContainer child) { + return new MockSurfaceBuilder(mSession); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java index d74defcbeb7c..2e4740b57255 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java @@ -34,6 +34,7 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyFloat; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -72,7 +73,7 @@ public class WindowTestUtils { config.windowConfiguration.setBounds(bounds); return null; }).when(controller).adjustConfigurationForBounds(any(), any(), any(), any(), - anyBoolean(), anyBoolean(), anyFloat(), any(), any()); + anyBoolean(), anyBoolean(), anyFloat(), any(), any(), anyInt()); return controller; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java index 4668ed42b11e..d0a656c69f43 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java @@ -343,7 +343,7 @@ public class ManagedServicesTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(baos.toByteArray())), null); parser.nextTag(); - service.readXml(parser); + service.readXml(parser, null); verifyExpectedApprovedEntries(service); assertFalse(service.isPackageOrComponentAllowed("this.is.a.package.name", 0)); @@ -665,7 +665,7 @@ public class ManagedServicesTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.toString().getBytes())), null); parser.nextTag(); - service.readXml(parser); + service.readXml(parser, null); } private void addExpectedServices(final ManagedServices service, final List<String> packages, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java index a8b9dff7b3e2..f9a4f784bf4f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java @@ -124,7 +124,7 @@ public class NotificationAssistantsTest extends UiServiceTestCase { parser.setInput(new BufferedInputStream( new ByteArrayInputStream(xml.toString().getBytes())), null); parser.nextTag(); - mAssistants.readXml(parser); + mAssistants.readXml(parser, null); verify(mNm, never()).readDefaultAssistant(anyInt()); verify(mAssistants, times(1)).addApprovedList( diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java index 30fae01f3036..7ee050174d3c 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java @@ -138,12 +138,14 @@ public class NotificationComparatorTest extends UiServiceTestCase { mRecordInlineReply.setUserImportance(NotificationManager.IMPORTANCE_HIGH); mRecordInlineReply.setPackagePriority(Notification.PRIORITY_MAX); - Notification n5 = new Notification.Builder(mContext, TEST_CHANNEL_ID) - .setCategory(Notification.CATEGORY_MESSAGE).build(); - mRecordSms = new NotificationRecord(mContext, new StatusBarNotification(smsPkg, - smsPkg, 1, "sms", smsUid, smsUid, n5, new UserHandle(userId), - "", 1299), getDefaultChannel()); - mRecordSms.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT); + if (smsPkg != null) { + Notification n5 = new Notification.Builder(mContext, TEST_CHANNEL_ID) + .setCategory(Notification.CATEGORY_MESSAGE).build(); + mRecordSms = new NotificationRecord(mContext, new StatusBarNotification(smsPkg, + smsPkg, 1, "sms", smsUid, smsUid, n5, new UserHandle(userId), + "", 1299), getDefaultChannel()); + mRecordSms.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT); + } Notification n6 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build(); mRecordStarredContact = new NotificationRecord(mContext, new StatusBarNotification(pkg2, @@ -230,7 +232,9 @@ public class NotificationComparatorTest extends UiServiceTestCase { expected.add(mRecordColorized); expected.add(mRecordHighCall); expected.add(mRecordInlineReply); - expected.add(mRecordSms); + if (mRecordSms != null) { + expected.add(mRecordSms); + } expected.add(mRecordStarredContact); expected.add(mRecordContact); expected.add(mRecordEmail); @@ -253,7 +257,9 @@ public class NotificationComparatorTest extends UiServiceTestCase { public void testMessaging() throws Exception { NotificationComparator comp = new NotificationComparator(mContext); assertTrue(comp.isImportantMessaging(mRecordInlineReply)); - assertTrue(comp.isImportantMessaging(mRecordSms)); + if (mRecordSms != null) { + assertTrue(comp.isImportantMessaging(mRecordSms)); + } assertFalse(comp.isImportantMessaging(mRecordEmail)); assertFalse(comp.isImportantMessaging(mRecordCheater)); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 0c2928a9051f..eb1c9975cb7e 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -80,6 +80,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; +import android.content.res.Resources; import android.graphics.Color; import android.media.AudioAttributes; import android.media.AudioManager; @@ -105,6 +106,7 @@ import android.testing.TestableLooper.RunWithLooper; import android.util.ArrayMap; import android.util.AtomicFile; +import com.android.internal.R; import com.android.internal.statusbar.NotificationVisibility; import com.android.server.UiServiceTestCase; import com.android.server.lights.Light; @@ -160,6 +162,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Mock ActivityManager mActivityManager; NotificationManagerService.WorkerHandler mHandler; + @Mock + Resources mResources; private NotificationChannel mTestNotificationChannel = new NotificationChannel( TEST_CHANNEL_ID, TEST_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT); @@ -391,7 +395,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { public void testCreateNotificationChannels_NullChannelThrowsException() throws Exception { try { mBinderService.createNotificationChannels(PKG, - new ParceledListSlice(Arrays.asList(null))); + new ParceledListSlice(Arrays.asList((Object[])null))); fail("Exception should be thrown immediately."); } catch (NullPointerException e) { // pass @@ -2197,9 +2201,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { + "</notification-policy>"; mService.readPolicyXml( new BufferedInputStream(new ByteArrayInputStream(upgradeXml.getBytes())), false); - verify(mListeners, times(1)).readXml(any()); - verify(mConditionProviders, times(1)).readXml(any()); - verify(mAssistants, times(1)).readXml(any()); + verify(mListeners, times(1)).readXml(any(), any()); + verify(mConditionProviders, times(1)).readXml(any(), any()); + verify(mAssistants, times(1)).readXml(any(), any()); // numbers are inflated for setup verify(mListeners, times(1)).migrateToXml(); @@ -2216,9 +2220,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { + "</notification-policy>"; mService.readPolicyXml( new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false); - verify(mListeners, never()).readXml(any()); - verify(mConditionProviders, never()).readXml(any()); - verify(mAssistants, never()).readXml(any()); + verify(mListeners, never()).readXml(any(), any()); + verify(mConditionProviders, never()).readXml(any(), any()); + verify(mAssistants, never()).readXml(any(), any()); // numbers are inflated for setup verify(mListeners, times(2)).migrateToXml(); @@ -2780,4 +2784,70 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { verify(mListeners, times(1)).notifyHiddenLocked(captor.capture()); assertEquals(0, captor.getValue().size()); } + + @Test + public void testCanUseManagedServicesLowRamNoWatchNullPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false); + when(mActivityManager.isLowRamDevice()).thenReturn(true); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(false, mService.canUseManagedServices(null)); + } + + @Test + public void testCanUseManagedServicesLowRamNoWatchValidPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false); + when(mActivityManager.isLowRamDevice()).thenReturn(true); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(true, mService.canUseManagedServices("b")); + } + + @Test + public void testCanUseManagedServicesLowRamNoWatchNoValidPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false); + when(mActivityManager.isLowRamDevice()).thenReturn(true); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(false, mService.canUseManagedServices("d")); + } + + @Test + public void testCanUseManagedServicesLowRamWatchNoValidPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(true); + when(mActivityManager.isLowRamDevice()).thenReturn(true); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(true, mService.canUseManagedServices("d")); + } + + @Test + public void testCanUseManagedServicesNoLowRamNoWatchValidPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false); + when(mActivityManager.isLowRamDevice()).thenReturn(false); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(true, mService.canUseManagedServices("d")); + } + + @Test + public void testCanUseManagedServicesNoLowRamWatchValidPkg() { + when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(true); + when(mActivityManager.isLowRamDevice()).thenReturn(false); + when(mResources.getStringArray(R.array.config_allowedManagedServicesOnLowRamDevices)) + .thenReturn(new String[] {"a", "b", "c"}); + when(mContext.getResources()).thenReturn(mResources); + + assertEquals(true, mService.canUseManagedServices("d")); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java index 9f7205b8efc8..d846d213c5b6 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java @@ -25,6 +25,8 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; import android.app.ActivityManager; import android.app.Notification; @@ -33,6 +35,8 @@ import android.app.PendingIntent; import android.app.RemoteInput; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Icon; @@ -57,20 +61,29 @@ public class NotificationTest extends UiServiceTestCase { @Mock ActivityManager mAm; + @Mock + Resources mResources; + @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test - public void testStripsExtendersInLowRamMode() { + public void testStripsExtendersInLowRamModeNoWhitelistNoTv() { Notification.Builder nb = new Notification.Builder(mContext, "channel"); nb.extend(new Notification.CarExtender().setColor(Color.RED)); nb.extend(new Notification.TvExtender().setChannelId("different channel")); nb.extend(new Notification.WearableExtender().setDismissalId("dismiss")); Notification before = nb.build(); - Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true); + // No whitelist + Context context = spy(getContext()); + when(context.getResources()).thenReturn(mResources); + when(mResources.getStringArray(anyInt())).thenReturn(new String[0]); + + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true, + context); assertEquals("different channel", new Notification.TvExtender(before).getChannelId()); assertNull(new Notification.TvExtender(after).getChannelId()); @@ -83,8 +96,34 @@ public class NotificationTest extends UiServiceTestCase { } @Test + public void testStripsExtendersInLowRamModeHasWhitelist() { + Notification.Builder nb = new Notification.Builder(mContext, "channel"); + nb.extend(new Notification.CarExtender().setColor(Color.RED)); + nb.extend(new Notification.TvExtender().setChannelId("different channel")); + nb.extend(new Notification.WearableExtender().setDismissalId("dismiss")); + Notification before = nb.build(); + + // Has whitelist + Context context = spy(mContext); + when(context.getResources()).thenReturn(mResources); + when(mResources.getStringArray(anyInt())).thenReturn(new String[1]); + + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true, + context); + + assertEquals("different channel", new Notification.TvExtender(before).getChannelId()); + assertEquals("different channel", new Notification.TvExtender(after).getChannelId()); + + assertEquals(Color.RED, new Notification.CarExtender(before).getColor()); + assertEquals(Color.RED, new Notification.CarExtender(after).getColor()); + + assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId()); + assertEquals("dismiss", new Notification.WearableExtender(after).getDismissalId()); + } + + @Test public void testStripsRemoteViewsInLowRamMode() { - Context context = spy(getContext()); + Context context = spy(mContext); ApplicationInfo ai = new ApplicationInfo(); ai.targetSdkVersion = Build.VERSION_CODES.M; when(context.getApplicationInfo()).thenReturn(ai); @@ -97,7 +136,8 @@ public class NotificationTest extends UiServiceTestCase { .setStyle(style) .build(); - Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true); + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true, + mContext); assertNotNull(before.contentView); assertNotNull(before.bigContentView); assertNotNull(before.headsUpContentView); @@ -113,7 +153,8 @@ public class NotificationTest extends UiServiceTestCase { nb.extend(new Notification.TvExtender().setChannelId("different channel")); nb.extend(new Notification.WearableExtender().setDismissalId("dismiss")); Notification before = nb.build(); - Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, false); + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, false, + mContext); assertTrue(before == after); diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java index d49ba3ea3b4d..43a4e277a582 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java @@ -93,7 +93,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase { mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); - verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), eq("pkg")); + verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), anyString()); } @Test @@ -126,4 +126,4 @@ public class SliceManagerServiceTest extends UiServiceTestCase { verify(mContextSpy).checkPermission(eq("perm2"), eq(Process.myPid()), eq(Process.myUid())); } -}
\ No newline at end of file +} diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index 920a6059f10c..97c5ac911563 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -81,7 +81,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; -import android.provider.Settings; +import android.provider.Settings.Global; import android.telephony.TelephonyManager; import android.util.ArraySet; import android.util.KeyValueListParser; @@ -1439,8 +1439,10 @@ public class AppStandbyController { boolean isAppIdleEnabled() { final boolean buildFlag = mContext.getResources().getBoolean( com.android.internal.R.bool.config_enableAutoPowerModes); - final boolean runtimeFlag = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.APP_STANDBY_ENABLED, 1) == 1; + final boolean runtimeFlag = Global.getInt(mContext.getContentResolver(), + Global.APP_STANDBY_ENABLED, 1) == 1 + && Global.getInt(mContext.getContentResolver(), + Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, 1) == 1; return buildFlag && runtimeFlag; } @@ -1489,8 +1491,8 @@ public class AppStandbyController { } String getAppIdleSettings() { - return Settings.Global.getString(mContext.getContentResolver(), - Settings.Global.APP_IDLE_CONSTANTS); + return Global.getString(mContext.getContentResolver(), + Global.APP_IDLE_CONSTANTS); } } @@ -1610,7 +1612,7 @@ public class AppStandbyController { }; /** - * Observe settings changes for {@link Settings.Global#APP_IDLE_CONSTANTS}. + * Observe settings changes for {@link Global#APP_IDLE_CONSTANTS}. */ private class SettingsObserver extends ContentObserver { /** @@ -1650,10 +1652,11 @@ public class AppStandbyController { } void registerObserver() { - mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor( - Settings.Global.APP_IDLE_CONSTANTS), false, this); - mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor( - Settings.Global.APP_STANDBY_ENABLED), false, this); + final ContentResolver cr = mContext.getContentResolver(); + cr.registerContentObserver(Global.getUriFor(Global.APP_IDLE_CONSTANTS), false, this); + cr.registerContentObserver(Global.getUriFor(Global.APP_STANDBY_ENABLED), false, this); + cr.registerContentObserver(Global.getUriFor(Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED), + false, this); } @Override @@ -1665,11 +1668,14 @@ public class AppStandbyController { void updateSettings() { if (DEBUG) { Slog.d(TAG, - "appidle=" + Settings.Global.getString(mContext.getContentResolver(), - Settings.Global.APP_STANDBY_ENABLED)); - Slog.d(TAG, "appidleconstants=" + Settings.Global.getString( + "appidle=" + Global.getString(mContext.getContentResolver(), + Global.APP_STANDBY_ENABLED)); + Slog.d(TAG, + "adaptivebat=" + Global.getString(mContext.getContentResolver(), + Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED)); + Slog.d(TAG, "appidleconstants=" + Global.getString( mContext.getContentResolver(), - Settings.Global.APP_IDLE_CONSTANTS)); + Global.APP_IDLE_CONSTANTS)); } // Check if app_idle_enabled has changed setAppIdleEnabled(mInjector.isAppIdleEnabled()); diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index c914689183b1..0dce7382290c 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -16,6 +16,7 @@ package com.android.server.usage; import android.app.usage.ConfigurationStats; +import android.app.usage.EventList; import android.app.usage.EventStats; import android.app.usage.TimeSparseArray; import android.app.usage.UsageEvents; @@ -37,7 +38,7 @@ class IntervalStats { public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>(); public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>(); public Configuration activeConfiguration; - public TimeSparseArray<UsageEvents.Event> events; + public EventList events; // A string cache. This is important as when we're parsing XML files, we don't want to // keep hundreds of strings that have the same contents. We will read the string diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java index fe3a8845b3a3..aa832ad6b0aa 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java +++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java @@ -22,12 +22,11 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.app.usage.ConfigurationStats; -import android.app.usage.TimeSparseArray; +import android.app.usage.EventList; import android.app.usage.UsageEvents; import android.app.usage.UsageStats; import android.content.res.Configuration; import android.util.ArrayMap; -import android.util.Pair; import java.io.IOException; import java.net.ProtocolException; @@ -193,9 +192,9 @@ final class UsageStatsXmlV1 { } if (statsOut.events == null) { - statsOut.events = new TimeSparseArray<>(); + statsOut.events = new EventList(); } - statsOut.events.put(event.mTimeStamp, event); + statsOut.events.insert(event); } private static void writeUsageStats(XmlSerializer xml, final IntervalStats stats, @@ -411,7 +410,7 @@ final class UsageStatsXmlV1 { xml.startTag(null, EVENT_LOG_TAG); final int eventCount = stats.events != null ? stats.events.size() : 0; for (int i = 0; i < eventCount; i++) { - writeEvent(xml, stats, stats.events.valueAt(i)); + writeEvent(xml, stats, stats.events.get(i)); } xml.endTag(null, EVENT_LOG_TAG); } diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index d9fc066f2402..9cb98f326e75 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -17,15 +17,14 @@ package com.android.server.usage; import android.app.usage.ConfigurationStats; +import android.app.usage.EventList; import android.app.usage.EventStats; -import android.app.usage.TimeSparseArray; import android.app.usage.UsageEvents; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.content.res.Configuration; import android.os.SystemClock; import android.content.Context; -import android.text.format.DateFormat; import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -174,10 +173,10 @@ class UserUsageStatsService { // Add the event to the daily list. if (currentDailyStats.events == null) { - currentDailyStats.events = new TimeSparseArray<>(); + currentDailyStats.events = new EventList(); } if (event.mEventType != UsageEvents.Event.SYSTEM_INTERACTION) { - currentDailyStats.events.put(event.mTimeStamp, event); + currentDailyStats.events.insert(event); } boolean incrementAppLaunch = false; @@ -367,18 +366,14 @@ class UserUsageStatsService { return; } - final int startIndex = stats.events.closestIndexOnOrAfter(beginTime); - if (startIndex < 0) { - return; - } - + final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { - if (stats.events.keyAt(i) >= endTime) { + if (stats.events.get(i).mTimeStamp >= endTime) { return; } - UsageEvents.Event event = stats.events.valueAt(i); + UsageEvents.Event event = stats.events.get(i); if (obfuscateInstantApps) { event = event.getObfuscatedIfInstantApp(); } @@ -410,18 +405,14 @@ class UserUsageStatsService { return; } - final int startIndex = stats.events.closestIndexOnOrAfter(beginTime); - if (startIndex < 0) { - return; - } - + final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { - if (stats.events.keyAt(i) >= endTime) { + if (stats.events.get(i).mTimeStamp >= endTime) { return; } - final UsageEvents.Event event = stats.events.valueAt(i); + final UsageEvents.Event event = stats.events.get(i); if (!packageName.equals(event.mPackage)) { continue; } @@ -633,18 +624,14 @@ class UserUsageStatsService { return; } - final int startIndex = stats.events.closestIndexOnOrAfter(beginTime); - if (startIndex < 0) { - return; - } - + final int startIndex = stats.events.firstIndexOnOrAfter(beginTime); final int size = stats.events.size(); for (int i = startIndex; i < size; i++) { - if (stats.events.keyAt(i) >= endTime) { + if (stats.events.get(i).mTimeStamp >= endTime) { return; } - UsageEvents.Event event = stats.events.valueAt(i); + UsageEvents.Event event = stats.events.get(i); if (pkg != null && !pkg.equals(event.mPackage)) { continue; } @@ -779,10 +766,10 @@ class UserUsageStatsService { if (!skipEvents) { pw.println("events"); pw.increaseIndent(); - final TimeSparseArray<UsageEvents.Event> events = stats.events; + final EventList events = stats.events; final int eventCount = events != null ? events.size() : 0; for (int i = 0; i < eventCount; i++) { - final UsageEvents.Event event = events.valueAt(i); + final UsageEvents.Event event = events.get(i); if (pkg != null && !pkg.equals(event.mPackage)) { continue; } diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index c16701ba0f35..006d7ab96c73 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -591,7 +592,8 @@ public class PhoneStateListener { * @param configs List of the current {@link PhysicalChannelConfig}s * @hide */ - public void onPhysicalChannelConfigurationChanged(List<PhysicalChannelConfig> configs) { + public void onPhysicalChannelConfigurationChanged( + @NonNull List<PhysicalChannelConfig> configs) { // default implementation empty } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 19061f94a6b9..01fb29923061 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1124,6 +1124,41 @@ public class TelephonyManager { */ public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.extra.SUBSCRIPTION_ID"; + /** + * Broadcast intent action indicating that when data stall recovery is attempted by Telephony, + * intended for report every data stall recovery step attempted. + * + * <p> + * The {@link #EXTRA_RECOVERY_ACTION} extra indicates the action associated with the data + * stall recovery. + * The phone id where the data stall recovery is attempted. + * + * <p class="note"> + * Requires the READ_PHONE_STATE permission. + * + * <p class="note"> + * This is a protected intent that can only be sent by the system. + * + * @see #EXTRA_RECOVERY_ACTION + * + * @hide + */ + // TODO(b/78370030) : Restrict this to system applications only + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + public static final String ACTION_DATA_STALL_DETECTED = + "android.intent.action.DATA_STALL_DETECTED"; + + /** + * An int extra used with {@link #ACTION_DATA_STALL_DETECTED} to indicate the + * action associated with the data stall recovery. + * + * @see #ACTION_DATA_STALL_DETECTED + * + * @hide + */ + public static final String EXTRA_RECOVERY_ACTION = "recoveryAction"; + // // // Device Info @@ -2751,6 +2786,22 @@ public class TelephonyManager { } /** + * Test method to reload the UICC profile. + * + * @hide + */ + @TestApi + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public void refreshUiccProfile() { + try { + ITelephony telephony = getITelephony(); + telephony.refreshUiccProfile(mSubId); + } catch (RemoteException ex) { + Rlog.w(TAG, "RemoteException", ex); + } + } + + /** * Map logicalSlot to physicalSlot, and activate the physicalSlot if it is inactive. For * example, passing the physicalSlots array [1, 0] means mapping the first item 1, which is * physical slot index 1, to the logical slot 0; and mapping the second item 0, which is diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 73cd498123fd..639dd74e974e 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1520,4 +1520,10 @@ interface ITelephony { * A test API to return installed carrier id list version. */ int getCarrierIdListVersion(int subId); + + /** + * A test API to reload the UICC profile. + * @hide + */ + void refreshUiccProfile(int subId); } diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java index f8a413226bd2..ed9cbabaf0eb 100644 --- a/tests/net/java/android/net/apf/ApfTest.java +++ b/tests/net/java/android/net/apf/ApfTest.java @@ -150,15 +150,24 @@ public class ApfTest { assertVerdict(DROP, program, packet); } - private void assertDataMemoryContents( - int expected, byte[] program, byte[] packet, byte[] data, byte[] expected_data) - throws IllegalInstructionException, Exception { + private void assertProgramEquals(byte[] expected, byte[] program) throws AssertionError { + // assertArrayEquals() would only print one byte, making debugging difficult. + if (!java.util.Arrays.equals(expected, program)) { + throw new AssertionError( + "\nexpected: " + HexDump.toHexString(expected) + + "\nactual: " + HexDump.toHexString(program)); + } + } + + private void assertDataMemoryContents( + int expected, byte[] program, byte[] packet, byte[] data, byte[] expected_data) + throws IllegalInstructionException, Exception { assertReturnCodesEqual(expected, apfSimulate(program, packet, data, 0 /* filterAge */)); // assertArrayEquals() would only print one byte, making debugging difficult. if (!java.util.Arrays.equals(expected_data, data)) { throw new Exception( - "program: " + HexDump.toHexString(program) + + "\nprogram: " + HexDump.toHexString(program) + "\ndata memory: " + HexDump.toHexString(data) + "\nexpected: " + HexDump.toHexString(expected_data)); } @@ -622,6 +631,64 @@ public class ApfTest { } } + /** + * Test that the generator emits immediates using the shortest possible encoding. + */ + @Test + public void testImmediateEncoding() throws IllegalInstructionException { + final int LI_OPCODE = 13 << 3; + ApfGenerator gen; + + // 0-byte immediate: li R0, 0 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 0); + assertProgramEquals(new byte[]{LI_OPCODE | (0 << 1)}, gen.generate()); + + // 1-byte immediate: li R0, 42 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 42); + assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), 42}, gen.generate()); + + // 2-byte immediate: li R1, 0x1234 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R1, 0x1234); + assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1 , 0x12, 0x34}, gen.generate()); + + // 4-byte immediate: li R0, 0x12345678 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, 0x12345678); + assertProgramEquals( + new byte[]{LI_OPCODE | (3 << 1), 0x12, 0x34, 0x56, 0x78}, + gen.generate()); + } + + /** + * Test that the generator emits negative immediates using the shortest possible encoding. + */ + @Test + public void testNegativeImmediateEncoding() throws IllegalInstructionException { + final int LI_OPCODE = 13 << 3; + ApfGenerator gen; + + // 1-byte negative immediate: li R0, -42 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, -42); + assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), -42}, gen.generate()); + + // 2-byte negative immediate: li R1, -0x1234 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R1, -0x1122); + assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1, (byte)0xEE, (byte)0xDE}, + gen.generate()); + + // 4-byte negative immediate: li R0, -0x11223344 + gen = new ApfGenerator(3); + gen.addLoadImmediate(Register.R0, -0x11223344); + assertProgramEquals( + new byte[]{LI_OPCODE | (3 << 1), (byte)0xEE, (byte)0xDD, (byte)0xCC, (byte)0xBC}, + gen.generate()); + } + @Test public void testApfDataWrite() throws IllegalInstructionException, Exception { byte[] packet = new byte[MIN_PKT_SIZE]; diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 482d6e1fdb31..5b73bbaa1c73 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -84,6 +84,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.UserInfo; import android.content.res.Resources; import android.net.CaptivePortal; import android.net.ConnectivityManager; @@ -201,6 +202,7 @@ public class ConnectivityServiceTest { @Mock DefaultNetworkMetrics mDefaultNetworkMetrics; @Mock INetworkManagementService mNetworkManagementService; @Mock INetworkStatsService mStatsService; + @Mock Vpn mMockVpn; private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class); @@ -505,6 +507,7 @@ public class ConnectivityServiceTest { mWrappedNetworkMonitor.gen204ProbeResult = 204; NetworkRequest request = new NetworkRequest.Builder() .addTransportType(mNetworkCapabilities.getTransportTypes()[0]) + .clearCapabilities() .build(); callback = new NetworkCallback() { public void onCapabilitiesChanged(Network network, @@ -888,6 +891,15 @@ public class ConnectivityServiceTest { return mLastCreatedNetworkMonitor; } + public void mockVpn(int uid) { + synchronized (mVpns) { + // This has no effect unless the VPN is actually connected, because things like + // getActiveNetworkForUidInternal call getNetworkAgentInfoForNetId on the VPN + // netId, and check if that network is actually connected. + mVpns.put(UserHandle.getUserId(Process.myUid()), mMockVpn); + } + } + public void waitForIdle(int timeoutMs) { waitForIdleHandler(mHandlerThread, timeoutMs); } @@ -914,6 +926,7 @@ public class ConnectivityServiceTest { MockitoAnnotations.initMocks(this); when(mMetricsService.defaultNetworkMetrics()).thenReturn(mDefaultNetworkMetrics); + when(mMockVpn.appliesToUid(Process.myUid())).thenReturn(true); // InstrumentationTestRunner prepares a looper, but AndroidJUnitRunner does not. // http://b/25897652 . @@ -935,6 +948,7 @@ public class ConnectivityServiceTest { // getSystemService() correctly. mCm = new WrappedConnectivityManager(InstrumentationRegistry.getContext(), mService); mService.systemReady(); + mService.mockVpn(Process.myUid()); mCm.bindProcessToNetwork(null); // Ensure that the default setting for Captive Portals is used for most tests @@ -1347,6 +1361,7 @@ public class ConnectivityServiceTest { private final static int TIMEOUT_MS = 100; private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>(); + private Network mLastAvailableNetwork; protected void setLastCallback(CallbackState state, Network network, Object o) { mCallbacks.offer(new CallbackInfo(state, network, o)); @@ -1354,6 +1369,7 @@ public class ConnectivityServiceTest { @Override public void onAvailable(Network network) { + mLastAvailableNetwork = network; setLastCallback(CallbackState.AVAILABLE, network, null); } @@ -1389,9 +1405,14 @@ public class ConnectivityServiceTest { @Override public void onLost(Network network) { + mLastAvailableNetwork = null; setLastCallback(CallbackState.LOST, network, null); } + public Network getLastAvailableNetwork() { + return mLastAvailableNetwork; + } + CallbackInfo nextCallback(int timeoutMs) { CallbackInfo cb = null; try { @@ -1658,6 +1679,7 @@ public class ConnectivityServiceTest { callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.connect(true); // We get AVAILABLE on wifi when wifi connects and satisfies our unmetered request. @@ -1668,6 +1690,7 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent); @@ -1676,11 +1699,13 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); for (int i = 0; i < 4; i++) { MockNetworkAgent oldNetwork, newNetwork; @@ -1709,6 +1734,7 @@ public class ConnectivityServiceTest { defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_NOT_METERED, mWiFiNetworkAgent); defaultCallback.assertNoCallback(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Wifi no longer satisfies our listen, which is for an unmetered network. // But because its score is 55, it's still up (and the default network). @@ -1718,8 +1744,11 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.disconnect(); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mCellNetworkAgent.disconnect(); defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + waitForIdle(); + assertEquals(null, mCm.getActiveNetwork()); mCm.unregisterNetworkCallback(callback); waitForIdle(); @@ -1736,6 +1765,7 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring up wifi with a score of 20. // Cell stays up because it would satisfy the default request if it validated. @@ -1744,12 +1774,14 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring up wifi with a score of 70. // Cell is lingered because it would not satisfy any request, even if it validated. @@ -1760,6 +1792,7 @@ public class ConnectivityServiceTest { callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Tear down wifi. mWiFiNetworkAgent.disconnect(); @@ -1767,6 +1800,7 @@ public class ConnectivityServiceTest { defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring up wifi, then validate it. Previous versions would immediately tear down cell, but // it's arguably correct to linger it, since it was the default network before it validated. @@ -1778,6 +1812,7 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); @@ -1786,12 +1821,15 @@ public class ConnectivityServiceTest { mCellNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + waitForIdle(); + assertEquals(null, mCm.getActiveNetwork()); // If a network is lingering, and we add and remove a request from it, resume lingering. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); @@ -1799,6 +1837,7 @@ public class ConnectivityServiceTest { // TODO: Investigate sending validated before losing. callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); NetworkRequest cellRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR).build(); @@ -1815,6 +1854,7 @@ public class ConnectivityServiceTest { callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Cell is now the default network. Pin it with a cell-specific request. noopCallback = new NetworkCallback(); // Can't reuse NetworkCallbacks. http://b/20701525 @@ -1825,6 +1865,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); callback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // The default request is lingering on cell, but nothing happens to cell, and we send no // callbacks for it, because it's kept up by cellRequest. callback.assertNoCallback(); @@ -1848,6 +1889,7 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); trackDefaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Let linger run its course. callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent, lingerTimeoutMs); @@ -2496,23 +2538,27 @@ public class ConnectivityServiceTest { mCellNetworkAgent.connect(true); cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring up wifi and expect CALLBACK_AVAILABLE. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); cellNetworkCallback.assertNoCallback(); defaultNetworkCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring down cell. Expect no default network callback, since it wasn't the default. mCellNetworkAgent.disconnect(); cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); defaultNetworkCallback.assertNoCallback(); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring up cell. Expect no default network callback, since it won't be the default. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultNetworkCallback.assertNoCallback(); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Bring down wifi. Expect the default network callback to notified of LOST wifi // followed by AVAILABLE cell. @@ -2523,6 +2569,23 @@ public class ConnectivityServiceTest { mCellNetworkAgent.disconnect(); cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); defaultNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + waitForIdle(); + assertEquals(null, mCm.getActiveNetwork()); + + final int uid = Process.myUid(); + final MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN); + final ArraySet<UidRange> ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId); + vpnNetworkAgent.setUids(ranges); + vpnNetworkAgent.connect(true); + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); + + vpnNetworkAgent.disconnect(); + defaultNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + waitForIdle(); + assertEquals(null, mCm.getActiveNetwork()); } @Test @@ -4015,6 +4078,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback genericNotVpnNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); + final TestNetworkCallback defaultCallback = new TestNetworkCallback(); final NetworkRequest genericNotVpnRequest = new NetworkRequest.Builder().build(); final NetworkRequest genericRequest = new NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_NOT_VPN).build(); @@ -4027,6 +4091,8 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(genericNotVpnRequest, genericNotVpnNetworkCallback); mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback); mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); + mCm.registerDefaultNetworkCallback(defaultCallback); + defaultCallback.assertNoCallback(); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); @@ -4034,15 +4100,14 @@ public class ConnectivityServiceTest { genericNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); genericNotVpnNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); wifiNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); vpnNetworkCallback.assertNoCallback(); - - // TODO : check callbacks agree with the return value of mCm.getActiveNetwork(). - // Right now this is not possible because establish() is not adequately instrumented - // in this test. + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); final MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN); final ArraySet<UidRange> ranges = new ArraySet<>(); ranges.add(new UidRange(uid, uid)); + when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId); vpnNetworkAgent.setUids(ranges); vpnNetworkAgent.connect(false); @@ -4050,10 +4115,14 @@ public class ConnectivityServiceTest { genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + defaultCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); genericNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCapabilitiesLike(nc -> null == nc.getUids(), vpnNetworkAgent); + defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); vpnNetworkAgent.setUids(ranges); @@ -4063,6 +4132,14 @@ public class ConnectivityServiceTest { wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + // TODO : The default network callback should actually get a LOST call here (also see the + // comment below for AVAILABLE). This is because ConnectivityService does not look at UID + // ranges at all when determining whether a network should be rematched. In practice, VPNs + // can't currently update their UIDs without disconnecting, so this does not matter too + // much, but that is the reason the test here has to check for an update to the + // capabilities instead of the expected LOST then AVAILABLE. + defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + ranges.add(new UidRange(uid, uid)); vpnNetworkAgent.setUids(ranges); @@ -4070,6 +4147,9 @@ public class ConnectivityServiceTest { genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + // TODO : Here like above, AVAILABLE would be correct, but because this can't actually + // happen outside of the test, ConnectivityService does not rematch callbacks. + defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); mWiFiNetworkAgent.disconnect(); @@ -4077,6 +4157,7 @@ public class ConnectivityServiceTest { genericNotVpnNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); vpnNetworkCallback.assertNoCallback(); + defaultCallback.assertNoCallback(); vpnNetworkAgent.disconnect(); @@ -4084,9 +4165,61 @@ public class ConnectivityServiceTest { genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + assertEquals(null, mCm.getActiveNetwork()); mCm.unregisterNetworkCallback(genericNetworkCallback); mCm.unregisterNetworkCallback(wifiNetworkCallback); mCm.unregisterNetworkCallback(vpnNetworkCallback); + mCm.unregisterNetworkCallback(defaultCallback); + } + + @Test + public void testVpnWithAndWithoutInternet() { + final int uid = Process.myUid(); + + final TestNetworkCallback defaultCallback = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(defaultCallback); + defaultCallback.assertNoCallback(); + + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(true); + + defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); + + MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN); + final ArraySet<UidRange> ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId); + vpnNetworkAgent.setUids(ranges); + vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */); + + defaultCallback.assertNoCallback(); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); + + vpnNetworkAgent.disconnect(); + defaultCallback.assertNoCallback(); + + vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN); + when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId); + vpnNetworkAgent.setUids(ranges); + vpnNetworkAgent.connect(true /* validated */, true /* hasInternet */); + defaultCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); + + vpnNetworkAgent.disconnect(); + defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); + + vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN); + when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId); + ranges.clear(); + vpnNetworkAgent.setUids(ranges); + + vpnNetworkAgent.connect(false /* validated */, true /* hasInternet */); + defaultCallback.assertNoCallback(); + + mCm.unregisterNetworkCallback(defaultCallback); } } diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp index 6f213e19e5f6..34b46c552e0c 100644 --- a/tools/aapt2/ResourceValues.cpp +++ b/tools/aapt2/ResourceValues.cpp @@ -117,8 +117,7 @@ bool Reference::Equals(const Value* value) const { bool Reference::Flatten(android::Res_value* out_value) const { const ResourceId resid = id.value_or_default(ResourceId(0)); - const bool dynamic = resid.is_valid_dynamic() && resid.package_id() != kFrameworkPackageId && - resid.package_id() < kAppPackageId; + const bool dynamic = resid.is_valid_dynamic() && is_dynamic; if (reference_type == Reference::Type::kResource) { if (dynamic) { diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h index 6371c4cbb7b5..168ad61784e7 100644 --- a/tools/aapt2/ResourceValues.h +++ b/tools/aapt2/ResourceValues.h @@ -157,6 +157,7 @@ struct Reference : public BaseItem<Reference> { Maybe<ResourceId> id; Reference::Type reference_type; bool private_reference = false; + bool is_dynamic = false; Reference(); explicit Reference(const ResourceNameRef& n, Type type = Type::kResource); diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index a3b766481887..0910040fb07a 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -129,6 +129,12 @@ struct LinkOptions { // Stable ID options. std::unordered_map<ResourceName, ResourceId> stable_id_map; Maybe<std::string> resource_id_map_path; + + // When 'true', allow reserved package IDs to be used for applications. Pre-O, the platform + // treats negative resource IDs [those with a package ID of 0x80 or higher] as invalid. + // In order to work around this limitation, we allow the use of traditionally reserved + // resource IDs [those between 0x02 and 0x7E]. + bool allow_reserved_package_id = false; }; class LinkContext : public IAaptContext { @@ -798,35 +804,39 @@ class LinkCommand { return; } - xml::Attribute* attr = manifest_xml->root->FindAttribute(xml::kSchemaAndroid, "versionCode"); - if (attr != nullptr) { - Maybe<std::string>& compile_sdk_version = options_.manifest_fixer_options.compile_sdk_version; - if (BinaryPrimitive* prim = ValueCast<BinaryPrimitive>(attr->compiled_value.get())) { - switch (prim->value.dataType) { - case Res_value::TYPE_INT_DEC: - compile_sdk_version = StringPrintf("%" PRId32, static_cast<int32_t>(prim->value.data)); - break; - case Res_value::TYPE_INT_HEX: - compile_sdk_version = StringPrintf("%" PRIx32, prim->value.data); - break; - default: - break; + if (!options_.manifest_fixer_options.compile_sdk_version) { + xml::Attribute* attr = manifest_xml->root->FindAttribute(xml::kSchemaAndroid, "versionCode"); + if (attr != nullptr) { + Maybe<std::string>& compile_sdk_version = options_.manifest_fixer_options.compile_sdk_version; + if (BinaryPrimitive* prim = ValueCast<BinaryPrimitive>(attr->compiled_value.get())) { + switch (prim->value.dataType) { + case Res_value::TYPE_INT_DEC: + compile_sdk_version = StringPrintf("%" PRId32, static_cast<int32_t>(prim->value.data)); + break; + case Res_value::TYPE_INT_HEX: + compile_sdk_version = StringPrintf("%" PRIx32, prim->value.data); + break; + default: + break; + } + } else if (String* str = ValueCast<String>(attr->compiled_value.get())) { + compile_sdk_version = *str->value; + } else { + compile_sdk_version = attr->value; } - } else if (String* str = ValueCast<String>(attr->compiled_value.get())) { - compile_sdk_version = *str->value; - } else { - compile_sdk_version = attr->value; } } - attr = manifest_xml->root->FindAttribute(xml::kSchemaAndroid, "versionName"); - if (attr != nullptr) { - Maybe<std::string>& compile_sdk_version_codename = - options_.manifest_fixer_options.compile_sdk_version_codename; - if (String* str = ValueCast<String>(attr->compiled_value.get())) { - compile_sdk_version_codename = *str->value; - } else { - compile_sdk_version_codename = attr->value; + if (!options_.manifest_fixer_options.compile_sdk_version_codename) { + xml::Attribute* attr = manifest_xml->root->FindAttribute(xml::kSchemaAndroid, "versionName"); + if (attr != nullptr) { + Maybe<std::string>& compile_sdk_version_codename = + options_.manifest_fixer_options.compile_sdk_version_codename; + if (String* str = ValueCast<String>(attr->compiled_value.get())) { + compile_sdk_version_codename = *str->value; + } else { + compile_sdk_version_codename = attr->value; + } } } } @@ -895,9 +905,7 @@ class LinkCommand { // Capture the shared libraries so that the final resource table can be properly flattened // with support for shared libraries. for (auto& entry : asset_source->GetAssignedPackageIds()) { - if (entry.first > kFrameworkPackageId && entry.first < kAppPackageId) { - final_table_.included_packages_[entry.first] = entry.second; - } else if (entry.first == kAppPackageId) { + if (entry.first == kAppPackageId) { // Capture the included base feature package. included_feature_base_ = entry.second; } else if (entry.first == kFrameworkPackageId) { @@ -911,6 +919,8 @@ class LinkCommand { // android:versionCode from the framework AndroidManifest.xml. ExtractCompileSdkVersions(asset_source->GetAssetManager()); } + } else if (asset_source->IsPackageDynamic(entry.first)) { + final_table_.included_packages_[entry.first] = entry.second; } } @@ -1595,7 +1605,15 @@ class LinkCommand { // If required, the package name is modifed before flattening, and then modified back // to its original name. ResourceTablePackage* package_to_rewrite = nullptr; - if (context_->GetPackageId() > kAppPackageId && + // Pre-O, the platform treats negative resource IDs [those with a package ID of 0x80 + // or higher] as invalid. In order to work around this limitation, we allow the use + // of traditionally reserved resource IDs [those between 0x02 and 0x7E]. Allow the + // definition of what a valid "split" package ID is to account for this. + const bool isSplitPackage = (options_.allow_reserved_package_id && + context_->GetPackageId() != kAppPackageId && + context_->GetPackageId() != kFrameworkPackageId) + || (!options_.allow_reserved_package_id && context_->GetPackageId() > kAppPackageId); + if (isSplitPackage && included_feature_base_ == make_value(context_->GetCompilationPackage())) { // The base APK is included, and this is a feature split. If the base package is // the same as this package, then we are building an old style Android Instant Apps feature @@ -2102,6 +2120,13 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) { .OptionalFlag("--version-name", "Version name to inject into the AndroidManifest.xml if none is present.", &options.manifest_fixer_options.version_name_default) + .OptionalFlag("--compile-sdk-version-code", + "Version code (integer) to inject into the AndroidManifest.xml if none is\n" + "present.", + &options.manifest_fixer_options.compile_sdk_version) + .OptionalFlag("--compile-sdk-version-name", + "Version name to inject into the AndroidManifest.xml if none is present.", + &options.manifest_fixer_options.compile_sdk_version_codename) .OptionalSwitch("--shared-lib", "Generates a shared Android runtime library.", &shared_lib) .OptionalSwitch("--static-lib", "Generate a static Android library.", &static_lib) @@ -2139,6 +2164,10 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) { "Generates a text file containing the resource symbols of the R class in\n" "the specified folder.", &options.generate_text_symbols_path) + .OptionalSwitch("--allow-reserved-package-id", + "Allows the use of a reserved package ID. This should on be used for\n" + "packages with a pre-O min-sdk\n", + &options.allow_reserved_package_id) .OptionalSwitch("--auto-add-overlay", "Allows the addition of new resources in overlays without\n" "<add-resource> tags.", @@ -2238,7 +2267,9 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) { } const uint32_t package_id_int = maybe_package_id_int.value(); - if (package_id_int < kAppPackageId || package_id_int > std::numeric_limits<uint8_t>::max()) { + if (package_id_int > std::numeric_limits<uint8_t>::max() + || package_id_int == kFrameworkPackageId + || (!options.allow_reserved_package_id && package_id_int < kAppPackageId)) { context.GetDiagnostics()->Error( DiagMessage() << StringPrintf( "invalid package ID 0x%02x. Must be in the range 0x7f-0xff.", package_id_int)); diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp index 9aaaa69f8994..3a5d5858254d 100644 --- a/tools/aapt2/link/ReferenceLinker.cpp +++ b/tools/aapt2/link/ReferenceLinker.cpp @@ -340,6 +340,7 @@ bool ReferenceLinker::LinkReference(const CallSite& callsite, Reference* referen // against libraries without assigned IDs. // Ex: Linking against own resources when building a static library. reference->id = s->id; + reference->is_dynamic = s->is_dynamic; return true; } diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp index 2e97a2f3ae7f..fc4c9b537e73 100644 --- a/tools/aapt2/process/SymbolTable.cpp +++ b/tools/aapt2/process/SymbolTable.cpp @@ -227,6 +227,10 @@ std::map<size_t, std::string> AssetManagerSymbolSource::GetAssignedPackageIds() return package_map; } +bool AssetManagerSymbolSource::IsPackageDynamic(uint32_t packageId) const { + return assets_.getResources(false).isPackageDynamic(packageId); +} + static std::unique_ptr<SymbolTable::Symbol> LookupAttributeInTable( const android::ResTable& table, ResourceId id) { // Try as a bag. @@ -330,6 +334,7 @@ std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::FindByName( } else { s = util::make_unique<SymbolTable::Symbol>(); s->id = res_id; + s->is_dynamic = table.isResourceDynamic(res_id.id); } if (s) { @@ -354,7 +359,6 @@ std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::FindById( // Exit early and avoid the error logs from AssetManager. return {}; } - const android::ResTable& table = assets_.getResources(false); Maybe<ResourceName> maybe_name = GetResourceName(table, id); if (!maybe_name) { @@ -370,6 +374,7 @@ std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::FindById( } else { s = util::make_unique<SymbolTable::Symbol>(); s->id = id; + s->is_dynamic = table.isResourceDynamic(id.id); } if (s) { diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h index b676efb8d025..51a2e373596a 100644 --- a/tools/aapt2/process/SymbolTable.h +++ b/tools/aapt2/process/SymbolTable.h @@ -68,6 +68,7 @@ class SymbolTable { Maybe<ResourceId> id; std::shared_ptr<Attribute> attribute; bool is_public = false; + bool is_dynamic = false; }; SymbolTable(NameMangler* mangler); @@ -192,6 +193,7 @@ class AssetManagerSymbolSource : public ISymbolSource { bool AddAssetPath(const android::StringPiece& path); std::map<size_t, std::string> GetAssignedPackageIds() const; + bool IsPackageDynamic(uint32_t packageId) const; std::unique_ptr<SymbolTable::Symbol> FindByName( const ResourceName& name) override; diff --git a/tools/hiddenapi/checksorted_sha.sh b/tools/hiddenapi/checksorted_sha.sh new file mode 100755 index 000000000000..ceb705f4e42a --- /dev/null +++ b/tools/hiddenapi/checksorted_sha.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e +LOCAL_DIR="$( dirname ${BASH_SOURCE} )" +git show --name-only --pretty=format: $1 | grep "config/hiddenapi-.*txt" | while read file; do + diff <(git show $1:$file) <(git show $1:$file | $LOCAL_DIR/sort_api.sh ) || { + echo -e "\e[1m\e[31m$file $1 is not sorted or contains duplicates. To sort it correctly:\e[0m" + echo -e "\e[33m${LOCAL_DIR}/sort_api.sh $2/frameworks/base/$file\e[0m" + exit 1 + } +done diff --git a/tools/hiddenapi/sort_api.sh b/tools/hiddenapi/sort_api.sh new file mode 100755 index 000000000000..1c6eb1b286b1 --- /dev/null +++ b/tools/hiddenapi/sort_api.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e +if [ -z "$1" ]; then + source_list=/dev/stdin + dest_list=/dev/stdout +else + source_list="$1" + dest_list="$1" +fi +# Load the file +readarray A < "$source_list" +# Sort +IFS=$'\n' +A=( $(LC_COLLATE=C sort -f <<< "${A[*]}") ) +A=( $(uniq <<< "${A[*]}") ) +unset IFS +# Dump array back into the file +printf '%s\n' "${A[@]}" > "$dest_list" diff --git a/wifi/tests/runtests.sh b/wifi/tests/runtests.sh index ebcc2a2f34a2..4e52b8f23399 100755 --- a/wifi/tests/runtests.sh +++ b/wifi/tests/runtests.sh @@ -21,4 +21,5 @@ adb wait-for-device adb install -r -g "$OUT/data/app/FrameworksWifiApiTests/FrameworksWifiApiTests.apk" -adb shell am instrument -w "$@" 'android.net.wifi.test/android.support.test.runner.AndroidJUnitRunner' +adb shell am instrument --no-hidden-api-checks -w "$@" \ + 'android.net.wifi.test/android.support.test.runner.AndroidJUnitRunner' |