diff options
98 files changed, 2518 insertions, 472 deletions
diff --git a/api/current.txt b/api/current.txt index bfd60b56ebac..6a9f00e46b07 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6559,7 +6559,7 @@ package android.app.admin { method public void setLockTaskPackages(android.content.ComponentName, java.lang.String[]) throws java.lang.SecurityException; method public void setLogoutEnabled(android.content.ComponentName, boolean); method public void setLongSupportMessage(android.content.ComponentName, java.lang.CharSequence); - method public void setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName); + method public boolean setMandatoryBackupTransport(android.content.ComponentName, android.content.ComponentName); method public void setMasterVolumeMuted(android.content.ComponentName, boolean); method public void setMaximumFailedPasswordsForWipe(android.content.ComponentName, int); method public void setMaximumTimeToLock(android.content.ComponentName, long); diff --git a/api/system-current.txt b/api/system-current.txt index 1e2fe3df0d2c..6d43d27355d6 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3067,8 +3067,10 @@ package android.net { } public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable { + method public void addAddress(android.net.LinkAddress) throws java.io.IOException; method public void close(); method public java.lang.String getInterfaceName(); + method public void removeAddress(android.net.LinkAddress) throws java.io.IOException; } public final class IpSecTransform implements java.lang.AutoCloseable { diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk index ca0611b0ca05..525ddb38c1e9 100644 --- a/cmds/statsd/Android.mk +++ b/cmds/statsd/Android.mk @@ -135,6 +135,12 @@ LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \ LOCAL_MODULE_CLASS := EXECUTABLES +# Enable sanitizer on eng builds +ifeq ($(TARGET_BUILD_VARIANT),eng) + LOCAL_CLANG := true + LOCAL_SANITIZE := address unsigned-integer-overflow signed-integer-overflow +endif + LOCAL_INIT_RC := statsd.rc include $(BUILD_EXECUTABLE) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 1d069bc19872..baf2d6027ca9 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -147,7 +147,7 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastPrintWriter; import com.android.org.conscrypt.OpenSSLSocketImpl; import com.android.org.conscrypt.TrustedCertificateStore; -import com.android.server.am.proto.MemInfoDumpProto; +import com.android.server.am.MemInfoDumpProto; import dalvik.system.BaseDexClassLoader; import dalvik.system.CloseGuard; diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 02e77df7a1ba..4cb7f89cec5c 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -8877,15 +8877,20 @@ public class DevicePolicyManager { * <p>If backups were disabled and a non-null backup transport {@link ComponentName} is * specified, backups will be enabled. * + * <p>NOTE: The method shouldn't be called on the main thread. + * * @param admin admin Which {@link DeviceAdminReceiver} this request is associated with. * @param backupTransportComponent The backup transport layer to be used for mandatory backups. + * @return {@code true} if the backup transport was successfully set; {@code false} otherwise. * @throws SecurityException if {@code admin} is not a device owner. */ - public void setMandatoryBackupTransport( - @NonNull ComponentName admin, @Nullable ComponentName backupTransportComponent) { + @WorkerThread + public boolean setMandatoryBackupTransport( + @NonNull ComponentName admin, + @Nullable ComponentName backupTransportComponent) { throwIfParentInstance("setMandatoryBackupTransport"); try { - mService.setMandatoryBackupTransport(admin, backupTransportComponent); + return mService.setMandatoryBackupTransport(admin, backupTransportComponent); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index c29369fe96a8..c46402faa07b 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -364,7 +364,7 @@ interface IDevicePolicyManager { void setBackupServiceEnabled(in ComponentName admin, boolean enabled); boolean isBackupServiceEnabled(in ComponentName admin); - void setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent); + boolean setMandatoryBackupTransport(in ComponentName admin, in ComponentName backupTransportComponent); ComponentName getMandatoryBackupTransport(); void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled); diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java index 4e1f83430abf..cb4299ef6987 100644 --- a/core/java/android/net/IpSecManager.java +++ b/core/java/android/net/IpSecManager.java @@ -658,7 +658,8 @@ public final class IpSecManager { * @param address the local address for traffic inside the tunnel * @hide */ - public void addAddress(LinkAddress address) { + @SystemApi + public void addAddress(LinkAddress address) throws IOException { try { mService.addAddressToTunnelInterface(mResourceId, address); } catch (RemoteException e) { @@ -674,7 +675,8 @@ public final class IpSecManager { * @param address to be removed * @hide */ - public void removeAddress(LinkAddress address) { + @SystemApi + public void removeAddress(LinkAddress address) throws IOException { try { mService.removeAddressFromTunnelInterface(mResourceId, address); } catch (RemoteException e) { diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp index 4b6578bdff7f..3fcedd0264ae 100644 --- a/core/jni/android/graphics/ColorFilter.cpp +++ b/core/jni/android/graphics/ColorFilter.cpp @@ -30,8 +30,8 @@ using namespace uirenderer; class SkColorFilterGlue { public: - static void SafeUnref(SkShader* shader) { - SkSafeUnref(shader); + static void SafeUnref(SkColorFilter* filter) { + SkSafeUnref(filter); } static jlong GetNativeFinalizer(JNIEnv*, jobject) { diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 6a3aaabb3614..476d5fe45692 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -231,22 +231,22 @@ message IncidentProto { (section).args = "procstats --proto" ]; - optional com.android.server.am.proto.ActivityManagerServiceDumpActivitiesProto activities = 3012 [ + optional com.android.server.am.ActivityManagerServiceDumpActivitiesProto activities = 3012 [ (section).type = SECTION_DUMPSYS, (section).args = "activity --proto activities" ]; - optional com.android.server.am.proto.ActivityManagerServiceDumpBroadcastsProto broadcasts = 3013 [ + optional com.android.server.am.ActivityManagerServiceDumpBroadcastsProto broadcasts = 3013 [ (section).type = SECTION_DUMPSYS, (section).args = "activity --proto broadcasts" ]; - optional com.android.server.am.proto.ActivityManagerServiceDumpServicesProto amservices = 3014 [ + optional com.android.server.am.ActivityManagerServiceDumpServicesProto amservices = 3014 [ (section).type = SECTION_DUMPSYS, (section).args = "activity --proto service" ]; - optional com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto amprocesses = 3015 [ + optional com.android.server.am.ActivityManagerServiceDumpProcessesProto amprocesses = 3015 [ (section).type = SECTION_DUMPSYS, (section).args = "activity --proto processes" ]; @@ -256,12 +256,12 @@ message IncidentProto { (section).args = "alarm --proto" ]; - optional com.android.server.wm.proto.WindowManagerServiceDumpProto window = 3017 [ + optional com.android.server.wm.WindowManagerServiceDumpProto window = 3017 [ (section).type = SECTION_DUMPSYS, (section).args = "window --proto" ]; - optional com.android.server.am.proto.MemInfoDumpProto meminfo = 3018 [ + optional com.android.server.am.MemInfoDumpProto meminfo = 3018 [ (section).type = SECTION_DUMPSYS, (section).args = "meminfo -a --proto" ]; diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto index fcb980708157..0c617fff6b97 100644 --- a/core/proto/android/server/activitymanagerservice.proto +++ b/core/proto/android/server/activitymanagerservice.proto @@ -16,7 +16,7 @@ syntax = "proto2"; -package com.android.server.am.proto; +package com.android.server.am; import "frameworks/base/core/proto/android/app/activitymanager.proto"; import "frameworks/base/core/proto/android/app/enums.proto"; @@ -59,11 +59,11 @@ message ActivityManagerServiceDumpActivitiesProto { message ActivityStackSupervisorProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; - optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1; + optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1; repeated ActivityDisplayProto displays = 2; optional KeyguardControllerProto keyguard_controller = 3; optional int32 focused_stack_id = 4; - optional .com.android.server.wm.proto.IdentifierProto resumed_activity = 5; + optional .com.android.server.wm.IdentifierProto resumed_activity = 5; // Whether or not the home activity is the recents activity. This is needed for the CTS tests to // know what activity types to check for when invoking splitscreen multi-window. optional bool is_home_recents_component = 6; @@ -73,7 +73,7 @@ message ActivityStackSupervisorProto { message ActivityDisplayProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; - optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1; + optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1; optional int32 id = 2; repeated ActivityStackProto stacks = 3; } @@ -81,10 +81,10 @@ message ActivityDisplayProto { message ActivityStackProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; - optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1; + optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1; optional int32 id = 2; repeated TaskRecordProto tasks = 3; - optional .com.android.server.wm.proto.IdentifierProto resumed_activity = 4; + optional .com.android.server.wm.IdentifierProto resumed_activity = 4; optional int32 display_id = 5; optional bool fullscreen = 6; optional .android.graphics.RectProto bounds = 7; @@ -93,7 +93,7 @@ message ActivityStackProto { message TaskRecordProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; - optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1; + optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1; optional int32 id = 2; repeated ActivityRecordProto activities = 3; optional int32 stack_id = 4; @@ -111,8 +111,8 @@ message TaskRecordProto { message ActivityRecordProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; - optional .com.android.server.wm.proto.ConfigurationContainerProto configuration_container = 1; - optional .com.android.server.wm.proto.IdentifierProto identifier = 2; + optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1; + optional .com.android.server.wm.IdentifierProto identifier = 2; optional string state = 3; optional bool visible = 4; optional bool front_of_task = 5; @@ -689,25 +689,14 @@ message ActivityManagerServiceDumpProcessesProto { } optional SleepStatus sleep_status = 27; - message VoiceProto { + message Voice { option (.android.msg_privacy).dest = DEST_AUTOMATIC; optional string session = 1; optional .android.os.PowerManagerProto.WakeLock wakelock = 2; } - optional VoiceProto running_voice = 28; + optional Voice running_voice = 28; - message VrControllerProto { - option (.android.msg_privacy).dest = DEST_AUTOMATIC; - - enum VrMode { - FLAG_NON_VR_MODE = 0; - FLAG_VR_MODE = 1; - FLAG_PERSISTENT_VR_MODE = 2; - } - repeated VrMode vr_mode = 1; - optional int32 render_thread_id = 2; - } optional VrControllerProto vr_controller = 29; message DebugApp { @@ -854,6 +843,19 @@ message ImportanceTokenProto { optional string reason = 3; } +// proto of class VrController.java +message VrControllerProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + enum VrMode { + FLAG_NON_VR_MODE = 0; + FLAG_VR_MODE = 1; + FLAG_PERSISTENT_VR_MODE = 2; + } + repeated VrMode vr_mode = 1; + optional int32 render_thread_id = 2; +} + message ProcessOomProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; diff --git a/core/proto/android/server/animationadapter.proto b/core/proto/android/server/animationadapter.proto index c4ffe8c477aa..9bfa79455e0b 100644 --- a/core/proto/android/server/animationadapter.proto +++ b/core/proto/android/server/animationadapter.proto @@ -20,7 +20,7 @@ import "frameworks/base/core/proto/android/graphics/point.proto"; import "frameworks/base/core/proto/android/view/remote_animation_target.proto"; import "frameworks/base/libs/incident/proto/android/privacy.proto"; -package com.android.server.wm.proto; +package com.android.server.wm; option java_multiple_files = true; message AnimationAdapterProto { diff --git a/core/proto/android/server/appwindowthumbnail.proto b/core/proto/android/server/appwindowthumbnail.proto index 8f48d75a7f76..54ad193675e9 100644 --- a/core/proto/android/server/appwindowthumbnail.proto +++ b/core/proto/android/server/appwindowthumbnail.proto @@ -19,7 +19,7 @@ syntax = "proto2"; import "frameworks/base/core/proto/android/server/surfaceanimator.proto"; import "frameworks/base/libs/incident/proto/android/privacy.proto"; -package com.android.server.wm.proto; +package com.android.server.wm; option java_multiple_files = true; /** diff --git a/core/proto/android/server/surfaceanimator.proto b/core/proto/android/server/surfaceanimator.proto index dcc2b3443f2b..84560bc0eef2 100644 --- a/core/proto/android/server/surfaceanimator.proto +++ b/core/proto/android/server/surfaceanimator.proto @@ -20,7 +20,7 @@ import "frameworks/base/core/proto/android/server/animationadapter.proto"; import "frameworks/base/core/proto/android/view/surfacecontrol.proto"; import "frameworks/base/libs/incident/proto/android/privacy.proto"; -package com.android.server.wm.proto; +package com.android.server.wm; option java_multiple_files = true; /** diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index 9598f24b6ff1..063135d1de8b 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -28,7 +28,7 @@ import "frameworks/base/core/proto/android/view/surface.proto"; import "frameworks/base/core/proto/android/view/windowlayoutparams.proto"; import "frameworks/base/libs/incident/proto/android/privacy.proto"; -package com.android.server.wm.proto; +package com.android.server.wm; option java_multiple_files = true; diff --git a/core/proto/android/server/windowmanagertrace.proto b/core/proto/android/server/windowmanagertrace.proto index 96a90bfe63da..f502961d2c45 100644 --- a/core/proto/android/server/windowmanagertrace.proto +++ b/core/proto/android/server/windowmanagertrace.proto @@ -18,7 +18,7 @@ syntax = "proto2"; import "frameworks/base/core/proto/android/server/windowmanagerservice.proto"; -package com.android.server.wm.proto; +package com.android.server.wm; option java_multiple_files = true; diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 1083630a1d30..6ae368394b56 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1996,7 +1996,7 @@ <!-- If true, the doze component is not started until after the screen has been turned off and the screen off animation has been performed. --> - <bool name="config_dozeAfterScreenOff">false</bool> + <bool name="config_dozeAfterScreenOffByDefault">false</bool> <!-- Doze: should the TYPE_PICK_UP_GESTURE sensor be used as a pulse signal. --> <bool name="config_dozePulsePickup">false</bool> @@ -3364,4 +3364,8 @@ <!-- Package name for ManagedProvisioning which is responsible for provisioning work profiles. --> <string name="config_managed_provisioning_package" translatable="false">com.android.managedprovisioning</string> + + <!-- When device is in power save mode, whether we should disable signal strength update from + modem.--> + <bool name="config_disable_signal_strength_update_in_powersave_mode">false</bool> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ac01c4efc3ea..05e53b19cbc0 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1817,7 +1817,7 @@ <java-symbol type="bool" name="config_notificationHeaderClickableForExpand" /> <java-symbol type="bool" name="config_enableNightMode" /> <java-symbol type="bool" name="config_tintNotificationActionButtons" /> - <java-symbol type="bool" name="config_dozeAfterScreenOff" /> + <java-symbol type="bool" name="config_dozeAfterScreenOffByDefault" /> <java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" /> <java-symbol type="bool" name="config_enableFusedLocationOverlay" /> <java-symbol type="bool" name="config_enableHardwareFlpOverlay" /> @@ -3305,4 +3305,5 @@ <java-symbol type="string" name="notification_app_name_system" /> <java-symbol type="string" name="notification_app_name_settings" /> + <java-symbol type="bool" name="config_disable_signal_strength_update_in_powersave_mode" /> </resources> diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 2dd8c36f1165..c16876b966bc 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -42,12 +42,14 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Log; import com.android.internal.location.ProviderProperties; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Set; /** * This class provides access to the system location services. These @@ -1252,12 +1254,40 @@ public class LocationManager { @SystemApi @RequiresPermission(WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) { - for (String provider : getAllProviders()) { + final List<String> allProvidersList = getAllProviders(); + // Update all providers on device plus gps and network provider when disabling location. + Set<String> allProvidersSet = new ArraySet<>(allProvidersList.size() + 2); + allProvidersSet.addAll(allProvidersList); + // When disabling location, disable gps and network provider that could have been enabled by + // location mode api. + if (enabled == false) { + allProvidersSet.add(GPS_PROVIDER); + allProvidersSet.add(NETWORK_PROVIDER); + } + if (allProvidersSet.isEmpty()) { + return; + } + // to ensure thread safety, we write the provider name with a '+' or '-' + // and let the SettingsProvider handle it rather than reading and modifying + // the list of enabled providers. + final String prefix = enabled ? "+" : "-"; + StringBuilder locationProvidersAllowed = new StringBuilder(); + for (String provider : allProvidersSet) { + checkProvider(provider); if (provider.equals(PASSIVE_PROVIDER)) { continue; } - setProviderEnabledForUser(provider, enabled, userHandle); - } + locationProvidersAllowed.append(prefix); + locationProvidersAllowed.append(provider); + locationProvidersAllowed.append(","); + } + // Remove the trailing comma + locationProvidersAllowed.setLength(locationProvidersAllowed.length() - 1); + Settings.Secure.putStringForUser( + mContext.getContentResolver(), + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + locationProvidersAllowed.toString(), + userHandle.getIdentifier()); } /** diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java new file mode 100644 index 000000000000..cc69e0ec2831 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java @@ -0,0 +1,367 @@ +/* + * 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.users; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.UserInfo; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; + +import com.android.internal.util.UserIcons; + +import java.util.Iterator; +import java.util.List; + +/** + * Helper class for managing users, providing methods for removing, adding and switching users. + */ +public final class UserManagerHelper { + private static final String TAG = "UserManagerHelper"; + private final Context mContext; + private final UserManager mUserManager; + private OnUsersUpdateListener mUpdateListener; + private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mUpdateListener.onUsersUpdate(); + } + }; + + public UserManagerHelper(Context context) { + mContext = context; + mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + } + + /** + * Registers a listener for updates to all users - removing, adding users or changing user info. + * + * @param listener Instance of {@link OnUsersUpdateListener}. + */ + public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) { + mUpdateListener = listener; + registerReceiver(); + } + + /** + * Unregisters listener by unregistering {@code BroadcastReceiver}. + */ + public void unregisterOnUsersUpdateListener() { + unregisterReceiver(); + } + + /** + * Gets {@link UserInfo} for the current user. + * + * @return {@link UserInfo} for the current user. + */ + public UserInfo getCurrentUserInfo() { + return mUserManager.getUserInfo(UserHandle.myUserId()); + } + + /** + * Gets all the other users on the system that are not the current user. + * + * @return List of {@code UserInfo} for each user that is not the current user. + */ + public List<UserInfo> getAllUsersExcludesCurrentUser() { + List<UserInfo> others = mUserManager.getUsers(true); + + for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) { + UserInfo userInfo = iterator.next(); + if (userInfo.id == UserHandle.myUserId()) { + // Remove current user from the list. + iterator.remove(); + } + } + return others; + } + + // User information accessors + + /** + * Checks whether the user is system user (admin). + * + * @param userInfo User to check against system user. + * @return {@code true} if system user, {@code false} otherwise. + */ + public boolean userIsSystemUser(UserInfo userInfo) { + return userInfo.id == UserHandle.USER_SYSTEM; + } + + /** + * Returns whether this user can be removed from the system. + * + * @param userInfo User to be removed + * @return {@code true} if they can be removed, {@code false} otherwise. + */ + public boolean userCanBeRemoved(UserInfo userInfo) { + return !userIsSystemUser(userInfo); + } + + /** + * Checks whether passed in user is the user that's currently logged in. + * + * @param userInfo User to check. + * @return {@code true} if current user, {@code false} otherwise. + */ + public boolean userIsCurrentUser(UserInfo userInfo) { + return getCurrentUserInfo().id == userInfo.id; + } + + // Current user information accessors + + /** + * Checks if the current user is a demo user. + */ + public boolean isDemoUser() { + return mUserManager.isDemoUser(); + } + + /** + * Checks if the current user is a guest user. + */ + public boolean isGuestUser() { + return mUserManager.isGuestUser(); + } + + /** + * Checks if the current user is the system user (User 0). + */ + public boolean isSystemUser() { + return mUserManager.isSystemUser(); + } + + // Current user restriction accessors + + /** + * Return whether the current user has a restriction. + * + * @param restriction Restriction to check. Should be a UserManager.* restriction. + * @return Whether that restriction exists for the current user. + */ + public boolean hasUserRestriction(String restriction) { + return mUserManager.hasUserRestriction(restriction); + } + + /** + * Checks if the current user can add new users. + */ + public boolean canAddUsers() { + return !hasUserRestriction(UserManager.DISALLOW_ADD_USER); + } + + /** + * Checks if the current user can remove users. + */ + public boolean canRemoveUsers() { + return !hasUserRestriction(UserManager.DISALLOW_REMOVE_USER); + } + + /** + * Checks if the current user is allowed to switch to another user. + */ + public boolean canSwitchUsers() { + return !hasUserRestriction(UserManager.DISALLOW_USER_SWITCH); + } + + /** + * Checks if the current user can modify accounts. Demo and Guest users cannot modify accounts + * even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied. + */ + public boolean canModifyAccounts() { + return !hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS) && !isDemoUser() + && !isGuestUser(); + } + + // User actions + + /** + * Creates a new user on the system. + * + * @param userName Name to give to the newly created user. + * @return Newly created user. + */ + public UserInfo createNewUser(String userName) { + UserInfo user = mUserManager.createUser(userName, 0 /* flags */); + if (user == null) { + // Couldn't create user, most likely because there are too many, but we haven't + // been able to reload the list yet. + Log.w(TAG, "can't create user."); + return null; + } + assignDefaultIcon(user); + return user; + } + + /** + * Tries to remove the user that's passed in. System user cannot be removed. + * If the user to be removed is current user, it switches to the system user first, and then + * removes the user. + * + * @param userInfo User to be removed + * @return {@code true} if user is successfully removed, {@code false} otherwise. + */ + public boolean removeUser(UserInfo userInfo) { + if (userInfo.id == UserHandle.USER_SYSTEM) { + Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed."); + return false; + } + + if (userInfo.id == getCurrentUserInfo().id) { + switchToUserId(UserHandle.USER_SYSTEM); + } + + return mUserManager.removeUser(userInfo.id); + } + + /** + * Switches (logs in) to another user. + * + * @param userInfo User to switch to. + */ + public void switchToUser(UserInfo userInfo) { + if (userInfo.id == getCurrentUserInfo().id) { + return; + } + + if (userInfo.isGuest()) { + switchToGuest(userInfo.name); + return; + } + + if (UserManager.isGuestUserEphemeral()) { + // If switching from guest, we want to bring up the guest exit dialog instead of + // switching + UserInfo currUserInfo = getCurrentUserInfo(); + if (currUserInfo != null && currUserInfo.isGuest()) { + return; + } + } + + switchToUserId(userInfo.id); + } + + /** + * Creates a guest session and switches into the guest session. + * + * @param guestName Username for the guest user. + */ + public void switchToGuest(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 + // been able to reload the list yet. + Log.w(TAG, "can't create user."); + return; + } + switchToUserId(guest.id); + } + + /** + * Gets an icon for the user. + * + * @param userInfo User for which we want to get the icon. + * @return a Bitmap for the icon + */ + public Bitmap getUserIcon(UserInfo userInfo) { + Bitmap picture = mUserManager.getUserIcon(userInfo.id); + + if (picture == null) { + return assignDefaultIcon(userInfo); + } + + return picture; + } + + /** + * Method for scaling a Bitmap icon to a desirable size. + * + * @param icon Bitmap to scale. + * @param desiredSize Wanted size for the icon. + * @return Drawable for the icon, scaled to the new size. + */ + public Drawable scaleUserIcon(Bitmap icon, int desiredSize) { + Bitmap scaledIcon = Bitmap.createScaledBitmap( + icon, desiredSize, desiredSize, true /* filter */); + return new BitmapDrawable(mContext.getResources(), scaledIcon); + } + + /** + * Sets new Username for the user. + * + * @param user User whose name should be changed. + * @param name New username. + */ + public void setUserName(UserInfo user, String name) { + mUserManager.setUserName(user.id, name); + } + + private void registerReceiver() { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_REMOVED); + filter.addAction(Intent.ACTION_USER_ADDED); + filter.addAction(Intent.ACTION_USER_INFO_CHANGED); + mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null); + } + + /** + * Assigns a default icon to a user according to the user's id. + * + * @param userInfo User to assign a default icon to. + * @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)); + mUserManager.setUserIcon(userInfo.id, bitmap); + return bitmap; + } + + private void switchToUserId(int id) { + try { + final ActivityManager am = (ActivityManager) + mContext.getSystemService(Context.ACTIVITY_SERVICE); + am.switchUser(id); + } catch (Exception e) { + Log.e(TAG, "Couldn't switch user.", e); + } + } + + private void unregisterReceiver() { + mContext.unregisterReceiver(mUserChangeReceiver); + } + + /** + * Interface for listeners that want to register for receiving updates to changes to the users + * on the system including removing and adding users, and changing user info. + */ + public interface OnUsersUpdateListener { + /** + * Method that will get called when users list has been changed. + */ + void onUsersUpdate(); + } +} + 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 new file mode 100644 index 000000000000..325ef3a68aa6 --- /dev/null +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java @@ -0,0 +1,318 @@ +/* + * 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.users; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.UserInfo; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.UserHandle; +import android.os.UserManager; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +public class UserManagerHelperTest { + @Mock + private Context mContext; + @Mock + private UserManager mUserManager; + @Mock + private ActivityManager mActivityManager; + @Mock + private UserManagerHelper.OnUsersUpdateListener mTestListener; + + private UserManagerHelper mHelper; + private UserInfo mCurrentUser; + private UserInfo mSystemUser; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager); + when(mContext.getResources()) + .thenReturn(InstrumentationRegistry.getTargetContext().getResources()); + mHelper = new UserManagerHelper(mContext); + + mCurrentUser = createUserInfoForId(UserHandle.myUserId()); + mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM); + when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentUser); + } + + @Test + public void testUserIsSystemUser() { + UserInfo testInfo = new UserInfo(); + + testInfo.id = UserHandle.USER_SYSTEM; + assertThat(mHelper.userIsSystemUser(testInfo)).isTrue(); + + testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. + assertThat(mHelper.userIsSystemUser(testInfo)).isFalse(); + } + + @Test + public void testGetAllUsersExcludesCurrentUser() { + int currentUser = UserHandle.myUserId(); + + UserInfo otherUser1 = createUserInfoForId(currentUser + 1); + UserInfo otherUser2 = createUserInfoForId(currentUser - 1); + UserInfo otherUser3 = createUserInfoForId(currentUser + 2); + + List<UserInfo> testUsers = new ArrayList<>(); + testUsers.add(otherUser1); + testUsers.add(otherUser2); + testUsers.add(mCurrentUser); + testUsers.add(otherUser3); + + when(mUserManager.getUsers(true)).thenReturn(testUsers); + + // Should return 3 users that don't have currentUser id. + assertThat(mHelper.getAllUsersExcludesCurrentUser().size()).isEqualTo(3); + // Should not contain current user. + assertThat(mHelper.getAllUsersExcludesCurrentUser()).doesNotContain(mCurrentUser); + // Should contain non-current users. + assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser1); + assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser2); + assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser3); + } + + @Test + public void testUserCanBeRemoved() { + UserInfo testInfo = new UserInfo(); + + // System user cannot be removed. + testInfo.id = UserHandle.USER_SYSTEM; + assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse(); + + testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. + assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue(); + } + + @Test + public void testUserIsCurrentUser() { + UserInfo testInfo = new UserInfo(); + + // System user cannot be removed. + testInfo.id = UserHandle.myUserId(); + assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue(); + + testInfo.id = UserHandle.myUserId() + 2; + assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse(); + } + + @Test + public void testCanAddUsers() { + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false); + assertThat(mHelper.canAddUsers()).isTrue(); + + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true); + assertThat(mHelper.canAddUsers()).isFalse(); + } + + @Test + public void testCanRemoveUsers() { + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false); + assertThat(mHelper.canRemoveUsers()).isTrue(); + + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true); + assertThat(mHelper.canRemoveUsers()).isFalse(); + } + + @Test + public void testCanSwitchUsers() { + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false); + assertThat(mHelper.canSwitchUsers()).isTrue(); + + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true); + assertThat(mHelper.canSwitchUsers()).isFalse(); + } + + @Test + public void testGuestCannotModifyAccounts() { + assertThat(mHelper.canModifyAccounts()).isTrue(); + + when(mUserManager.isGuestUser()).thenReturn(true); + assertThat(mHelper.canModifyAccounts()).isFalse(); + } + + @Test + public void testDemoUserCannotModifyAccounts() { + assertThat(mHelper.canModifyAccounts()).isTrue(); + + when(mUserManager.isDemoUser()).thenReturn(true); + assertThat(mHelper.canModifyAccounts()).isFalse(); + } + + @Test + public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() { + assertThat(mHelper.canModifyAccounts()).isTrue(); + + when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) + .thenReturn(true); + assertThat(mHelper.canModifyAccounts()).isFalse(); + } + + @Test + public void testCreateNewUser() { + // Verify createUser on UserManager gets called. + mHelper.createNewUser("Test User"); + verify(mUserManager).createUser("Test User", 0); + + when(mUserManager.createUser("Test User", 0)).thenReturn(null); + assertThat(mHelper.createNewUser("Test User")).isNull(); + + UserInfo newUser = new UserInfo(); + newUser.name = "Test User"; + when(mUserManager.createUser("Test User", 0)).thenReturn(newUser); + assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser); + } + + @Test + public void testRemoveUser() { + // Cannot remove system user. + assertThat(mHelper.removeUser(mSystemUser)).isFalse(); + + // Removing current user, calls "switch" to system user. + mHelper.removeUser(mCurrentUser); + verify(mActivityManager).switchUser(UserHandle.USER_SYSTEM); + verify(mUserManager).removeUser(mCurrentUser.id); + + // Removing non-current, non-system user, simply calls removeUser. + UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2); + mHelper.removeUser(userToRemove); + verify(mUserManager).removeUser(mCurrentUser.id + 2); + } + + @Test + public void testSwitchToUser() { + // Switching to current user doesn't do anything. + mHelper.switchToUser(mCurrentUser); + verify(mActivityManager, never()).switchUser(mCurrentUser.id); + + // Switching to Guest calls createGuest. + UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST); + mHelper.switchToUser(guestInfo); + verify(mUserManager).createGuest(mContext, "Test Guest"); + + // Switching to non-current, non-guest user, simply calls switchUser. + UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0); + mHelper.switchToUser(userToSwitchTo); + verify(mActivityManager).switchUser(mCurrentUser.id + 5); + } + + @Test + public void testSwitchToGuest() { + mHelper.switchToGuest("Test Guest"); + verify(mUserManager).createGuest(mContext, "Test Guest"); + + UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST); + when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo); + mHelper.switchToGuest("Test Guest"); + verify(mActivityManager).switchUser(mCurrentUser.id + 2); + } + + @Test + public void testGetUserIcon() { + mHelper.getUserIcon(mCurrentUser); + verify(mUserManager).getUserIcon(mCurrentUser.id); + } + + @Test + public void testScaleUserIcon() { + Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); + Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300); + assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300); + assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300); + } + + @Test + public void testSetUserName() { + UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3); + mHelper.setUserName(testInfo, "New Test Name"); + verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name"); + } + + @Test + public void testRegisterUserChangeReceiver() { + mHelper.registerOnUsersUpdateListener(mTestListener); + + ArgumentCaptor<BroadcastReceiver> receiverCaptor = + ArgumentCaptor.forClass(BroadcastReceiver.class); + ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class); + ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class); + ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class); + + verify(mContext).registerReceiverAsUser( + receiverCaptor.capture(), + handleCaptor.capture(), + filterCaptor.capture(), + permissionCaptor.capture(), + handlerCaptor.capture()); + + // Verify we're listening to Intents from ALL users. + assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL); + + // Verify the presence of each intent in the filter. + // Verify the exact number of filters. Every time a new intent is added, this test should + // get updated. + assertThat(filterCaptor.getValue().countActions()).isEqualTo(3); + assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue(); + assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue(); + assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue(); + + // Verify that calling the receiver calls the listener. + receiverCaptor.getValue().onReceive(mContext, new Intent()); + verify(mTestListener).onUsersUpdate(); + + assertThat(permissionCaptor.getValue()).isNull(); + assertThat(handlerCaptor.getValue()).isNull(); + + + // Unregister the receiver. + mHelper.unregisterOnUsersUpdateListener(); + verify(mContext).unregisterReceiver(receiverCaptor.getValue()); + } + + private UserInfo createUserInfoForId(int id) { + UserInfo userInfo = new UserInfo(); + userInfo.id = id; + return userInfo; + } +} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index f215c1220610..b37071bf24cf 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1798,76 +1798,52 @@ public class SettingsProvider extends ContentProvider { if (TextUtils.isEmpty(value)) { return false; } - - final char prefix = value.charAt(0); - if (prefix != '+' && prefix != '-') { - if (forceNotify) { - final int key = makeKey(SETTINGS_TYPE_SECURE, owningUserId); - mSettingsRegistry.notifyForSettingsChange(key, - Settings.Secure.LOCATION_PROVIDERS_ALLOWED); - } - return false; - } - - // skip prefix - value = value.substring(1); - - Setting settingValue = getSecureSetting( - Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId); - if (settingValue == null) { + Setting oldSetting = getSecureSetting( + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, owningUserId); + if (oldSetting == null) { return false; } - - String oldProviders = !settingValue.isNull() ? settingValue.getValue() : ""; - - int index = oldProviders.indexOf(value); - int end = index + value.length(); - - // check for commas to avoid matching on partial string - if (index > 0 && oldProviders.charAt(index - 1) != ',') { - index = -1; - } - - // check for commas to avoid matching on partial string - if (end < oldProviders.length() && oldProviders.charAt(end) != ',') { - index = -1; - } - - String newProviders; - - if (prefix == '+' && index < 0) { - // append the provider to the list if not present - if (oldProviders.length() == 0) { - newProviders = value; - } else { - newProviders = oldProviders + ',' + value; + String oldProviders = oldSetting.getValue(); + List<String> oldProvidersList = TextUtils.isEmpty(oldProviders) + ? new ArrayList<>() : new ArrayList<>(Arrays.asList(oldProviders.split(","))); + Set<String> newProvidersSet = new ArraySet<>(); + newProvidersSet.addAll(oldProvidersList); + + String[] providerUpdates = value.split(","); + boolean inputError = false; + for (String provider : providerUpdates) { + // do not update location_providers_allowed when input is invalid + if (TextUtils.isEmpty(provider)) { + inputError = true; + break; } - } else if (prefix == '-' && index >= 0) { - // remove the provider from the list if present - // remove leading or trailing comma - if (index > 0) { - index--; - } else if (end < oldProviders.length()) { - end++; + final char prefix = provider.charAt(0); + // do not update location_providers_allowed when input is invalid + if (prefix != '+' && prefix != '-') { + inputError = true; + break; } - - newProviders = oldProviders.substring(0, index); - if (end < oldProviders.length()) { - newProviders += oldProviders.substring(end); + // skip prefix + provider = provider.substring(1); + if (prefix == '+') { + newProvidersSet.add(provider); + } else if (prefix == '-') { + newProvidersSet.remove(provider); } - } else { + } + String newProviders = TextUtils.join(",", newProvidersSet.toArray()); + if (inputError == true || newProviders.equals(oldProviders)) { // nothing changed, so no need to update the database if (forceNotify) { - final int key = makeKey(SETTINGS_TYPE_SECURE, owningUserId); - mSettingsRegistry.notifyForSettingsChange(key, + mSettingsRegistry.notifyForSettingsChange( + makeKey(SETTINGS_TYPE_SECURE, owningUserId), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); } return false; } - return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_SECURE, - owningUserId, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, newProviders, - tag, makeDefault, getCallingPackage(), forceNotify, CRITICAL_SECURE_SETTINGS); + owningUserId, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, newProviders, tag, + makeDefault, getCallingPackage(), forceNotify, CRITICAL_SECURE_SETTINGS); } private static void warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk( diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java index e2a8fba2f1c7..b6f51bc4d781 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java @@ -17,8 +17,8 @@ package com.android.providers.settings; import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertSame; import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertSame; import static junit.framework.Assert.fail; import android.content.ContentResolver; @@ -32,9 +32,8 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.util.Log; -import org.junit.Test; - import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Test; /** * Tests for the SettingContentProvider. @@ -688,4 +687,112 @@ public class SettingsProviderTest extends BaseSettingsProviderTest { cursor.close(); } } + + @Test + public void testUpdateLocationProvidersAllowedLocked_enableProviders() throws Exception { + setSettingViaFrontEndApiAndAssertSuccessfulChange( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_MODE, + String.valueOf(Settings.Secure.LOCATION_MODE_OFF), + UserHandle.USER_SYSTEM); + + // Enable one provider + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "+gps"); + + assertEquals( + "Wrong location providers", + "gps", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + + // Enable a list of providers, including the one that is already enabled + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "+gps,+network,+network"); + + assertEquals( + "Wrong location providers", + "gps,network", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + } + + @Test + public void testUpdateLocationProvidersAllowedLocked_disableProviders() throws Exception { + setSettingViaFrontEndApiAndAssertSuccessfulChange( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_MODE, + String.valueOf(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY), + UserHandle.USER_SYSTEM); + + // Disable providers that were enabled + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "-gps,-network"); + + assertEquals( + "Wrong location providers", + "", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + + // Disable a provider that was not enabled + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "-test"); + + assertEquals( + "Wrong location providers", + "", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + } + + @Test + public void testUpdateLocationProvidersAllowedLocked_enableAndDisable() throws Exception { + setSettingViaFrontEndApiAndAssertSuccessfulChange( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_MODE, + String.valueOf(Settings.Secure.LOCATION_MODE_OFF), + UserHandle.USER_SYSTEM); + + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "+gps,+network,+test"); + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "-test"); + + assertEquals( + "Wrong location providers", + "gps,network", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + } + + @Test + public void testUpdateLocationProvidersAllowedLocked_invalidInput() throws Exception { + setSettingViaFrontEndApiAndAssertSuccessfulChange( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_MODE, + String.valueOf(Settings.Secure.LOCATION_MODE_OFF), + UserHandle.USER_SYSTEM); + + // update providers with a invalid string + updateStringViaProviderApiSetting( + SETTING_TYPE_SECURE, + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "+gps, invalid-string"); + + // Verifies providers list does not change + assertEquals( + "Wrong location providers", + "", + queryStringViaProviderApi( + SETTING_TYPE_SECURE, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)); + } } diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk index f65efb893e34..68293d964601 100644 --- a/packages/SystemUI/Android.mk +++ b/packages/SystemUI/Android.mk @@ -37,6 +37,7 @@ LOCAL_SRC_FILES := \ LOCAL_STATIC_ANDROID_LIBRARIES := \ SystemUIPluginLib \ SystemUISharedLib \ + android-support-car \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-preference \ diff --git a/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml b/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml new file mode 100644 index 000000000000..25b449ab3a8a --- /dev/null +++ b/packages/SystemUI/res/drawable/car_rounded_bg_bottom.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="?android:attr/colorBackgroundFloating" /> + <corners + android:bottomLeftRadius="@dimen/car_radius_3" + android:topLeftRadius="0dp" + android:bottomRightRadius="@dimen/car_radius_3" + android:topRightRadius="0dp" + /> +</shape> diff --git a/packages/SystemUI/res/layout/car_volume_dialog.xml b/packages/SystemUI/res/layout/car_volume_dialog.xml new file mode 100644 index 000000000000..dca50a5e929c --- /dev/null +++ b/packages/SystemUI/res/layout/car_volume_dialog.xml @@ -0,0 +1,68 @@ +<!-- + 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. +--> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/car_margin" + android:layout_marginEnd="@dimen/car_margin" + android:background="@drawable/car_rounded_bg_bottom" + android:theme="@style/qs_theme" + android:clipChildren="false" > + <LinearLayout + android:id="@+id/volume_dialog" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal|top" + android:orientation="vertical" + android:clipChildren="false" > + + <LinearLayout + android:id="@+id/main" + android:layout_width="match_parent" + android:minWidth="@dimen/volume_dialog_panel_width" + android:layout_height="wrap_content" + android:orientation="vertical" + android:clipChildren="false" + android:clipToPadding="false" + android:elevation="@dimen/volume_panel_elevation" > + <LinearLayout + android:id="@+id/car_volume_dialog_rows" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:orientation="vertical" > + <!-- volume rows added and removed here! :-) --> + </LinearLayout> + </LinearLayout> + </LinearLayout> + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="@dimen/car_single_line_list_item_height" + android:gravity="center" + android:layout_marginEnd="@dimen/car_keyline_1"> + <ImageButton + android:id="@+id/expand" + android:layout_gravity="center" + android:layout_width="@dimen/car_primary_icon_size" + android:layout_height="@dimen/car_primary_icon_size" + android:layout_marginEnd="@dimen/car_keyline_1" + android:src="@drawable/car_ic_arrow_drop_up" + android:tint="@color/car_tint" + android:scaleType="fitCenter" + /> + </FrameLayout> +</FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/car_volume_dialog_row.xml b/packages/SystemUI/res/layout/car_volume_dialog_row.xml new file mode 100644 index 000000000000..14baf49f819b --- /dev/null +++ b/packages/SystemUI/res/layout/car_volume_dialog_row.xml @@ -0,0 +1,47 @@ +<!-- + 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. +--> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:tag="row" + android:layout_height="@dimen/car_single_line_list_item_height" + android:layout_width="match_parent" + android:clipChildren="false" + android:clipToPadding="false" + android:theme="@style/qs_theme"> + + <LinearLayout + android:layout_height="match_parent" + android:layout_width="match_parent" + android:gravity="center" + android:layout_gravity="center" + android:orientation="horizontal" > + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/volume_row_icon" + android:layout_width="@dimen/car_primary_icon_size" + android:layout_height="@dimen/car_primary_icon_size" + android:layout_marginStart="@dimen/car_keyline_1" + android:tint="@color/car_tint" + android:scaleType="fitCenter" + android:soundEffectsEnabled="false" /> + <SeekBar + android:id="@+id/volume_row_slider" + android:clickable="true" + android:layout_marginStart="@dimen/car_keyline_3" + android:layout_marginEnd="@dimen/car_keyline_3" + android:layout_width="match_parent" + android:layout_height="@dimen/car_single_line_list_item_height"/> + </LinearLayout> +</FrameLayout> diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 7db2a505b861..068fd3f5c5f9 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -16,6 +16,8 @@ package com.android.systemui.screenshot; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + import static com.android.systemui.screenshot.GlobalScreenshot.SHARING_INTENT; import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT; @@ -26,11 +28,11 @@ import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.admin.DevicePolicyManager; import android.app.Notification; import android.app.Notification.BigPictureStyle; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -58,7 +60,6 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.MediaStore; import android.util.DisplayMetrics; -import android.util.Log; import android.util.Slog; import android.view.Display; import android.view.LayoutInflater; @@ -517,6 +518,7 @@ class GlobalScreenshot { | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, PixelFormat.TRANSLUCENT); mWindowLayoutParams.setTitle("ScreenshotAnimation"); + mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index fcbd37c50f73..8fb0620d8064 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -679,11 +679,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav public void updateStates() { updateSlippery(); + reloadNavIcons(); updateNavButtonIcons(); } private void updateSlippery() { - setSlippery(mOverviewProxyService.getProxy() != null && mPanelView.isFullyExpanded()); + setSlippery(!isQuickStepSwipeUpEnabled() || mPanelView.isFullyExpanded()); } private void setSlippery(boolean slippery) { @@ -818,8 +819,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav public void onOverviewProxyConnectionChanged(boolean isConnected) { updateStates(); setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled()); - reloadNavIcons(); - updateNavButtonIcons(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java new file mode 100644 index 000000000000..41b094a32682 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java @@ -0,0 +1,835 @@ +/* + * 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.volume; + +import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.drawable.ColorDrawable; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.os.Debug; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.SystemClock; +import android.provider.Settings.Global; +import android.util.Log; +import android.util.Slog; +import android.util.SparseBooleanArray; +import android.view.ContextThemeWrapper; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.animation.DecelerateInterpolator; +import android.widget.ImageButton; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +import com.android.settingslib.Utils; +import com.android.systemui.Dependency; +import com.android.systemui.R; +import com.android.systemui.plugins.VolumeDialog; +import com.android.systemui.plugins.VolumeDialogController; +import com.android.systemui.plugins.VolumeDialogController.State; +import com.android.systemui.plugins.VolumeDialogController.StreamState; + +/** + * Car version of the volume dialog. + * + * A client of VolumeDialogControllerImpl and its state model. + * + * Methods ending in "H" must be called on the (ui) handler. + */ +public class CarVolumeDialogImpl implements VolumeDialog { + private static final String TAG = Util.logTag(CarVolumeDialogImpl.class); + + private static final long USER_ATTEMPT_GRACE_PERIOD = 1000; + private static final int UPDATE_ANIMATION_DURATION = 80; + + private final Context mContext; + private final H mHandler = new H(); + private final VolumeDialogController mController; + + private Window mWindow; + private CustomDialog mDialog; + private ViewGroup mDialogView; + private ViewGroup mDialogRowsView; + private final List<VolumeRow> mRows = new ArrayList<>(); + private ConfigurableTexts mConfigurableTexts; + private final SparseBooleanArray mDynamic = new SparseBooleanArray(); + private final KeyguardManager mKeyguard; + private final Object mSafetyWarningLock = new Object(); + private final ColorStateList mActiveSliderTint; + private final ColorStateList mInactiveSliderTint; + + private boolean mShowing; + + private int mActiveStream; + private int mPrevActiveStream; + private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE; + private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE; + private State mState; + private SafetyWarningDialog mSafetyWarning; + private boolean mHovering = false; + private boolean mExpanded = false; + private View mExpandBtn; + + public CarVolumeDialogImpl(Context context) { + mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme); + mController = Dependency.get(VolumeDialogController.class); + mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext)); + mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive); + } + + public void init(int windowType, Callback callback) { + initDialog(); + + mController.addCallback(mControllerCallbackH, mHandler); + mController.getState(); + } + + @Override + public void destroy() { + mController.removeCallback(mControllerCallbackH); + mHandler.removeCallbacksAndMessages(null); + } + + private void initDialog() { + mDialog = new CustomDialog(mContext); + + mConfigurableTexts = new ConfigurableTexts(mContext); + mHovering = false; + mShowing = false; + mWindow = mDialog.getWindow(); + mWindow.requestFeature(Window.FEATURE_NO_TITLE); + mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND + | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); + mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast); + final WindowManager.LayoutParams lp = mWindow.getAttributes(); + lp.format = PixelFormat.TRANSLUCENT; + lp.setTitle(VolumeDialogImpl.class.getSimpleName()); + lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; + lp.windowAnimations = -1; + mWindow.setAttributes(lp); + mWindow.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + + mDialog.setCanceledOnTouchOutside(true); + mDialog.setContentView(R.layout.car_volume_dialog); + mDialog.setOnShowListener(dialog -> { + mDialogView.setTranslationY(-mDialogView.getHeight()); + mDialogView.setAlpha(0); + mDialogView.animate() + .alpha(1) + .translationY(0) + .setDuration(300) + .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator()) + .start(); + }); + mExpandBtn = mDialog.findViewById(R.id.expand); + mExpandBtn.setOnClickListener(v -> { + mExpanded = !mExpanded; + updateRowsH(getActiveRow()); + }); + mDialogView = mDialog.findViewById(R.id.volume_dialog); + mDialogView.setOnHoverListener((v, event) -> { + int action = event.getActionMasked(); + mHovering = (action == MotionEvent.ACTION_HOVER_ENTER) + || (action == MotionEvent.ACTION_HOVER_MOVE); + rescheduleTimeoutH(); + return true; + }); + + mDialogRowsView = mDialog.findViewById(R.id.car_volume_dialog_rows); + + if (mRows.isEmpty()) { + addRow(AudioManager.STREAM_MUSIC, + R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true); + addRow(AudioManager.STREAM_RING, + R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false); + addRow(AudioManager.STREAM_ALARM, + R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, true, false); + } else { + addExistingRows(); + } + + updateRowsH(getActiveRow()); + } + + private ColorStateList loadColorStateList(int colorResId) { + return ColorStateList.valueOf(mContext.getColor(colorResId)); + } + + public void setStreamImportant(int stream, boolean important) { + mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget(); + } + + public void setAutomute(boolean automute) { + if (mAutomute == automute) return; + mAutomute = automute; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + public void setSilentMode(boolean silentMode) { + if (mSilentMode == silentMode) return; + mSilentMode = silentMode; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + private void addRow(int stream, int iconRes, int iconMuteRes, boolean important, + boolean defaultStream) { + addRow(stream, iconRes, iconMuteRes, important, defaultStream, false); + } + + private void addRow(int stream, int iconRes, int iconMuteRes, boolean important, + boolean defaultStream, boolean dynamic) { + if (D.BUG) Slog.d(TAG, "Adding row for stream " + stream); + VolumeRow row = new VolumeRow(); + initRow(row, stream, iconRes, iconMuteRes, important, defaultStream); + mDialogRowsView.addView(row.view); + mRows.add(row); + } + + private void addExistingRows() { + int N = mRows.size(); + for (int i = 0; i < N; i++) { + final VolumeRow row = mRows.get(i); + initRow(row, row.stream, row.iconRes, row.iconMuteRes, row.important, + row.defaultStream); + mDialogRowsView.addView(row.view); + updateVolumeRowH(row); + } + } + + private VolumeRow getActiveRow() { + for (VolumeRow row : mRows) { + if (row.stream == mActiveStream) { + return row; + } + } + return mRows.get(0); + } + + private VolumeRow findRow(int stream) { + for (VolumeRow row : mRows) { + if (row.stream == stream) return row; + } + return null; + } + + public void dump(PrintWriter writer) { + writer.println(VolumeDialogImpl.class.getSimpleName() + " state:"); + writer.print(" mShowing: "); writer.println(mShowing); + writer.print(" mActiveStream: "); writer.println(mActiveStream); + writer.print(" mDynamic: "); writer.println(mDynamic); + writer.print(" mAutomute: "); writer.println(mAutomute); + writer.print(" mSilentMode: "); writer.println(mSilentMode); + } + + private static int getImpliedLevel(SeekBar seekBar, int progress) { + final int m = seekBar.getMax(); + final int n = m / 100 - 1; + final int level = progress == 0 ? 0 + : progress == m ? (m / 100) : (1 + (int)((progress / (float) m) * n)); + return level; + } + + @SuppressLint("InflateParams") + private void initRow(final VolumeRow row, final int stream, int iconRes, int iconMuteRes, + boolean important, boolean defaultStream) { + row.stream = stream; + row.iconRes = iconRes; + row.iconMuteRes = iconMuteRes; + row.important = important; + row.defaultStream = defaultStream; + row.view = mDialog.getLayoutInflater().inflate(R.layout.car_volume_dialog_row, null); + row.view.setId(row.stream); + row.view.setTag(row); + row.slider = row.view.findViewById(R.id.volume_row_slider); + row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); + row.anim = null; + + row.icon = row.view.findViewById(R.id.volume_row_icon); + row.icon.setImageResource(iconRes); + } + + public void show(int reason) { + mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget(); + } + + public void dismiss(int reason) { + mHandler.obtainMessage(H.DISMISS, reason, 0).sendToTarget(); + } + + private void showH(int reason) { + if (D.BUG) Log.d(TAG, "showH r=" + Events.DISMISS_REASONS[reason]); + mHandler.removeMessages(H.SHOW); + mHandler.removeMessages(H.DISMISS); + rescheduleTimeoutH(); + if (mShowing) return; + mShowing = true; + + mDialog.show(); + Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); + mController.notifyVisible(true); + } + + protected void rescheduleTimeoutH() { + mHandler.removeMessages(H.DISMISS); + final int timeout = computeTimeoutH(); + mHandler.sendMessageDelayed(mHandler + .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout); + if (D.BUG) Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller()); + mController.userActivity(); + } + + private int computeTimeoutH() { + if (mHovering) return 16000; + if (mSafetyWarning != null) return 5000; + return 3000; + } + + protected void dismissH(int reason) { + mHandler.removeMessages(H.DISMISS); + mHandler.removeMessages(H.SHOW); + if (!mShowing) return; + mDialogView.animate().cancel(); + mShowing = false; + + mDialogView.setTranslationY(0); + mDialogView.setAlpha(1); + mDialogView.animate() + .alpha(0) + .translationY(-mDialogView.getHeight()) + .setDuration(250) + .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator()) + .withEndAction(() -> mHandler.postDelayed(() -> { + if (D.BUG) Log.d(TAG, "mDialog.dismiss()"); + mDialog.dismiss(); + }, 50)) + .start(); + + Events.writeEvent(mContext, Events.EVENT_DISMISS_DIALOG, reason); + mController.notifyVisible(false); + synchronized (mSafetyWarningLock) { + if (mSafetyWarning != null) { + if (D.BUG) Log.d(TAG, "SafetyWarning dismissed"); + mSafetyWarning.dismiss(); + } + } + } + + private boolean shouldBeVisibleH(VolumeRow row) { + if (mExpanded) { + return true; + } + return row.defaultStream; + } + + private void updateRowsH(final VolumeRow activeRow) { + if (D.BUG) Log.d(TAG, "updateRowsH"); + if (!mShowing) { + trimObsoleteH(); + } + // apply changes to all rows + for (final VolumeRow row : mRows) { + final boolean isActive = row == activeRow; + final boolean shouldBeVisible = shouldBeVisibleH(row); + Util.setVisOrGone(row.view, shouldBeVisible); + if (row.view.isShown()) { + updateVolumeRowSliderTintH(row, isActive); + } + } + } + + private void trimObsoleteH() { + if (D.BUG) Log.d(TAG, "trimObsoleteH"); + for (int i = mRows.size() - 1; i >= 0; i--) { + final VolumeRow row = mRows.get(i); + if (row.ss == null || !row.ss.dynamic) continue; + if (!mDynamic.get(row.stream)) { + mRows.remove(i); + mDialogRowsView.removeView(row.view); + } + } + } + + protected void onStateChangedH(State state) { + mState = state; + mDynamic.clear(); + // add any new dynamic rows + for (int i = 0; i < state.states.size(); i++) { + final int stream = state.states.keyAt(i); + final StreamState ss = state.states.valueAt(i); + if (!ss.dynamic) continue; + mDynamic.put(stream, true); + if (findRow(stream) == null) { + addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true, + false, true); + } + } + + if (mActiveStream != state.activeStream) { + mPrevActiveStream = mActiveStream; + mActiveStream = state.activeStream; + updateRowsH(getActiveRow()); + rescheduleTimeoutH(); + } + for (VolumeRow row : mRows) { + updateVolumeRowH(row); + } + + } + + private void updateVolumeRowH(VolumeRow row) { + if (D.BUG) Log.d(TAG, "updateVolumeRowH s=" + row.stream); + if (mState == null) return; + final StreamState ss = mState.states.get(row.stream); + if (ss == null) return; + row.ss = ss; + if (ss.level > 0) { + row.lastAudibleLevel = ss.level; + } + if (ss.level == row.requestedLevel) { + row.requestedLevel = -1; + } + final boolean isRingStream = row.stream == AudioManager.STREAM_RING; + final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM; + final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM; + final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC; + final boolean isRingVibrate = isRingStream + && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE; + final boolean isRingSilent = isRingStream + && mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT; + final boolean isZenPriorityOnly = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS; + final boolean isZenNone = mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; + final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream) + : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream) + : isZenPriorityOnly ? ((isAlarmStream && mState.disallowAlarms) || + (isMusicStream && mState.disallowMedia) || + (isRingStream && mState.disallowRinger) || + (isSystemStream && mState.disallowSystem)) + : false; + + // update slider max + final int max = ss.levelMax * 100; + if (max != row.slider.getMax()) { + row.slider.setMax(max); + } + + // update icon + final boolean iconEnabled = (mAutomute || ss.muteSupported) && !zenMuted; + row.icon.setEnabled(iconEnabled); + row.icon.setAlpha(iconEnabled ? 1 : 0.5f); + final int iconRes = + isRingVibrate ? R.drawable.ic_volume_ringer_vibrate + : isRingSilent || zenMuted ? row.iconMuteRes + : ss.routedToBluetooth ? + (ss.muted ? R.drawable.ic_volume_media_bt_mute + : R.drawable.ic_volume_media_bt) + : mAutomute && ss.level == 0 ? row.iconMuteRes + : (ss.muted ? row.iconMuteRes : row.iconRes); + row.icon.setImageResource(iconRes); + row.iconState = + iconRes == R.drawable.ic_volume_ringer_vibrate ? Events.ICON_STATE_VIBRATE + : (iconRes == R.drawable.ic_volume_media_bt_mute || iconRes == row.iconMuteRes) + ? Events.ICON_STATE_MUTE + : (iconRes == R.drawable.ic_volume_media_bt || iconRes == row.iconRes) + ? Events.ICON_STATE_UNMUTE + : Events.ICON_STATE_UNKNOWN; + if (iconEnabled) { + if (isRingStream) { + if (isRingVibrate) { + row.icon.setContentDescription(mContext.getString( + R.string.volume_stream_content_description_unmute, + getStreamLabelH(ss))); + } else { + if (mController.hasVibrator()) { + row.icon.setContentDescription(mContext.getString( + R.string.volume_stream_content_description_vibrate, + getStreamLabelH(ss))); + } else { + row.icon.setContentDescription(mContext.getString( + R.string.volume_stream_content_description_mute, + getStreamLabelH(ss))); + } + } + } else { + if (ss.muted || mAutomute && ss.level == 0) { + row.icon.setContentDescription(mContext.getString( + R.string.volume_stream_content_description_unmute, + getStreamLabelH(ss))); + } else { + row.icon.setContentDescription(mContext.getString( + R.string.volume_stream_content_description_mute, + getStreamLabelH(ss))); + } + } + } else { + row.icon.setContentDescription(getStreamLabelH(ss)); + } + + // ensure tracking is disabled if zenMuted + if (zenMuted) { + row.tracking = false; + } + + // update slider + final boolean enableSlider = !zenMuted; + final int vlevel = row.ss.muted && (!isRingStream && !zenMuted) ? 0 + : row.ss.level; + updateVolumeRowSliderH(row, enableSlider, vlevel); + } + + private String getStreamLabelH(StreamState ss) { + if (ss.remoteLabel != null) { + return ss.remoteLabel; + } + try { + return mContext.getResources().getString(ss.name); + } catch (Resources.NotFoundException e) { + Slog.e(TAG, "Can't find translation for stream " + ss); + return ""; + } + } + + private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) { + if (isActive) { + row.slider.requestFocus(); + } + final ColorStateList tint = isActive && row.slider.isEnabled() ? mActiveSliderTint + : mInactiveSliderTint; + if (tint == row.cachedSliderTint) return; + row.cachedSliderTint = tint; + row.slider.setProgressTintList(tint); + row.slider.setThumbTintList(tint); + } + + private void updateVolumeRowSliderH(VolumeRow row, boolean enable, int vlevel) { + row.slider.setEnabled(enable); + updateVolumeRowSliderTintH(row, row.stream == mActiveStream); + if (row.tracking) { + return; // don't update if user is sliding + } + final int progress = row.slider.getProgress(); + final int level = getImpliedLevel(row.slider, progress); + final boolean rowVisible = row.view.getVisibility() == View.VISIBLE; + final boolean inGracePeriod = (SystemClock.uptimeMillis() - row.userAttempt) + < USER_ATTEMPT_GRACE_PERIOD; + mHandler.removeMessages(H.RECHECK, row); + if (mShowing && rowVisible && inGracePeriod) { + if (D.BUG) Log.d(TAG, "inGracePeriod"); + mHandler.sendMessageAtTime(mHandler.obtainMessage(H.RECHECK, row), + row.userAttempt + USER_ATTEMPT_GRACE_PERIOD); + return; // don't update if visible and in grace period + } + if (vlevel == level) { + if (mShowing && rowVisible) { + return; // don't clamp if visible + } + } + final int newProgress = vlevel * 100; + if (progress != newProgress) { + if (mShowing && rowVisible) { + // animate! + if (row.anim != null && row.anim.isRunning() + && row.animTargetProgress == newProgress) { + return; // already animating to the target progress + } + // start/update animation + if (row.anim == null) { + row.anim = ObjectAnimator.ofInt(row.slider, "progress", progress, newProgress); + row.anim.setInterpolator(new DecelerateInterpolator()); + } else { + row.anim.cancel(); + row.anim.setIntValues(progress, newProgress); + } + row.animTargetProgress = newProgress; + row.anim.setDuration(UPDATE_ANIMATION_DURATION); + row.anim.start(); + } else { + // update slider directly to clamped value + if (row.anim != null) { + row.anim.cancel(); + } + row.slider.setProgress(newProgress, true); + } + } + } + + private void recheckH(VolumeRow row) { + if (row == null) { + if (D.BUG) Log.d(TAG, "recheckH ALL"); + trimObsoleteH(); + for (VolumeRow r : mRows) { + updateVolumeRowH(r); + } + } else { + if (D.BUG) Log.d(TAG, "recheckH " + row.stream); + updateVolumeRowH(row); + } + } + + private void setStreamImportantH(int stream, boolean important) { + for (VolumeRow row : mRows) { + if (row.stream == stream) { + row.important = important; + return; + } + } + } + + private void showSafetyWarningH(int flags) { + if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0 + || mShowing) { + synchronized (mSafetyWarningLock) { + if (mSafetyWarning != null) { + return; + } + mSafetyWarning = new SafetyWarningDialog(mContext, mController.getAudioManager()) { + @Override + protected void cleanUp() { + synchronized (mSafetyWarningLock) { + mSafetyWarning = null; + } + recheckH(null); + } + }; + mSafetyWarning.show(); + } + recheckH(null); + } + rescheduleTimeoutH(); + } + + private final VolumeDialogController.Callbacks mControllerCallbackH + = new VolumeDialogController.Callbacks() { + @Override + public void onShowRequested(int reason) { + showH(reason); + } + + @Override + public void onDismissRequested(int reason) { + dismissH(reason); + } + + @Override + public void onScreenOff() { + dismissH(Events.DISMISS_REASON_SCREEN_OFF); + } + + @Override + public void onStateChanged(State state) { + onStateChangedH(state); + } + + @Override + public void onLayoutDirectionChanged(int layoutDirection) { + mDialogView.setLayoutDirection(layoutDirection); + } + + @Override + public void onConfigurationChanged() { + mDialog.dismiss(); + initDialog(); + mConfigurableTexts.update(); + } + + @Override + public void onShowVibrateHint() { + if (mSilentMode) { + mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false); + } + } + + @Override + public void onShowSilentHint() { + if (mSilentMode) { + mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false); + } + } + + @Override + public void onShowSafetyWarning(int flags) { + showSafetyWarningH(flags); + } + + @Override + public void onAccessibilityModeChanged(Boolean showA11yStream) { + } + }; + + private final class H extends Handler { + private static final int SHOW = 1; + private static final int DISMISS = 2; + private static final int RECHECK = 3; + private static final int RECHECK_ALL = 4; + private static final int SET_STREAM_IMPORTANT = 5; + private static final int RESCHEDULE_TIMEOUT = 6; + private static final int STATE_CHANGED = 7; + + public H() { + super(Looper.getMainLooper()); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case SHOW: showH(msg.arg1); break; + case DISMISS: dismissH(msg.arg1); break; + case RECHECK: recheckH((VolumeRow) msg.obj); break; + case RECHECK_ALL: recheckH(null); break; + case SET_STREAM_IMPORTANT: setStreamImportantH(msg.arg1, msg.arg2 != 0); break; + case RESCHEDULE_TIMEOUT: rescheduleTimeoutH(); break; + case STATE_CHANGED: onStateChangedH(mState); break; + } + } + } + + private final class CustomDialog extends Dialog implements DialogInterface { + public CustomDialog(Context context) { + super(context, com.android.systemui.R.style.qs_theme); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + rescheduleTimeoutH(); + return super.dispatchTouchEvent(ev); + } + + @Override + protected void onStart() { + super.setCanceledOnTouchOutside(true); + super.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (isShowing()) { + if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { + dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE); + return true; + } + } + return false; + } + } + + private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener { + private final VolumeRow mRow; + + private VolumeSeekBarChangeListener(VolumeRow row) { + mRow = row; + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (mRow.ss == null) return; + if (D.BUG) Log.d(TAG, AudioSystem.streamToString(mRow.stream) + + " onProgressChanged " + progress + " fromUser=" + fromUser); + if (!fromUser) return; + if (mRow.ss.levelMin > 0) { + final int minProgress = mRow.ss.levelMin * 100; + if (progress < minProgress) { + seekBar.setProgress(minProgress); + progress = minProgress; + } + } + final int userLevel = getImpliedLevel(seekBar, progress); + if (mRow.ss.level != userLevel || mRow.ss.muted && userLevel > 0) { + mRow.userAttempt = SystemClock.uptimeMillis(); + if (mRow.requestedLevel != userLevel) { + mController.setStreamVolume(mRow.stream, userLevel); + mRow.requestedLevel = userLevel; + Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream, + userLevel); + } + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + if (D.BUG) Log.d(TAG, "onStartTrackingTouch"+ " " + mRow.stream); + mController.setActiveStream(mRow.stream); + mRow.tracking = true; + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if (D.BUG) Log.d(TAG, "onStopTrackingTouch"+ " " + mRow.stream); + mRow.tracking = false; + mRow.userAttempt = SystemClock.uptimeMillis(); + final int userLevel = getImpliedLevel(seekBar, seekBar.getProgress()); + Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_DONE, mRow.stream, userLevel); + if (mRow.ss.level != userLevel) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(H.RECHECK, mRow), + USER_ATTEMPT_GRACE_PERIOD); + } + } + } + + private static class VolumeRow { + private View view; + private ImageButton icon; + private SeekBar slider; + private int stream; + private StreamState ss; + private long userAttempt; // last user-driven slider change + private boolean tracking; // tracking slider touch + private int requestedLevel = -1; // pending user-requested level via progress changed + private int iconRes; + private int iconMuteRes; + private boolean important; + private boolean defaultStream; + private ColorStateList cachedSliderTint; + private int iconState; // from Events + private ObjectAnimator anim; // slider progress animation for non-touch-related updates + private int animTargetProgress; + private int lastAudibleLevel = 1; + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java index 0203c43d3683..6e5b5484cabe 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java @@ -19,6 +19,7 @@ package com.android.systemui.volume; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.media.AudioManager; import android.media.VolumePolicy; @@ -80,6 +81,7 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class) .withPlugin(VolumeDialog.class) .withDefault(this::createDefault) + .withFeature(PackageManager.FEATURE_AUTOMOTIVE, this::createCarDefault) .withCallback(dialog -> { if (mDialog != null) { mDialog.destroy(); @@ -100,6 +102,14 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna return impl; } + private VolumeDialog createCarDefault() { + CarVolumeDialogImpl impl = new CarVolumeDialogImpl(mContext); + impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false); + impl.setAutomute(true); + impl.setSilentMode(false); + return impl; + } + @Override public void onTuningChanged(String key, String newValue) { if (VOLUME_DOWN_SILENT.equals(key)) { diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk index ebb088be8171..107ce1eecf2f 100644 --- a/packages/SystemUI/tests/Android.mk +++ b/packages/SystemUI/tests/Android.mk @@ -40,6 +40,7 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \ LOCAL_STATIC_ANDROID_LIBRARIES := \ SystemUIPluginLib \ SystemUISharedLib \ + android-support-car \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-preference \ diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 0cc60e3146d7..5d2e241e2071 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -5541,6 +5541,11 @@ message MetricsEvent { // OS: P FIELD_ANOMALY_TYPE = 1366; + // ACTION: Settings > Anomaly receiver > Anomaly received + // CATEGORY: SETTINGS + // OS: P + ACTION_ANOMALY_TRIGGERED = 1367; + // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java index 6d773e6eb202..cec4f1a0bdd7 100644 --- a/services/core/java/com/android/server/AppStateTracker.java +++ b/services/core/java/com/android/server/AppStateTracker.java @@ -261,6 +261,12 @@ public class AppStateTracker { // we need to deliver the allow-while-idle alarms for this uid, package unblockAllUnrestrictedAlarms(); } + + if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) { + Slog.v(TAG, "Package " + packageName + "/" + uid + + " toggled into fg service restriction"); + stopForegroundServicesForUidPackage(uid, packageName); + } } /** @@ -354,6 +360,13 @@ public class AppStateTracker { } /** + * Called when an app goes into forced app standby and its foreground + * services need to be removed from that state. + */ + public void stopForegroundServicesForUidPackage(int uid, String packageName) { + } + + /** * Called when the job restrictions for multiple UIDs might have changed, so the alarm * manager should re-evaluate all restrictions for all blocked jobs. */ @@ -1057,6 +1070,16 @@ public class AppStateTracker { } /** + * @return whether foreground services should be suppressed in the background + * due to forced app standby for the given app + */ + public boolean areForegroundServicesRestricted(int uid, @NonNull String packageName) { + synchronized (mLock) { + return isRunAnyRestrictedLocked(uid, packageName); + } + } + + /** * @return whether force-app-standby is effective for a UID package-name. */ private boolean isRestricted(int uid, @NonNull String packageName, diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index f1f251f42524..d09a161d1ef4 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -676,10 +676,12 @@ public class IpSecService extends IIpSecService.Stub { @Override public void freeUnderlyingResources() { try { - mSrvConfig - .getNetdInstance() - .ipSecDeleteSecurityAssociation( - mResourceId, mSourceAddress, mDestinationAddress, mSpi, 0, 0); + if (!mOwnedByTransform) { + mSrvConfig + .getNetdInstance() + .ipSecDeleteSecurityAssociation( + mResourceId, mSourceAddress, mDestinationAddress, mSpi, 0, 0); + } } catch (ServiceSpecificException | RemoteException e) { Log.e(TAG, "Failed to delete SPI reservation with ID: " + mResourceId, e); } diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java index 4a657334f4fb..ff6595115584 100644 --- a/services/core/java/com/android/server/am/ActiveInstrumentation.java +++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java @@ -24,8 +24,6 @@ import android.os.Bundle; import android.util.PrintWriterPrinter; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.ActiveInstrumentationProto; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index eb4e32e47489..e84c5f4d9dff 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -56,9 +56,10 @@ import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.TransferPipe; import com.android.internal.util.FastPrintWriter; +import com.android.server.AppStateTracker; +import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService.ItemMatcher; import com.android.server.am.ActivityManagerService.NeededUriGrants; -import com.android.server.am.proto.ActiveServicesProto; import android.app.ActivityManager; import android.app.AppGlobals; @@ -165,6 +166,44 @@ public final class ActiveServices { }; /** + * Watch for apps being put into forced app standby, so we can step their fg + * services down. + */ + class ForcedStandbyListener extends AppStateTracker.Listener { + @Override + public void stopForegroundServicesForUidPackage(final int uid, final String packageName) { + synchronized (mAm) { + final ServiceMap smap = getServiceMapLocked(UserHandle.getUserId(uid)); + final int N = smap.mServicesByName.size(); + final ArrayList<ServiceRecord> toStop = new ArrayList<>(N); + for (int i = 0; i < N; i++) { + final ServiceRecord r = smap.mServicesByName.valueAt(i); + if (uid == r.serviceInfo.applicationInfo.uid + || packageName.equals(r.serviceInfo.packageName)) { + if (r.isForeground) { + toStop.add(r); + } + } + } + + // Now stop them all + final int numToStop = toStop.size(); + if (numToStop > 0 && DEBUG_FOREGROUND_SERVICE) { + Slog.i(TAG, "Package " + packageName + "/" + uid + + " entering FAS with foreground services"); + } + for (int i = 0; i < numToStop; i++) { + final ServiceRecord r = toStop.get(i); + if (DEBUG_FOREGROUND_SERVICE) { + Slog.i(TAG, " Stopping fg for service " + r); + } + setServiceForegroundInnerLocked(r, 0, null, 0); + } + } + } + } + + /** * Information about an app that is currently running one or more foreground services. * (This maps directly to the running apps we show in the notification.) */ @@ -302,6 +341,11 @@ public final class ActiveServices { ? maxBg : ActivityManager.isLowRamDeviceStatic() ? 1 : 8; } + void systemServicesReady() { + AppStateTracker ast = LocalServices.getService(AppStateTracker.class); + ast.addListener(new ForcedStandbyListener()); + } + ServiceRecord getServiceByNameLocked(ComponentName name, int callingUser) { // TODO: Deal with global services if (DEBUG_MU) @@ -327,6 +371,12 @@ public final class ActiveServices { return getServiceMapLocked(callingUser).mServicesByName; } + private boolean appRestrictedAnyInBackground(final int uid, final String packageName) { + final int mode = mAm.mAppOpsService.checkOperation( + AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName); + return (mode != AppOpsManager.MODE_ALLOWED); + } + ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType, int callingPid, int callingUid, boolean fgRequired, String callingPackage, final int userId) throws TransactionTooLargeException { @@ -365,13 +415,24 @@ public final class ActiveServices { return null; } + // If the app has strict background restrictions, we treat any service + // start analogously to the legacy-app forced-restrictions case. + boolean forcedStandby = false; + if (appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG, "Forcing bg-only service start only for " + + r.name.flattenToShortString()); + } + forcedStandby = true; + } + // If this isn't a direct-to-foreground start, check our ability to kick off an // arbitrary service - if (!r.startRequested && !fgRequired) { + if (forcedStandby || (!r.startRequested && !fgRequired)) { // Before going further -- if this app is not allowed to start services in the // background, then at this point we aren't going to let it period. final int allowed = mAm.getAppStartModeLocked(r.appInfo.uid, r.packageName, - r.appInfo.targetSdkVersion, callingPid, false, false); + r.appInfo.targetSdkVersion, callingPid, false, false, forcedStandby); if (allowed != ActivityManager.APP_START_MODE_NORMAL) { Slog.w(TAG, "Background start not allowed: service " + service + " to " + r.name.flattenToShortString() @@ -625,7 +686,7 @@ public final class ActiveServices { ServiceRecord service = services.mServicesByName.valueAt(i); if (service.appInfo.uid == uid && service.startRequested) { if (mAm.getAppStartModeLocked(service.appInfo.uid, service.packageName, - service.appInfo.targetSdkVersion, -1, false, false) + service.appInfo.targetSdkVersion, -1, false, false, false) != ActivityManager.APP_START_MODE_NORMAL) { if (stopping == null) { stopping = new ArrayList<>(); @@ -1019,7 +1080,10 @@ public final class ActiveServices { } } - private void setServiceForegroundInnerLocked(ServiceRecord r, int id, + /** + * @param id Notification ID. Zero === exit foreground state for the given service. + */ + private void setServiceForegroundInnerLocked(final ServiceRecord r, int id, Notification notification, int flags) { if (id != 0) { if (notification == null) { @@ -1061,44 +1125,56 @@ public final class ActiveServices { mAm.mHandler.removeMessages( ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r); } - if (r.foregroundId != id) { - cancelForegroundNotificationLocked(r); - r.foregroundId = id; - } - notification.flags |= Notification.FLAG_FOREGROUND_SERVICE; - r.foregroundNoti = notification; - if (!r.isForeground) { - final ServiceMap smap = getServiceMapLocked(r.userId); - if (smap != null) { - ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName); - if (active == null) { - active = new ActiveForegroundApp(); - active.mPackageName = r.packageName; - active.mUid = r.appInfo.uid; - active.mShownWhileScreenOn = mScreenOn; - if (r.app != null) { - active.mAppOnTop = active.mShownWhileTop = - r.app.uidRecord.curProcState - <= ActivityManager.PROCESS_STATE_TOP; + + // Apps under strict background restrictions simply don't get to have foreground + // services, so now that we've enforced the startForegroundService() contract + // we only do the machinery of making the service foreground when the app + // is not restricted. + if (!appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) { + if (r.foregroundId != id) { + cancelForegroundNotificationLocked(r); + r.foregroundId = id; + } + notification.flags |= Notification.FLAG_FOREGROUND_SERVICE; + r.foregroundNoti = notification; + if (!r.isForeground) { + final ServiceMap smap = getServiceMapLocked(r.userId); + if (smap != null) { + ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName); + if (active == null) { + active = new ActiveForegroundApp(); + active.mPackageName = r.packageName; + active.mUid = r.appInfo.uid; + active.mShownWhileScreenOn = mScreenOn; + if (r.app != null) { + active.mAppOnTop = active.mShownWhileTop = + r.app.uidRecord.curProcState + <= ActivityManager.PROCESS_STATE_TOP; + } + active.mStartTime = active.mStartVisibleTime + = SystemClock.elapsedRealtime(); + smap.mActiveForegroundApps.put(r.packageName, active); + requestUpdateActiveForegroundAppsLocked(smap, 0); } - active.mStartTime = active.mStartVisibleTime - = SystemClock.elapsedRealtime(); - smap.mActiveForegroundApps.put(r.packageName, active); - requestUpdateActiveForegroundAppsLocked(smap, 0); + active.mNumActive++; } - active.mNumActive++; + r.isForeground = true; + StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, + r.appInfo.uid, r.shortName, + StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER); + } + r.postNotification(); + if (r.app != null) { + updateServiceForegroundLocked(r.app, true); + } + getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r); + mAm.notifyPackageUse(r.serviceInfo.packageName, + PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE); + } else { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG, "Suppressing startForeground() for FAS " + r); } - r.isForeground = true; - StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, r.appInfo.uid, r.shortName, - StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER); - } - r.postNotification(); - if (r.app != null) { - updateServiceForegroundLocked(r.app, true); } - getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r); - mAm.notifyPackageUse(r.serviceInfo.packageName, - PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE); } else { if (r.isForeground) { final ServiceMap smap = getServiceMapLocked(r.userId); @@ -1106,7 +1182,8 @@ public final class ActiveServices { decActiveForegroundAppLocked(smap, r); } r.isForeground = false; - StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, r.appInfo.uid, r.shortName, + StatsLog.write(StatsLog.FOREGROUND_SERVICE_STATE_CHANGED, + r.appInfo.uid, r.shortName, StatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT); if (r.app != null) { mAm.updateLruProcessLocked(r.app, false, null); diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index 44980772d895..4a8bc8745012 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -35,9 +35,9 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.proto.ActivityDisplayProto.CONFIGURATION_CONTAINER; -import static com.android.server.am.proto.ActivityDisplayProto.STACKS; -import static com.android.server.am.proto.ActivityDisplayProto.ID; +import static com.android.server.am.ActivityDisplayProto.CONFIGURATION_CONTAINER; +import static com.android.server.am.ActivityDisplayProto.STACKS; +import static com.android.server.am.ActivityDisplayProto.ID; import android.annotation.Nullable; import android.app.ActivityManagerInternal; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index fb8f7491e726..457564b210b0 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -123,7 +123,6 @@ import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICAT import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; - import static com.android.internal.util.XmlUtils.readBooleanAttribute; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.readLongAttribute; @@ -205,7 +204,6 @@ import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; - import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -390,8 +388,8 @@ import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationDefinition; import android.view.View; import android.view.WindowManager; - import android.view.autofill.AutofillManagerInternal; + import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -443,19 +441,19 @@ import com.android.server.ThreadPriorityBooster; import com.android.server.Watchdog; import com.android.server.am.ActivityStack.ActivityState; import com.android.server.am.MemoryStatUtil.MemoryStat; -import com.android.server.am.proto.ActivityManagerServiceProto; -import com.android.server.am.proto.ActivityManagerServiceDumpActivitiesProto; -import com.android.server.am.proto.ActivityManagerServiceDumpBroadcastsProto; -import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto; -import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; -import com.android.server.am.proto.ActivityManagerServiceDumpServicesProto; -import com.android.server.am.proto.GrantUriProto; -import com.android.server.am.proto.ImportanceTokenProto; -import com.android.server.am.proto.MemInfoDumpProto; -import com.android.server.am.proto.NeededUriGrantsProto; -import com.android.server.am.proto.ProcessOomProto; -import com.android.server.am.proto.ProcessToGcProto; -import com.android.server.am.proto.StickyBroadcastProto; +import com.android.server.am.ActivityManagerServiceProto; +import com.android.server.am.ActivityManagerServiceDumpActivitiesProto; +import com.android.server.am.ActivityManagerServiceDumpBroadcastsProto; +import com.android.server.am.ActivityManagerServiceDumpProcessesProto; +import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; +import com.android.server.am.ActivityManagerServiceDumpServicesProto; +import com.android.server.am.GrantUriProto; +import com.android.server.am.ImportanceTokenProto; +import com.android.server.am.MemInfoDumpProto; +import com.android.server.am.NeededUriGrantsProto; +import com.android.server.am.ProcessOomProto; +import com.android.server.am.ProcessToGcProto; +import com.android.server.am.StickyBroadcastProto; import com.android.server.firewall.IntentFirewall; import com.android.server.job.JobSchedulerInternal; import com.android.server.pm.Installer; @@ -2853,6 +2851,7 @@ public class ActivityManagerService extends IActivityManager.Stub public void onBootPhase(int phase) { if (phase == PHASE_SYSTEM_SERVICES_READY) { mService.mBatteryStatsService.systemServicesReady(); + mService.mServices.systemServicesReady(); } } @@ -9118,7 +9117,7 @@ public class ActivityManagerService extends IActivityManager.Stub public boolean isAppStartModeDisabled(int uid, String packageName) { synchronized (this) { - return getAppStartModeLocked(uid, packageName, 0, -1, false, true) + return getAppStartModeLocked(uid, packageName, 0, -1, false, true, false) == ActivityManager.APP_START_MODE_DISABLED; } } @@ -9194,12 +9193,12 @@ public class ActivityManagerService extends IActivityManager.Stub } int getAppStartModeLocked(int uid, String packageName, int packageTargetSdk, - int callingPid, boolean alwaysRestrict, boolean disabledOnly) { + int callingPid, boolean alwaysRestrict, boolean disabledOnly, boolean forcedStandby) { UidRecord uidRec = mActiveUids.get(uid); if (DEBUG_BACKGROUND_CHECK) Slog.d(TAG, "checkAllowBackground: uid=" + uid + " pkg=" + packageName + " rec=" + uidRec + " always=" + alwaysRestrict + " idle=" + (uidRec != null ? uidRec.idle : false)); - if (uidRec == null || alwaysRestrict || uidRec.idle) { + if (uidRec == null || alwaysRestrict || forcedStandby || uidRec.idle) { boolean ephemeral; if (uidRec == null) { ephemeral = getPackageManagerInternalLocked().isPackageEphemeral( @@ -17093,8 +17092,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (mRunningVoice != null) { final long vrToken = proto.start(ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE); - proto.write(ActivityManagerServiceDumpProcessesProto.VoiceProto.SESSION, mRunningVoice.toString()); - mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.VoiceProto.WAKELOCK); + proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION, mRunningVoice.toString()); + mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK); proto.end(vrToken); } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 19ca3be645a9..ccc17a3b1d0e 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -112,16 +112,16 @@ import static com.android.server.am.EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY; import static com.android.server.am.TaskPersister.DEBUG; import static com.android.server.am.TaskPersister.IMAGE_EXTENSION; import static com.android.server.am.TaskRecord.INVALID_TASK_ID; -import static com.android.server.am.proto.ActivityRecordProto.CONFIGURATION_CONTAINER; -import static com.android.server.am.proto.ActivityRecordProto.FRONT_OF_TASK; -import static com.android.server.am.proto.ActivityRecordProto.IDENTIFIER; -import static com.android.server.am.proto.ActivityRecordProto.PROC_ID; -import static com.android.server.am.proto.ActivityRecordProto.STATE; -import static com.android.server.am.proto.ActivityRecordProto.VISIBLE; +import static com.android.server.am.ActivityRecordProto.CONFIGURATION_CONTAINER; +import static com.android.server.am.ActivityRecordProto.FRONT_OF_TASK; +import static com.android.server.am.ActivityRecordProto.IDENTIFIER; +import static com.android.server.am.ActivityRecordProto.PROC_ID; +import static com.android.server.am.ActivityRecordProto.STATE; +import static com.android.server.am.ActivityRecordProto.VISIBLE; import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT; -import static com.android.server.wm.proto.IdentifierProto.HASH_CODE; -import static com.android.server.wm.proto.IdentifierProto.TITLE; -import static com.android.server.wm.proto.IdentifierProto.USER_ID; +import static com.android.server.wm.IdentifierProto.HASH_CODE; +import static com.android.server.wm.IdentifierProto.TITLE; +import static com.android.server.wm.IdentifierProto.USER_ID; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; @@ -2738,11 +2738,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } else { service.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this); setState(PAUSED, "relaunchActivityLocked"); - // if the app is relaunched when it's stopped, and we're not resuming, - // put it back into stopped state. - if (stopped) { - getStack().addToStopping(this, true /* scheduleIdle */, false /* idleDelayed */); - } } configChangeFlags = 0; diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 1f5320aa876d..20b938b32eed 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -82,13 +82,13 @@ import static com.android.server.am.ActivityStackSupervisor.FindTaskResult; import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS; -import static com.android.server.am.proto.ActivityStackProto.BOUNDS; -import static com.android.server.am.proto.ActivityStackProto.CONFIGURATION_CONTAINER; -import static com.android.server.am.proto.ActivityStackProto.DISPLAY_ID; -import static com.android.server.am.proto.ActivityStackProto.FULLSCREEN; -import static com.android.server.am.proto.ActivityStackProto.ID; -import static com.android.server.am.proto.ActivityStackProto.RESUMED_ACTIVITY; -import static com.android.server.am.proto.ActivityStackProto.TASKS; +import static com.android.server.am.ActivityStackProto.BOUNDS; +import static com.android.server.am.ActivityStackProto.CONFIGURATION_CONTAINER; +import static com.android.server.am.ActivityStackProto.DISPLAY_ID; +import static com.android.server.am.ActivityStackProto.FULLSCREEN; +import static com.android.server.am.ActivityStackProto.ID; +import static com.android.server.am.ActivityStackProto.RESUMED_ACTIVITY; +import static com.android.server.am.ActivityStackProto.TASKS; import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_NONE; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e4695b64a070..265e4fa078fc 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -90,12 +90,12 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; import static com.android.server.am.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT; -import static com.android.server.am.proto.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER; -import static com.android.server.am.proto.ActivityStackSupervisorProto.DISPLAYS; -import static com.android.server.am.proto.ActivityStackSupervisorProto.FOCUSED_STACK_ID; -import static com.android.server.am.proto.ActivityStackSupervisorProto.IS_HOME_RECENTS_COMPONENT; -import static com.android.server.am.proto.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER; -import static com.android.server.am.proto.ActivityStackSupervisorProto.RESUMED_ACTIVITY; +import static com.android.server.am.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER; +import static com.android.server.am.ActivityStackSupervisorProto.DISPLAYS; +import static com.android.server.am.ActivityStackSupervisorProto.FOCUSED_STACK_ID; +import static com.android.server.am.ActivityStackSupervisorProto.IS_HOME_RECENTS_COMPONENT; +import static com.android.server.am.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER; +import static com.android.server.am.ActivityStackSupervisorProto.RESUMED_ACTIVITY; import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static java.lang.Integer.MAX_VALUE; @@ -1199,6 +1199,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) { final int displayId = mTmpOrderedDisplayIds.get(i); final ActivityDisplay display = mActivityDisplays.get(displayId); + + // If WindowManagerService has encountered the display before we have, ignore as there + // will be no stacks present and therefore no activities. + if (display == null) { + continue; + } for (int j = display.getChildCount() - 1; j >= 0; --j) { final ActivityStack stack = display.getChildAt(j); if (stack != focusedStack && stack.isTopStackOnDisplay() && stack.isFocusable()) { diff --git a/services/core/java/com/android/server/am/AppBindRecord.java b/services/core/java/com/android/server/am/AppBindRecord.java index 972a692d276f..4eaebd04a8ad 100644 --- a/services/core/java/com/android/server/am/AppBindRecord.java +++ b/services/core/java/com/android/server/am/AppBindRecord.java @@ -19,8 +19,6 @@ package com.android.server.am; import android.util.ArraySet; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.AppBindRecordProto; - import java.io.PrintWriter; /** diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index ed098795d1d8..b2872e4d7f5a 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -22,7 +22,6 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.internal.os.ProcessCpuTracker; import com.android.server.RescueParty; import com.android.server.Watchdog; -import com.android.server.am.proto.AppErrorsProto; import android.app.ActivityManager; import android.app.ActivityOptions; diff --git a/services/core/java/com/android/server/am/AppTimeTracker.java b/services/core/java/com/android/server/am/AppTimeTracker.java index d96364ade168..772865d89d3b 100644 --- a/services/core/java/com/android/server/am/AppTimeTracker.java +++ b/services/core/java/com/android/server/am/AppTimeTracker.java @@ -28,8 +28,6 @@ import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoUtils; -import com.android.server.am.proto.AppTimeTrackerProto; - import java.io.PrintWriter; /** diff --git a/services/core/java/com/android/server/am/BroadcastFilter.java b/services/core/java/com/android/server/am/BroadcastFilter.java index 7ff227f56ae8..8e2ca0691277 100644 --- a/services/core/java/com/android/server/am/BroadcastFilter.java +++ b/services/core/java/com/android/server/am/BroadcastFilter.java @@ -21,8 +21,6 @@ import android.util.PrintWriterPrinter; import android.util.Printer; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.BroadcastFilterProto; - import java.io.PrintWriter; final class BroadcastFilter extends IntentFilter { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 9a7634edd81b..cc3a8875c4d1 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -55,8 +55,6 @@ import android.util.proto.ProtoOutputStream; import static com.android.server.am.ActivityManagerDebugConfig.*; -import com.android.server.am.proto.BroadcastQueueProto; - /** * BROADCASTS * @@ -1258,7 +1256,7 @@ public final class BroadcastQueue { if (!skip) { final int allowed = mService.getAppStartModeLocked( info.activityInfo.applicationInfo.uid, info.activityInfo.packageName, - info.activityInfo.applicationInfo.targetSdkVersion, -1, true, false); + info.activityInfo.applicationInfo.targetSdkVersion, -1, true, false, false); if (allowed != ActivityManager.APP_START_MODE_NORMAL) { // We won't allow this receiver to be launched if the app has been // completely disabled from launches, or it was not explicitly sent diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index 5b3b2a8ed3d8..574ca4a340ee 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -32,8 +32,6 @@ import android.util.PrintWriterPrinter; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.BroadcastRecordProto; - import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Arrays; diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java index a8e9ad9ce87b..679024ee4c94 100644 --- a/services/core/java/com/android/server/am/ConnectionRecord.java +++ b/services/core/java/com/android/server/am/ConnectionRecord.java @@ -22,8 +22,6 @@ import android.content.Context; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoUtils; -import com.android.server.am.proto.ConnectionRecordProto; - import java.io.PrintWriter; /** diff --git a/services/core/java/com/android/server/am/IntentBindRecord.java b/services/core/java/com/android/server/am/IntentBindRecord.java index 3457a8098284..839b6e1bd634 100644 --- a/services/core/java/com/android/server/am/IntentBindRecord.java +++ b/services/core/java/com/android/server/am/IntentBindRecord.java @@ -23,9 +23,6 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.AppBindRecordProto; -import com.android.server.am.proto.IntentBindRecordProto; - import java.io.PrintWriter; /** diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index 0d7eab626ff0..b67dd0dc479b 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -25,8 +25,8 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; -import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_OCCLUDED; -import static com.android.server.am.proto.KeyguardControllerProto.KEYGUARD_SHOWING; +import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED; +import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 0bf269151f24..e348bf4bf5ae 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -27,7 +27,6 @@ import android.util.Slog; import com.android.internal.app.procstats.ProcessStats; import com.android.internal.app.procstats.ProcessState; import com.android.internal.os.BatteryStatsImpl; -import com.android.server.am.proto.ProcessRecordProto; import android.app.ActivityManager; import android.app.Dialog; diff --git a/services/core/java/com/android/server/am/ReceiverList.java b/services/core/java/com/android/server/am/ReceiverList.java index eee924f6b23f..5e31b2e3bdd1 100644 --- a/services/core/java/com/android/server/am/ReceiverList.java +++ b/services/core/java/com/android/server/am/ReceiverList.java @@ -25,7 +25,6 @@ import android.util.Printer; import android.util.proto.ProtoOutputStream; import com.android.server.IntentResolver; -import com.android.server.am.proto.ReceiverListProto; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index 49a55cbf8e98..f296c6045248 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -19,7 +19,6 @@ package com.android.server.am; import com.android.internal.app.procstats.ServiceState; import com.android.internal.os.BatteryStatsImpl; import com.android.server.LocalServices; -import com.android.server.am.proto.ServiceRecordProto; import com.android.server.notification.NotificationManagerInternal; import android.app.INotificationManager; diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index c7b89d3d47eb..034cb2e373d5 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -62,19 +62,19 @@ import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP import static com.android.server.am.ActivityStackSupervisor.ON_TOP; import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; -import static com.android.server.am.proto.TaskRecordProto.ACTIVITIES; -import static com.android.server.am.proto.TaskRecordProto.BOUNDS; -import static com.android.server.am.proto.TaskRecordProto.CONFIGURATION_CONTAINER; -import static com.android.server.am.proto.TaskRecordProto.FULLSCREEN; -import static com.android.server.am.proto.TaskRecordProto.ID; -import static com.android.server.am.proto.TaskRecordProto.LAST_NON_FULLSCREEN_BOUNDS; -import static com.android.server.am.proto.TaskRecordProto.MIN_HEIGHT; -import static com.android.server.am.proto.TaskRecordProto.MIN_WIDTH; -import static com.android.server.am.proto.TaskRecordProto.ORIG_ACTIVITY; -import static com.android.server.am.proto.TaskRecordProto.REAL_ACTIVITY; -import static com.android.server.am.proto.TaskRecordProto.RESIZE_MODE; -import static com.android.server.am.proto.TaskRecordProto.STACK_ID; -import static com.android.server.am.proto.TaskRecordProto.ACTIVITY_TYPE; +import static com.android.server.am.TaskRecordProto.ACTIVITIES; +import static com.android.server.am.TaskRecordProto.BOUNDS; +import static com.android.server.am.TaskRecordProto.CONFIGURATION_CONTAINER; +import static com.android.server.am.TaskRecordProto.FULLSCREEN; +import static com.android.server.am.TaskRecordProto.ID; +import static com.android.server.am.TaskRecordProto.LAST_NON_FULLSCREEN_BOUNDS; +import static com.android.server.am.TaskRecordProto.MIN_HEIGHT; +import static com.android.server.am.TaskRecordProto.MIN_WIDTH; +import static com.android.server.am.TaskRecordProto.ORIG_ACTIVITY; +import static com.android.server.am.TaskRecordProto.REAL_ACTIVITY; +import static com.android.server.am.TaskRecordProto.RESIZE_MODE; +import static com.android.server.am.TaskRecordProto.STACK_ID; +import static com.android.server.am.TaskRecordProto.ACTIVITY_TYPE; import static java.lang.Integer.MAX_VALUE; diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java index d49f3baa7bcb..3b859edd3cf9 100644 --- a/services/core/java/com/android/server/am/UidRecord.java +++ b/services/core/java/com/android/server/am/UidRecord.java @@ -28,7 +28,6 @@ import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.am.proto.UidRecordProto; /** * Overall information about a uid that has actively running processes. diff --git a/services/core/java/com/android/server/am/UriPermissionOwner.java b/services/core/java/com/android/server/am/UriPermissionOwner.java index fc07c1ab8c9d..8eda38e6bd24 100644 --- a/services/core/java/com/android/server/am/UriPermissionOwner.java +++ b/services/core/java/com/android/server/am/UriPermissionOwner.java @@ -22,8 +22,6 @@ import android.os.IBinder; import android.util.ArraySet; import android.util.proto.ProtoOutputStream; -import com.android.server.am.proto.UriPermissionOwnerProto; - import com.google.android.collect.Sets; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index af1ab83190cc..0d125e051549 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -95,7 +95,6 @@ import com.android.internal.widget.LockPatternUtils; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemServiceManager; -import com.android.server.am.proto.UserControllerProto; import com.android.server.pm.UserManagerService; import com.android.server.wm.WindowManagerService; diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java index 00597e242d79..4f5c59ce0634 100644 --- a/services/core/java/com/android/server/am/UserState.java +++ b/services/core/java/com/android/server/am/UserState.java @@ -27,7 +27,6 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.util.ProgressReporter; -import com.android.server.am.proto.UserStateProto; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/am/VrController.java b/services/core/java/com/android/server/am/VrController.java index 9d34a8020345..45410d79afe7 100644 --- a/services/core/java/com/android/server/am/VrController.java +++ b/services/core/java/com/android/server/am/VrController.java @@ -24,7 +24,6 @@ import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoUtils; import com.android.server.LocalServices; -import com.android.server.am.proto.ActivityManagerServiceDumpProcessesProto.VrControllerProto; import com.android.server.vr.VrManagerInternal; /** diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java index 578a32cc4b2e..a1e066e7264e 100644 --- a/services/core/java/com/android/server/job/controllers/JobStatus.java +++ b/services/core/java/com/android/server/job/controllers/JobStatus.java @@ -95,11 +95,18 @@ public final class JobStatus { public static final long MIN_TRIGGER_MAX_DELAY = 1000; final JobInfo job; - /** Uid of the package requesting this job. */ + /** + * Uid of the package requesting this job. This can differ from the "source" + * uid when the job was scheduled on the app's behalf, such as with the jobs + * that underly Sync Manager operation. + */ final int callingUid; final int targetSdkVersion; final String batteryName; + /** + * Identity of the app in which the job is hosted. + */ final String sourcePackageName; final int sourceUserId; final int sourceUid; @@ -263,6 +270,31 @@ public final class JobStatus { return callingUid; } + /** + * Core constructor for JobStatus instances. All other ctors funnel down to this one. + * + * @param job The actual requested parameters for the job + * @param callingUid Identity of the app that is scheduling the job. This may not be the + * app in which the job is implemented; such as with sync jobs. + * @param targetSdkVersion The targetSdkVersion of the app in which the job will run. + * @param sourcePackageName The package name of the app in which the job will run. + * @param sourceUserId The user in which the job will run + * @param standbyBucket The standby bucket that the source package is currently assigned to, + * cached here for speed of handling during runnability evaluations (and updated when bucket + * assignments are changed) + * @param heartbeat Timestamp of when the job was created, in the standby-related + * timebase. + * @param tag A string associated with the job for debugging/logging purposes. + * @param numFailures Count of how many times this job has requested a reschedule because + * its work was not yet finished. + * @param earliestRunTimeElapsedMillis Milestone: earliest point in time at which the job + * is to be considered runnable + * @param latestRunTimeElapsedMillis Milestone: point in time at which the job will be + * considered overdue + * @param lastSuccessfulRunTime When did we last run this job to completion? + * @param lastFailedRunTime When did we last run this job only to have it stop incomplete? + * @param internalFlags Non-API property flags about this job + */ private JobStatus(JobInfo job, int callingUid, int targetSdkVersion, String sourcePackageName, int sourceUserId, int standbyBucket, long heartbeat, String tag, int numFailures, long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis, @@ -399,8 +431,8 @@ public final class JobStatus { /** * Create a newly scheduled job. * @param callingUid Uid of the package that scheduled this job. - * @param sourcePkg Package name on whose behalf this job is scheduled. Null indicates - * the calling package is the source. + * @param sourcePkg Package name of the app that will actually run the job. Null indicates + * that the calling package is the source. * @param sourceUserId User id for whom this job is scheduled. -1 indicates this is same as the * caller. */ diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java index cf88bd5364a7..eca6f9f1ec47 100644 --- a/services/core/java/com/android/server/policy/BarController.java +++ b/services/core/java/com/android/server/policy/BarController.java @@ -16,8 +16,8 @@ package com.android.server.policy; -import static com.android.server.wm.proto.BarControllerProto.STATE; -import static com.android.server.wm.proto.BarControllerProto.TRANSIENT_STATE; +import static com.android.server.wm.BarControllerProto.STATE; +import static com.android.server.wm.BarControllerProto.TRANSIENT_STATE; import android.app.StatusBarManager; import android.graphics.Rect; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 61b1eb4d4d83..6b70f5c4ec88 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -128,26 +128,26 @@ import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.C import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN; -import static com.android.server.wm.proto.WindowManagerPolicyProto.FOCUSED_APP_TOKEN; -import static com.android.server.wm.proto.WindowManagerPolicyProto.FOCUSED_WINDOW; -import static com.android.server.wm.proto.WindowManagerPolicyProto.FORCE_STATUS_BAR; -import static com.android.server.wm.proto.WindowManagerPolicyProto.FORCE_STATUS_BAR_FROM_KEYGUARD; -import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_DELEGATE; -import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_DRAW_COMPLETE; -import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED; -import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_CHANGED; -import static com.android.server.wm.proto.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_PENDING; -import static com.android.server.wm.proto.WindowManagerPolicyProto.LAST_SYSTEM_UI_FLAGS; -import static com.android.server.wm.proto.WindowManagerPolicyProto.NAVIGATION_BAR; -import static com.android.server.wm.proto.WindowManagerPolicyProto.ORIENTATION; -import static com.android.server.wm.proto.WindowManagerPolicyProto.ORIENTATION_LISTENER; -import static com.android.server.wm.proto.WindowManagerPolicyProto.ROTATION; -import static com.android.server.wm.proto.WindowManagerPolicyProto.ROTATION_MODE; -import static com.android.server.wm.proto.WindowManagerPolicyProto.SCREEN_ON_FULLY; -import static com.android.server.wm.proto.WindowManagerPolicyProto.STATUS_BAR; -import static com.android.server.wm.proto.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_OR_DIMMING_WINDOW; -import static com.android.server.wm.proto.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_WINDOW; -import static com.android.server.wm.proto.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE; +import static com.android.server.wm.WindowManagerPolicyProto.FOCUSED_APP_TOKEN; +import static com.android.server.wm.WindowManagerPolicyProto.FOCUSED_WINDOW; +import static com.android.server.wm.WindowManagerPolicyProto.FORCE_STATUS_BAR; +import static com.android.server.wm.WindowManagerPolicyProto.FORCE_STATUS_BAR_FROM_KEYGUARD; +import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DELEGATE; +import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_DRAW_COMPLETE; +import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED; +import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_CHANGED; +import static com.android.server.wm.WindowManagerPolicyProto.KEYGUARD_OCCLUDED_PENDING; +import static com.android.server.wm.WindowManagerPolicyProto.LAST_SYSTEM_UI_FLAGS; +import static com.android.server.wm.WindowManagerPolicyProto.NAVIGATION_BAR; +import static com.android.server.wm.WindowManagerPolicyProto.ORIENTATION; +import static com.android.server.wm.WindowManagerPolicyProto.ORIENTATION_LISTENER; +import static com.android.server.wm.WindowManagerPolicyProto.ROTATION; +import static com.android.server.wm.WindowManagerPolicyProto.ROTATION_MODE; +import static com.android.server.wm.WindowManagerPolicyProto.SCREEN_ON_FULLY; +import static com.android.server.wm.WindowManagerPolicyProto.STATUS_BAR; +import static com.android.server.wm.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_OR_DIMMING_WINDOW; +import static com.android.server.wm.WindowManagerPolicyProto.TOP_FULLSCREEN_OPAQUE_WINDOW; +import static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE; import android.annotation.Nullable; import android.app.ActivityManager; diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 6674e185118a..ec0521dda40d 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -488,7 +488,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { boolean canAcquireSleepToken(); /** - * Writes {@link com.android.server.wm.proto.IdentifierProto} to stream. + * Writes {@link com.android.server.wm.IdentifierProto} to stream. */ void writeIdentifierToProto(ProtoOutputStream proto, long fieldId); } @@ -1626,7 +1626,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { /** * Write the WindowManagerPolicy's state into the protocol buffer. - * The message is described in {@link com.android.server.wm.proto.WindowManagerPolicyProto} + * The message is described in {@link com.android.server.wm.WindowManagerPolicyProto} * * @param proto The protocol buffer output stream to write to. */ diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 48a196dfcff1..1508c9ecb394 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -16,8 +16,8 @@ package com.android.server.policy; -import static com.android.server.wm.proto.WindowOrientationListenerProto.ENABLED; -import static com.android.server.wm.proto.WindowOrientationListenerProto.ROTATION; +import static com.android.server.wm.WindowOrientationListenerProto.ENABLED; +import static com.android.server.wm.WindowOrientationListenerProto.ROTATION; import android.content.Context; import android.hardware.Sensor; diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 58e8f776f9dd..062b154b8c1a 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -1,11 +1,11 @@ package com.android.server.policy.keyguard; import static android.view.Display.INVALID_DISPLAY; -import static com.android.server.wm.proto.KeyguardServiceDelegateProto.INTERACTIVE_STATE; -import static com.android.server.wm.proto.KeyguardServiceDelegateProto.OCCLUDED; -import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SCREEN_STATE; -import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SECURE; -import static com.android.server.wm.proto.KeyguardServiceDelegateProto.SHOWING; +import static com.android.server.wm.KeyguardServiceDelegateProto.INTERACTIVE_STATE; +import static com.android.server.wm.KeyguardServiceDelegateProto.OCCLUDED; +import static com.android.server.wm.KeyguardServiceDelegateProto.SCREEN_STATE; +import static com.android.server.wm.KeyguardServiceDelegateProto.SECURE; +import static com.android.server.wm.KeyguardServiceDelegateProto.SHOWING; import android.app.ActivityManager; import android.content.ComponentName; diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index adbf7ed866ee..dd88cd1a9266 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -896,7 +896,7 @@ public final class PowerManagerService extends SystemService mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger( com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff); mDozeAfterScreenOff = resources.getBoolean( - com.android.internal.R.bool.config_dozeAfterScreenOff); + com.android.internal.R.bool.config_dozeAfterScreenOffByDefault); mMinimumScreenOffTimeoutConfig = resources.getInteger( com.android.internal.R.integer.config_minimumScreenOffTimeout); mMaximumScreenDimDurationConfig = resources.getInteger( diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 93ca4dc48319..41ae48a05c0f 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -70,8 +70,8 @@ import static com.android.server.wm.WindowManagerInternal.AppTransitionListener; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; -import static com.android.server.wm.proto.AppTransitionProto.APP_TRANSITION_STATE; -import static com.android.server.wm.proto.AppTransitionProto.LAST_USED_APP_TRANSITION; +import static com.android.server.wm.AppTransitionProto.APP_TRANSITION_STATE; +import static com.android.server.wm.AppTransitionProto.LAST_USED_APP_TRANSITION; import android.annotation.DrawableRes; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java index 3cd3e8b0912e..ad92f81f4dde 100644 --- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java +++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java @@ -20,9 +20,9 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION; -import static com.android.server.wm.proto.AppWindowThumbnailProto.HEIGHT; -import static com.android.server.wm.proto.AppWindowThumbnailProto.SURFACE_ANIMATOR; -import static com.android.server.wm.proto.AppWindowThumbnailProto.WIDTH; +import static com.android.server.wm.AppWindowThumbnailProto.HEIGHT; +import static com.android.server.wm.AppWindowThumbnailProto.SURFACE_ANIMATOR; +import static com.android.server.wm.AppWindowThumbnailProto.WIDTH; import android.graphics.GraphicBuffer; import android.graphics.PixelFormat; @@ -119,7 +119,7 @@ class AppWindowThumbnail implements Animatable { /** * Write to a protocol buffer output stream. Protocol buffer message definition is at {@link - * com.android.server.wm.proto.AppWindowThumbnailProto}. + * com.android.server.wm.AppWindowThumbnailProto}. * * @param proto Stream to write the AppWindowThumbnail object to. * @param fieldId Field Id of the AppWindowThumbnail as defined in the parent message. diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index f52f91cd6a3b..a76857e877d8 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -51,29 +51,29 @@ import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.logWithStack; -import static com.android.server.wm.proto.AppWindowTokenProto.ALL_DRAWN; -import static com.android.server.wm.proto.AppWindowTokenProto.APP_STOPPED; -import static com.android.server.wm.proto.AppWindowTokenProto.CLIENT_HIDDEN; -import static com.android.server.wm.proto.AppWindowTokenProto.DEFER_HIDING_CLIENT; -import static com.android.server.wm.proto.AppWindowTokenProto.FILLS_PARENT; -import static com.android.server.wm.proto.AppWindowTokenProto.FROZEN_BOUNDS; -import static com.android.server.wm.proto.AppWindowTokenProto.HIDDEN_REQUESTED; -import static com.android.server.wm.proto.AppWindowTokenProto.HIDDEN_SET_FROM_TRANSFERRED_STARTING_WINDOW; -import static com.android.server.wm.proto.AppWindowTokenProto.IS_REALLY_ANIMATING; -import static com.android.server.wm.proto.AppWindowTokenProto.IS_WAITING_FOR_TRANSITION_START; -import static com.android.server.wm.proto.AppWindowTokenProto.LAST_ALL_DRAWN; -import static com.android.server.wm.proto.AppWindowTokenProto.LAST_SURFACE_SHOWING; -import static com.android.server.wm.proto.AppWindowTokenProto.NAME; -import static com.android.server.wm.proto.AppWindowTokenProto.NUM_DRAWN_WINDOWS; -import static com.android.server.wm.proto.AppWindowTokenProto.NUM_INTERESTING_WINDOWS; -import static com.android.server.wm.proto.AppWindowTokenProto.REMOVED; -import static com.android.server.wm.proto.AppWindowTokenProto.REPORTED_DRAWN; -import static com.android.server.wm.proto.AppWindowTokenProto.REPORTED_VISIBLE; -import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_DISPLAYED; -import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_MOVED; -import static com.android.server.wm.proto.AppWindowTokenProto.STARTING_WINDOW; -import static com.android.server.wm.proto.AppWindowTokenProto.THUMBNAIL; -import static com.android.server.wm.proto.AppWindowTokenProto.WINDOW_TOKEN; +import static com.android.server.wm.AppWindowTokenProto.ALL_DRAWN; +import static com.android.server.wm.AppWindowTokenProto.APP_STOPPED; +import static com.android.server.wm.AppWindowTokenProto.CLIENT_HIDDEN; +import static com.android.server.wm.AppWindowTokenProto.DEFER_HIDING_CLIENT; +import static com.android.server.wm.AppWindowTokenProto.FILLS_PARENT; +import static com.android.server.wm.AppWindowTokenProto.FROZEN_BOUNDS; +import static com.android.server.wm.AppWindowTokenProto.HIDDEN_REQUESTED; +import static com.android.server.wm.AppWindowTokenProto.HIDDEN_SET_FROM_TRANSFERRED_STARTING_WINDOW; +import static com.android.server.wm.AppWindowTokenProto.IS_REALLY_ANIMATING; +import static com.android.server.wm.AppWindowTokenProto.IS_WAITING_FOR_TRANSITION_START; +import static com.android.server.wm.AppWindowTokenProto.LAST_ALL_DRAWN; +import static com.android.server.wm.AppWindowTokenProto.LAST_SURFACE_SHOWING; +import static com.android.server.wm.AppWindowTokenProto.NAME; +import static com.android.server.wm.AppWindowTokenProto.NUM_DRAWN_WINDOWS; +import static com.android.server.wm.AppWindowTokenProto.NUM_INTERESTING_WINDOWS; +import static com.android.server.wm.AppWindowTokenProto.REMOVED; +import static com.android.server.wm.AppWindowTokenProto.REPORTED_DRAWN; +import static com.android.server.wm.AppWindowTokenProto.REPORTED_VISIBLE; +import static com.android.server.wm.AppWindowTokenProto.STARTING_DISPLAYED; +import static com.android.server.wm.AppWindowTokenProto.STARTING_MOVED; +import static com.android.server.wm.AppWindowTokenProto.STARTING_WINDOW; +import static com.android.server.wm.AppWindowTokenProto.THUMBNAIL; +import static com.android.server.wm.AppWindowTokenProto.WINDOW_TOKEN; import android.annotation.CallSuper; import android.app.Activity; diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index 2c2389b12577..627c6297bdd8 100644 --- a/services/core/java/com/android/server/wm/ConfigurationContainer.java +++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java @@ -29,9 +29,9 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.activityTypeToString; import static android.app.WindowConfiguration.windowingModeToString; -import static com.android.server.wm.proto.ConfigurationContainerProto.FULL_CONFIGURATION; -import static com.android.server.wm.proto.ConfigurationContainerProto.MERGED_OVERRIDE_CONFIGURATION; -import static com.android.server.wm.proto.ConfigurationContainerProto.OVERRIDE_CONFIGURATION; +import static com.android.server.wm.ConfigurationContainerProto.FULL_CONFIGURATION; +import static com.android.server.wm.ConfigurationContainerProto.MERGED_OVERRIDE_CONFIGURATION; +import static com.android.server.wm.ConfigurationContainerProto.OVERRIDE_CONFIGURATION; import android.annotation.CallSuper; import android.app.WindowConfiguration; @@ -470,7 +470,7 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { /** * Write to a protocol buffer output stream. Protocol buffer message definition is at - * {@link com.android.server.wm.proto.ConfigurationContainerProto}. + * {@link com.android.server.wm.ConfigurationContainerProto}. * * @param proto Stream to write the ConfigurationContainer object to. * @param fieldId Field Id of the ConfigurationContainer as defined in the parent diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index 5c62987ec521..d000bb62ff80 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -16,10 +16,10 @@ package com.android.server.wm; -import static com.android.server.wm.proto.AlphaAnimationSpecProto.DURATION; -import static com.android.server.wm.proto.AlphaAnimationSpecProto.FROM; -import static com.android.server.wm.proto.AlphaAnimationSpecProto.TO; -import static com.android.server.wm.proto.AnimationSpecProto.ALPHA; +import static com.android.server.wm.AlphaAnimationSpecProto.DURATION; +import static com.android.server.wm.AlphaAnimationSpecProto.FROM; +import static com.android.server.wm.AlphaAnimationSpecProto.TO; +import static com.android.server.wm.AnimationSpecProto.ALPHA; import android.graphics.Rect; import android.util.proto.ProtoOutputStream; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e2e169003913..20947557f1da 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -101,19 +101,19 @@ import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE; -import static com.android.server.wm.proto.DisplayProto.ABOVE_APP_WINDOWS; -import static com.android.server.wm.proto.DisplayProto.BELOW_APP_WINDOWS; -import static com.android.server.wm.proto.DisplayProto.DISPLAY_FRAMES; -import static com.android.server.wm.proto.DisplayProto.DISPLAY_INFO; -import static com.android.server.wm.proto.DisplayProto.DOCKED_STACK_DIVIDER_CONTROLLER; -import static com.android.server.wm.proto.DisplayProto.DPI; -import static com.android.server.wm.proto.DisplayProto.ID; -import static com.android.server.wm.proto.DisplayProto.IME_WINDOWS; -import static com.android.server.wm.proto.DisplayProto.PINNED_STACK_CONTROLLER; -import static com.android.server.wm.proto.DisplayProto.ROTATION; -import static com.android.server.wm.proto.DisplayProto.SCREEN_ROTATION_ANIMATION; -import static com.android.server.wm.proto.DisplayProto.STACKS; -import static com.android.server.wm.proto.DisplayProto.WINDOW_CONTAINER; +import static com.android.server.wm.DisplayProto.ABOVE_APP_WINDOWS; +import static com.android.server.wm.DisplayProto.BELOW_APP_WINDOWS; +import static com.android.server.wm.DisplayProto.DISPLAY_FRAMES; +import static com.android.server.wm.DisplayProto.DISPLAY_INFO; +import static com.android.server.wm.DisplayProto.DOCKED_STACK_DIVIDER_CONTROLLER; +import static com.android.server.wm.DisplayProto.DPI; +import static com.android.server.wm.DisplayProto.ID; +import static com.android.server.wm.DisplayProto.IME_WINDOWS; +import static com.android.server.wm.DisplayProto.PINNED_STACK_CONTROLLER; +import static com.android.server.wm.DisplayProto.ROTATION; +import static com.android.server.wm.DisplayProto.SCREEN_ROTATION_ANIMATION; +import static com.android.server.wm.DisplayProto.STACKS; +import static com.android.server.wm.DisplayProto.WINDOW_CONTAINER; import android.annotation.CallSuper; import android.annotation.NonNull; diff --git a/services/core/java/com/android/server/wm/DisplayFrames.java b/services/core/java/com/android/server/wm/DisplayFrames.java index 57693ac2b463..dc6b49127f7b 100644 --- a/services/core/java/com/android/server/wm/DisplayFrames.java +++ b/services/core/java/com/android/server/wm/DisplayFrames.java @@ -19,7 +19,7 @@ package com.android.server.wm; import static android.view.Surface.ROTATION_180; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; -import static com.android.server.wm.proto.DisplayFramesProto.STABLE_BOUNDS; +import static com.android.server.wm.DisplayFramesProto.STABLE_BOUNDS; import android.annotation.NonNull; import android.graphics.Rect; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index b99e85fed46b..5e2bb10fe629 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -34,7 +34,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED; import static com.android.server.wm.WindowManagerService.LAYER_OFFSET_DIM; -import static com.android.server.wm.proto.DockedStackDividerControllerProto.MINIMIZED_DOCK; +import static com.android.server.wm.DockedStackDividerControllerProto.MINIMIZED_DOCK; import android.content.Context; import android.content.res.Configuration; diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 3f1fde96d7b7..529aacc0f91d 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -16,8 +16,8 @@ package com.android.server.wm; -import static com.android.server.wm.proto.AnimationAdapterProto.LOCAL; -import static com.android.server.wm.proto.LocalAnimationAdapterProto.ANIMATION_SPEC; +import static com.android.server.wm.AnimationAdapterProto.LOCAL; +import static com.android.server.wm.LocalAnimationAdapterProto.ANIMATION_SPEC; import android.os.SystemClock; import android.util.proto.ProtoOutputStream; diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java index 2293fb2bea4e..5f1916d4e523 100644 --- a/services/core/java/com/android/server/wm/PinnedStackController.java +++ b/services/core/java/com/android/server/wm/PinnedStackController.java @@ -22,8 +22,8 @@ import static android.util.TypedValue.COMPLEX_UNIT_DIP; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.PinnedStackControllerProto.DEFAULT_BOUNDS; -import static com.android.server.wm.proto.PinnedStackControllerProto.MOVEMENT_BOUNDS; +import static com.android.server.wm.PinnedStackControllerProto.DEFAULT_BOUNDS; +import static com.android.server.wm.PinnedStackControllerProto.MOVEMENT_BOUNDS; import android.app.RemoteAction; import android.content.pm.ParceledListSlice; diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 3e72a713272a..19d66919bb7f 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -26,8 +26,8 @@ import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_W import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING; -import static com.android.server.wm.proto.RemoteAnimationAdapterWrapperProto.TARGET; -import static com.android.server.wm.proto.AnimationAdapterProto.REMOTE; +import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; +import static com.android.server.wm.AnimationAdapterProto.REMOTE; import android.app.ActivityManager.TaskSnapshot; import android.app.WindowConfiguration; diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java index d645110b6fd5..d7f480b78f85 100644 --- a/services/core/java/com/android/server/wm/RemoteAnimationController.java +++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java @@ -19,8 +19,8 @@ package com.android.server.wm; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.AnimationAdapterProto.REMOTE; -import static com.android.server.wm.proto.RemoteAnimationAdapterWrapperProto.TARGET; +import static com.android.server.wm.AnimationAdapterProto.REMOTE; +import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; import android.graphics.Point; import android.graphics.Rect; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 32ae52375fd5..52d81777fd52 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -84,9 +84,9 @@ import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_C import static com.android.server.wm.WindowSurfacePlacer.SET_UPDATE_ROTATION; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_ACTION_PENDING; import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE; -import static com.android.server.wm.proto.RootWindowContainerProto.DISPLAYS; -import static com.android.server.wm.proto.RootWindowContainerProto.WINDOWS; -import static com.android.server.wm.proto.RootWindowContainerProto.WINDOW_CONTAINER; +import static com.android.server.wm.RootWindowContainerProto.DISPLAYS; +import static com.android.server.wm.RootWindowContainerProto.WINDOWS; +import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER; /** Root {@link WindowContainer} for the device. */ class RootWindowContainer extends WindowContainer<DisplayContent> { diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 235f63e6fd7f..fa8a5c66aeea 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -23,8 +23,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; import static com.android.server.wm.WindowStateAnimator.WINDOW_FREEZE_LAYER; -import static com.android.server.wm.proto.ScreenRotationAnimationProto.ANIMATION_RUNNING; -import static com.android.server.wm.proto.ScreenRotationAnimationProto.STARTED; +import static com.android.server.wm.ScreenRotationAnimationProto.ANIMATION_RUNNING; +import static com.android.server.wm.ScreenRotationAnimationProto.STARTED; import android.content.Context; import android.graphics.Matrix; diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index f10ff8c1dd81..e5928b1e6675 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -19,9 +19,9 @@ package com.android.server.wm; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.SurfaceAnimatorProto.ANIMATION_ADAPTER; -import static com.android.server.wm.proto.SurfaceAnimatorProto.ANIMATION_START_DELAYED; -import static com.android.server.wm.proto.SurfaceAnimatorProto.LEASH; +import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_ADAPTER; +import static com.android.server.wm.SurfaceAnimatorProto.ANIMATION_START_DELAYED; +import static com.android.server.wm.SurfaceAnimatorProto.LEASH; import android.annotation.NonNull; import android.annotation.Nullable; @@ -310,7 +310,7 @@ class SurfaceAnimator { /** * Write to a protocol buffer output stream. Protocol buffer message definition is at {@link - * com.android.server.wm.proto.SurfaceAnimatorProto}. + * com.android.server.wm.SurfaceAnimatorProto}. * * @param proto Stream to write the SurfaceAnimator object to. * @param fieldId Field Id of the SurfaceAnimator as defined in the parent message. diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a403e6f2a212..e4722f956f1f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -26,13 +26,13 @@ import static com.android.server.EventLogTags.WM_TASK_REMOVED; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.TaskProto.APP_WINDOW_TOKENS; -import static com.android.server.wm.proto.TaskProto.BOUNDS; -import static com.android.server.wm.proto.TaskProto.DEFER_REMOVAL; -import static com.android.server.wm.proto.TaskProto.FILLS_PARENT; -import static com.android.server.wm.proto.TaskProto.ID; -import static com.android.server.wm.proto.TaskProto.TEMP_INSET_BOUNDS; -import static com.android.server.wm.proto.TaskProto.WINDOW_CONTAINER; +import static com.android.server.wm.TaskProto.APP_WINDOW_TOKENS; +import static com.android.server.wm.TaskProto.BOUNDS; +import static com.android.server.wm.TaskProto.DEFER_REMOVAL; +import static com.android.server.wm.TaskProto.FILLS_PARENT; +import static com.android.server.wm.TaskProto.ID; +import static com.android.server.wm.TaskProto.TEMP_INSET_BOUNDS; +import static com.android.server.wm.TaskProto.WINDOW_CONTAINER; import android.annotation.CallSuper; import android.app.ActivityManager.TaskDescription; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 460edece0f61..900e2df1258d 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -35,18 +35,18 @@ import static android.view.WindowManager.DOCKED_TOP; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.StackProto.ADJUSTED_BOUNDS; -import static com.android.server.wm.proto.StackProto.ADJUSTED_FOR_IME; -import static com.android.server.wm.proto.StackProto.ADJUST_DIVIDER_AMOUNT; -import static com.android.server.wm.proto.StackProto.ADJUST_IME_AMOUNT; -import static com.android.server.wm.proto.StackProto.ANIMATION_BACKGROUND_SURFACE_IS_DIMMING; -import static com.android.server.wm.proto.StackProto.BOUNDS; -import static com.android.server.wm.proto.StackProto.DEFER_REMOVAL; -import static com.android.server.wm.proto.StackProto.FILLS_PARENT; -import static com.android.server.wm.proto.StackProto.ID; -import static com.android.server.wm.proto.StackProto.MINIMIZE_AMOUNT; -import static com.android.server.wm.proto.StackProto.TASKS; -import static com.android.server.wm.proto.StackProto.WINDOW_CONTAINER; +import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS; +import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME; +import static com.android.server.wm.StackProto.ADJUST_DIVIDER_AMOUNT; +import static com.android.server.wm.StackProto.ADJUST_IME_AMOUNT; +import static com.android.server.wm.StackProto.ANIMATION_BACKGROUND_SURFACE_IS_DIMMING; +import static com.android.server.wm.StackProto.BOUNDS; +import static com.android.server.wm.StackProto.DEFER_REMOVAL; +import static com.android.server.wm.StackProto.FILLS_PARENT; +import static com.android.server.wm.StackProto.ID; +import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT; +import static com.android.server.wm.StackProto.TASKS; +import static com.android.server.wm.StackProto.WINDOW_CONTAINER; import android.annotation.CallSuper; import android.content.res.Configuration; diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index a41eba8205f7..7b7cb30ac64d 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -19,8 +19,8 @@ package com.android.server.wm; import static com.android.server.wm.AnimationAdapter.STATUS_BAR_TRANSITION_DURATION; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; -import static com.android.server.wm.proto.AnimationSpecProto.WINDOW; -import static com.android.server.wm.proto.WindowAnimationSpecProto.ANIMATION; +import static com.android.server.wm.AnimationSpecProto.WINDOW; +import static com.android.server.wm.WindowAnimationSpecProto.ANIMATION; import android.graphics.Point; import android.graphics.Rect; diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 27c0b3b39dfc..28fdaaef7abb 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -23,10 +23,10 @@ import static android.view.SurfaceControl.Transaction; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.WindowContainerProto.CONFIGURATION_CONTAINER; -import static com.android.server.wm.proto.WindowContainerProto.ORIENTATION; -import static com.android.server.wm.proto.WindowContainerProto.SURFACE_ANIMATOR; -import static com.android.server.wm.proto.WindowContainerProto.VISIBLE; +import static com.android.server.wm.WindowContainerProto.CONFIGURATION_CONTAINER; +import static com.android.server.wm.WindowContainerProto.ORIENTATION; +import static com.android.server.wm.WindowContainerProto.SURFACE_ANIMATOR; +import static com.android.server.wm.WindowContainerProto.VISIBLE; import android.annotation.CallSuper; import android.content.res.Configuration; @@ -987,7 +987,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< /** * Write to a protocol buffer output stream. Protocol buffer message definition is at - * {@link com.android.server.wm.proto.WindowContainerProto}. + * {@link com.android.server.wm.WindowContainerProto}. * * @param proto Stream to write the WindowContainer object to. * @param fieldId Field Id of the WindowContainer as defined in the parent message. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5f0769d19b2c..a22bb0086ba1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -97,15 +97,15 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSA import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.APP_TRANSITION; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.DISPLAY_FROZEN; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.FOCUSED_APP; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.FOCUSED_WINDOW; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.INPUT_METHOD_WINDOW; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.LAST_ORIENTATION; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.POLICY; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.ROOT_WINDOW_CONTAINER; -import static com.android.server.wm.proto.WindowManagerServiceDumpProto.ROTATION; +import static com.android.server.wm.WindowManagerServiceDumpProto.APP_TRANSITION; +import static com.android.server.wm.WindowManagerServiceDumpProto.DISPLAY_FROZEN; +import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP; +import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_WINDOW; +import static com.android.server.wm.WindowManagerServiceDumpProto.INPUT_METHOD_WINDOW; +import static com.android.server.wm.WindowManagerServiceDumpProto.LAST_ORIENTATION; +import static com.android.server.wm.WindowManagerServiceDumpProto.POLICY; +import static com.android.server.wm.WindowManagerServiceDumpProto.ROOT_WINDOW_CONTAINER; +import static com.android.server.wm.WindowManagerServiceDumpProto.ROTATION; import android.Manifest; import android.Manifest.permission; @@ -6179,7 +6179,7 @@ public class WindowManagerService extends IWindowManager.Stub /** * Write to a protocol buffer output stream. Protocol buffer message definition is at - * {@link com.android.server.wm.proto.WindowManagerServiceDumpProto}. + * {@link com.android.server.wm.WindowManagerServiceDumpProto}. * * @param proto Stream to write the WindowContainer object to. * @param trim If true, reduce the amount of data written. diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index eebf2fd1b356..54b4123e54ca 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -107,50 +107,50 @@ import static com.android.server.wm.WindowStateAnimator.COMMIT_DRAW_PENDING; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN; import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW; -import static com.android.server.wm.proto.IdentifierProto.HASH_CODE; -import static com.android.server.wm.proto.IdentifierProto.TITLE; -import static com.android.server.wm.proto.IdentifierProto.USER_ID; -import static com.android.server.wm.proto.AnimationSpecProto.MOVE; -import static com.android.server.wm.proto.MoveAnimationSpecProto.DURATION; -import static com.android.server.wm.proto.MoveAnimationSpecProto.FROM; -import static com.android.server.wm.proto.MoveAnimationSpecProto.TO; -import static com.android.server.wm.proto.WindowStateProto.ANIMATING_EXIT; -import static com.android.server.wm.proto.WindowStateProto.ANIMATOR; -import static com.android.server.wm.proto.WindowStateProto.ATTRIBUTES; -import static com.android.server.wm.proto.WindowStateProto.CHILD_WINDOWS; -import static com.android.server.wm.proto.WindowStateProto.CONTAINING_FRAME; -import static com.android.server.wm.proto.WindowStateProto.CONTENT_FRAME; -import static com.android.server.wm.proto.WindowStateProto.CONTENT_INSETS; -import static com.android.server.wm.proto.WindowStateProto.CUTOUT; -import static com.android.server.wm.proto.WindowStateProto.DECOR_FRAME; -import static com.android.server.wm.proto.WindowStateProto.DESTROYING; -import static com.android.server.wm.proto.WindowStateProto.DISPLAY_FRAME; -import static com.android.server.wm.proto.WindowStateProto.DISPLAY_ID; -import static com.android.server.wm.proto.WindowStateProto.FRAME; -import static com.android.server.wm.proto.WindowStateProto.GIVEN_CONTENT_INSETS; -import static com.android.server.wm.proto.WindowStateProto.HAS_SURFACE; -import static com.android.server.wm.proto.WindowStateProto.IDENTIFIER; -import static com.android.server.wm.proto.WindowStateProto.IS_ON_SCREEN; -import static com.android.server.wm.proto.WindowStateProto.IS_READY_FOR_DISPLAY; -import static com.android.server.wm.proto.WindowStateProto.IS_VISIBLE; -import static com.android.server.wm.proto.WindowStateProto.OUTSETS; -import static com.android.server.wm.proto.WindowStateProto.OUTSET_FRAME; -import static com.android.server.wm.proto.WindowStateProto.OVERSCAN_FRAME; -import static com.android.server.wm.proto.WindowStateProto.OVERSCAN_INSETS; -import static com.android.server.wm.proto.WindowStateProto.PARENT_FRAME; -import static com.android.server.wm.proto.WindowStateProto.REMOVED; -import static com.android.server.wm.proto.WindowStateProto.REMOVE_ON_EXIT; -import static com.android.server.wm.proto.WindowStateProto.REQUESTED_HEIGHT; -import static com.android.server.wm.proto.WindowStateProto.REQUESTED_WIDTH; -import static com.android.server.wm.proto.WindowStateProto.STABLE_INSETS; -import static com.android.server.wm.proto.WindowStateProto.STACK_ID; -import static com.android.server.wm.proto.WindowStateProto.SURFACE_INSETS; -import static com.android.server.wm.proto.WindowStateProto.SURFACE_POSITION; -import static com.android.server.wm.proto.WindowStateProto.SYSTEM_UI_VISIBILITY; -import static com.android.server.wm.proto.WindowStateProto.VIEW_VISIBILITY; -import static com.android.server.wm.proto.WindowStateProto.VISIBLE_FRAME; -import static com.android.server.wm.proto.WindowStateProto.VISIBLE_INSETS; -import static com.android.server.wm.proto.WindowStateProto.WINDOW_CONTAINER; +import static com.android.server.wm.IdentifierProto.HASH_CODE; +import static com.android.server.wm.IdentifierProto.TITLE; +import static com.android.server.wm.IdentifierProto.USER_ID; +import static com.android.server.wm.AnimationSpecProto.MOVE; +import static com.android.server.wm.MoveAnimationSpecProto.DURATION; +import static com.android.server.wm.MoveAnimationSpecProto.FROM; +import static com.android.server.wm.MoveAnimationSpecProto.TO; +import static com.android.server.wm.WindowStateProto.ANIMATING_EXIT; +import static com.android.server.wm.WindowStateProto.ANIMATOR; +import static com.android.server.wm.WindowStateProto.ATTRIBUTES; +import static com.android.server.wm.WindowStateProto.CHILD_WINDOWS; +import static com.android.server.wm.WindowStateProto.CONTAINING_FRAME; +import static com.android.server.wm.WindowStateProto.CONTENT_FRAME; +import static com.android.server.wm.WindowStateProto.CONTENT_INSETS; +import static com.android.server.wm.WindowStateProto.CUTOUT; +import static com.android.server.wm.WindowStateProto.DECOR_FRAME; +import static com.android.server.wm.WindowStateProto.DESTROYING; +import static com.android.server.wm.WindowStateProto.DISPLAY_FRAME; +import static com.android.server.wm.WindowStateProto.DISPLAY_ID; +import static com.android.server.wm.WindowStateProto.FRAME; +import static com.android.server.wm.WindowStateProto.GIVEN_CONTENT_INSETS; +import static com.android.server.wm.WindowStateProto.HAS_SURFACE; +import static com.android.server.wm.WindowStateProto.IDENTIFIER; +import static com.android.server.wm.WindowStateProto.IS_ON_SCREEN; +import static com.android.server.wm.WindowStateProto.IS_READY_FOR_DISPLAY; +import static com.android.server.wm.WindowStateProto.IS_VISIBLE; +import static com.android.server.wm.WindowStateProto.OUTSETS; +import static com.android.server.wm.WindowStateProto.OUTSET_FRAME; +import static com.android.server.wm.WindowStateProto.OVERSCAN_FRAME; +import static com.android.server.wm.WindowStateProto.OVERSCAN_INSETS; +import static com.android.server.wm.WindowStateProto.PARENT_FRAME; +import static com.android.server.wm.WindowStateProto.REMOVED; +import static com.android.server.wm.WindowStateProto.REMOVE_ON_EXIT; +import static com.android.server.wm.WindowStateProto.REQUESTED_HEIGHT; +import static com.android.server.wm.WindowStateProto.REQUESTED_WIDTH; +import static com.android.server.wm.WindowStateProto.STABLE_INSETS; +import static com.android.server.wm.WindowStateProto.STACK_ID; +import static com.android.server.wm.WindowStateProto.SURFACE_INSETS; +import static com.android.server.wm.WindowStateProto.SURFACE_POSITION; +import static com.android.server.wm.WindowStateProto.SYSTEM_UI_VISIBILITY; +import static com.android.server.wm.WindowStateProto.VIEW_VISIBILITY; +import static com.android.server.wm.WindowStateProto.VISIBLE_FRAME; +import static com.android.server.wm.WindowStateProto.VISIBLE_INSETS; +import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER; import android.annotation.CallSuper; import android.app.AppOpsManager; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 0c2b0757df97..e92d460f2ec6 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -41,10 +41,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER; import static com.android.server.wm.WindowManagerService.logWithStack; import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE; -import static com.android.server.wm.proto.WindowStateAnimatorProto.DRAW_STATE; -import static com.android.server.wm.proto.WindowStateAnimatorProto.LAST_CLIP_RECT; -import static com.android.server.wm.proto.WindowStateAnimatorProto.SURFACE; -import static com.android.server.wm.proto.WindowStateAnimatorProto.SYSTEM_DECOR_RECT; +import static com.android.server.wm.WindowStateAnimatorProto.DRAW_STATE; +import static com.android.server.wm.WindowStateAnimatorProto.LAST_CLIP_RECT; +import static com.android.server.wm.WindowStateAnimatorProto.SURFACE; +import static com.android.server.wm.WindowStateAnimatorProto.SYSTEM_DECOR_RECT; import android.content.Context; import android.graphics.Matrix; diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index f6c0a54c74ca..66c8cca8f0e0 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -25,8 +25,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACT import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; -import static com.android.server.wm.proto.WindowSurfaceControllerProto.LAYER; -import static com.android.server.wm.proto.WindowSurfaceControllerProto.SHOWN; +import static com.android.server.wm.WindowSurfaceControllerProto.LAYER; +import static com.android.server.wm.WindowSurfaceControllerProto.SHOWN; import android.graphics.Point; import android.graphics.PointF; diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index 172efdcb22ac..f727296ef98a 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -23,12 +23,12 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; -import static com.android.server.wm.proto.WindowTokenProto.HASH_CODE; -import static com.android.server.wm.proto.WindowTokenProto.HIDDEN; -import static com.android.server.wm.proto.WindowTokenProto.PAUSED; -import static com.android.server.wm.proto.WindowTokenProto.WAITING_TO_SHOW; -import static com.android.server.wm.proto.WindowTokenProto.WINDOWS; -import static com.android.server.wm.proto.WindowTokenProto.WINDOW_CONTAINER; +import static com.android.server.wm.WindowTokenProto.HASH_CODE; +import static com.android.server.wm.WindowTokenProto.HIDDEN; +import static com.android.server.wm.WindowTokenProto.PAUSED; +import static com.android.server.wm.WindowTokenProto.WAITING_TO_SHOW; +import static com.android.server.wm.WindowTokenProto.WINDOWS; +import static com.android.server.wm.WindowTokenProto.WINDOW_CONTAINER; import android.annotation.CallSuper; import android.os.Debug; diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java index a29978154a92..8fa56bb065c6 100644 --- a/services/core/java/com/android/server/wm/WindowTracing.java +++ b/services/core/java/com/android/server/wm/WindowTracing.java @@ -17,13 +17,13 @@ package com.android.server.wm; import static android.os.Build.IS_USER; -import static com.android.server.wm.proto.WindowManagerTraceFileProto.ENTRY; -import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER; -import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER_H; -import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER_L; -import static com.android.server.wm.proto.WindowManagerTraceProto.ELAPSED_REALTIME_NANOS; -import static com.android.server.wm.proto.WindowManagerTraceProto.WHERE; -import static com.android.server.wm.proto.WindowManagerTraceProto.WINDOW_MANAGER_SERVICE; +import static com.android.server.wm.WindowManagerTraceFileProto.ENTRY; +import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER; +import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_H; +import static com.android.server.wm.WindowManagerTraceFileProto.MAGIC_NUMBER_L; +import static com.android.server.wm.WindowManagerTraceProto.ELAPSED_REALTIME_NANOS; +import static com.android.server.wm.WindowManagerTraceProto.WHERE; +import static com.android.server.wm.WindowManagerTraceProto.WINDOW_MANAGER_SERVICE; import android.content.Context; import android.os.ShellCommand; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6a9b862743f9..884f348050ec 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -107,7 +107,9 @@ import android.app.admin.SecurityLog; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.SystemUpdateInfo; import android.app.admin.SystemUpdatePolicy; +import android.app.backup.BackupManager; import android.app.backup.IBackupManager; +import android.app.backup.ISelectBackupTransportCallback; import android.app.trust.TrustManager; import android.app.usage.UsageStatsManagerInternal; import android.content.BroadcastReceiver; @@ -252,6 +254,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -11997,20 +12000,32 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } @Override - public void setMandatoryBackupTransport( - ComponentName admin, ComponentName backupTransportComponent) { + public boolean setMandatoryBackupTransport( + ComponentName admin, + ComponentName backupTransportComponent) { if (!mHasFeature) { - return; + return false; } Preconditions.checkNotNull(admin); synchronized (this) { - ActiveAdmin activeAdmin = - getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); - if (!Objects.equals(backupTransportComponent, activeAdmin.mandatoryBackupTransport)) { - activeAdmin.mandatoryBackupTransport = backupTransportComponent; - saveSettingsLocked(UserHandle.USER_SYSTEM); - } + getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); } + + final int callingUid = mInjector.binderGetCallingUid(); + final AtomicBoolean success = new AtomicBoolean(false); + final CountDownLatch countDownLatch = new CountDownLatch(1); + final ISelectBackupTransportCallback selectBackupTransportCallbackInternal = + new ISelectBackupTransportCallback.Stub() { + public void onSuccess(String transportName) { + saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent); + success.set(true); + countDownLatch.countDown(); + } + + public void onFailure(int reason) { + countDownLatch.countDown(); + } + }; final long identity = mInjector.binderClearCallingIdentity(); try { IBackupManager ibm = mInjector.getIBackupManager(); @@ -12018,14 +12033,39 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (!ibm.isBackupServiceActive(UserHandle.USER_SYSTEM)) { ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, true); } - ibm.selectBackupTransportAsync(backupTransportComponent, null); - ibm.setBackupEnabled(true); + ibm.selectBackupTransportAsync( + backupTransportComponent, selectBackupTransportCallbackInternal); + countDownLatch.await(); + if (success.get()) { + ibm.setBackupEnabled(true); + } + } else if (backupTransportComponent == null) { + saveMandatoryBackupTransport(admin, callingUid, backupTransportComponent); + success.set(true); } } catch (RemoteException e) { throw new IllegalStateException("Failed to set mandatory backup transport.", e); + } catch (InterruptedException e) { + throw new IllegalStateException("Failed to set mandatory backup transport.", e); } finally { mInjector.binderRestoreCallingIdentity(identity); } + return success.get(); + } + + synchronized private void saveMandatoryBackupTransport( + ComponentName admin, int callingUid, ComponentName backupTransportComponent) { + ActiveAdmin activeAdmin = + getActiveAdminWithPolicyForUidLocked( + admin, + DeviceAdminInfo.USES_POLICY_DEVICE_OWNER, + callingUid); + if (!Objects.equals(backupTransportComponent, + activeAdmin.mandatoryBackupTransport)) { + activeAdmin.mandatoryBackupTransport = + backupTransportComponent; + saveSettingsLocked(UserHandle.USER_SYSTEM); + } } @Override diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java index 8721d9c28e0e..b452ea506095 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java @@ -22,6 +22,7 @@ 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 org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -33,18 +34,27 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.ArgumentMatchers.any; + import android.app.ActivityManager; import android.app.WaitResult; import android.content.ComponentName; +import android.content.res.Configuration; import android.graphics.Rect; +import android.hardware.display.DisplayManager; import android.platform.test.annotations.Presubmit; import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; +import android.util.SparseIntArray; import org.junit.runner.RunWith; import org.junit.Before; import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -238,4 +248,21 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase { verify(stack, times(expectResumeTopActivity ? 1 : 0)).resumeTopActivityUncheckedLocked( null /* target */, null /* targetOptions */); } + + @Test + public void testTopRunningActivityLockedWithNonExistentDisplay() throws Exception { + // Create display that ActivityManagerService does not know about + final int unknownDisplayId = 100; + + doAnswer((InvocationOnMock invocationOnMock) -> { + final SparseIntArray displayIds = invocationOnMock.<SparseIntArray>getArgument(0); + displayIds.put(0, unknownDisplayId); + return null; + }).when(mSupervisor.mWindowManager).getDisplaysInFocusOrder(any()); + + mSupervisor.mFocusedStack = mock(ActivityStack.class); + + // Supervisor should skip over the non-existent display. + assertEquals(null, mSupervisor.topRunningActivityLocked()); + } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index d2fb1cab3479..43490d312dbc 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -57,6 +57,7 @@ import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManagerInternal; import android.app.admin.PasswordMetrics; +import android.app.backup.ISelectBackupTransportCallback; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Intent; @@ -2264,6 +2265,21 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE, intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION)); + // Make the backup transport selection succeed + doAnswer(new Answer<Void>() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + ISelectBackupTransportCallback callback = + (ISelectBackupTransportCallback) invocation.getArguments()[1]; + if (callback != null) { + callback.onSuccess(""); + } + return null; + } + }).when(getServices().ibackupManager).selectBackupTransportAsync( + any(ComponentName.class), any(ISelectBackupTransportCallback.class)); + + // Backups are not mandatory intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_MANDATORY_BACKUPS); assertNull(intent); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java index a3ade1ea754c..50852548f525 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java @@ -36,7 +36,7 @@ import android.support.test.runner.AndroidJUnit4; import android.util.proto.ProtoOutputStream; import com.android.internal.util.Preconditions; -import com.android.server.wm.proto.WindowManagerTraceProto; +import com.android.server.wm.WindowManagerTraceProto; import org.junit.After; import org.junit.Before; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 0b15191951da..c5386eff612e 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -111,6 +111,13 @@ public class TelephonyManager { BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY; /** + * The process name of the Phone app as well as many other apps that use this process name, such + * as settings and vendor components. + * @hide + */ + public static final String PHONE_PROCESS_NAME = "com.android.phone"; + + /** * The allowed states of Wi-Fi calling. * * @hide diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index c073d1ab03d6..aaf1a1cf8f20 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -139,34 +139,44 @@ public class MmTelFeature extends ImsFeature { @Override public int queryCapabilityStatus() throws RemoteException { - return MmTelFeature.this.queryCapabilityStatus().mCapabilities; + synchronized (mLock) { + return MmTelFeature.this.queryCapabilityStatus().mCapabilities; + } } @Override public void addCapabilityCallback(IImsCapabilityCallback c) { + // no need to lock, structure already handles multithreading. MmTelFeature.this.addCapabilityCallback(c); } @Override public void removeCapabilityCallback(IImsCapabilityCallback c) { + // no need to lock, structure already handles multithreading. MmTelFeature.this.removeCapabilityCallback(c); } @Override public void changeCapabilitiesConfiguration(CapabilityChangeRequest request, IImsCapabilityCallback c) throws RemoteException { - MmTelFeature.this.requestChangeEnabledCapabilities(request, c); + synchronized (mLock) { + MmTelFeature.this.requestChangeEnabledCapabilities(request, c); + } } @Override public void queryCapabilityConfiguration(int capability, int radioTech, IImsCapabilityCallback c) { - queryCapabilityConfigurationInternal(capability, radioTech, c); + synchronized (mLock) { + queryCapabilityConfigurationInternal(capability, radioTech, c); + } } @Override public void setSmsListener(IImsSmsListener l) throws RemoteException { - MmTelFeature.this.setSmsListener(l); + synchronized (mLock) { + MmTelFeature.this.setSmsListener(l); + } } @Override diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java index a5c55e8d844e..410f754fb5ed 100644 --- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java +++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java @@ -23,6 +23,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -320,6 +321,30 @@ public class IpSecServiceParameterizedTest { } @Test + public void testReleaseOwnedSpi() throws Exception { + IpSecConfig ipSecConfig = new IpSecConfig(); + addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig); + addAuthAndCryptToIpSecConfig(ipSecConfig); + + IpSecTransformResponse createTransformResp = + mIpSecService.createTransform(ipSecConfig, new Binder()); + IpSecService.UserRecord userRecord = + mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid()); + assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent); + mIpSecService.releaseSecurityParameterIndex(ipSecConfig.getSpiResourceId()); + verify(mMockNetd, times(0)) + .ipSecDeleteSecurityAssociation( + eq(createTransformResp.resourceId), + anyString(), + anyString(), + eq(TEST_SPI), + anyInt(), + anyInt()); + // quota is not released until the SPI is released by the Transform + assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent); + } + + @Test public void testDeleteTransform() throws Exception { IpSecConfig ipSecConfig = new IpSecConfig(); addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig); @@ -329,7 +354,7 @@ public class IpSecServiceParameterizedTest { mIpSecService.createTransform(ipSecConfig, new Binder()); mIpSecService.deleteTransform(createTransformResp.resourceId); - verify(mMockNetd) + verify(mMockNetd, times(1)) .ipSecDeleteSecurityAssociation( eq(createTransformResp.resourceId), anyString(), @@ -342,6 +367,21 @@ public class IpSecServiceParameterizedTest { IpSecService.UserRecord userRecord = mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid()); assertEquals(0, userRecord.mTransformQuotaTracker.mCurrent); + assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent); + + mIpSecService.releaseSecurityParameterIndex(ipSecConfig.getSpiResourceId()); + // Verify that ipSecDeleteSa was not called when the SPI was released because the + // ownedByTransform property should prevent it; (note, the called count is cumulative). + verify(mMockNetd, times(1)) + .ipSecDeleteSecurityAssociation( + anyInt(), + anyString(), + anyString(), + anyInt(), + anyInt(), + anyInt()); + assertEquals(0, userRecord.mSpiQuotaTracker.mCurrent); + try { userRecord.mTransformRecords.getRefcountedResourceOrThrow( createTransformResp.resourceId); |