diff options
781 files changed, 4042 insertions, 1421 deletions
diff --git a/Android.mk b/Android.mk index 1a36d185548b..2d8739b5384f 100644 --- a/Android.mk +++ b/Android.mk @@ -238,6 +238,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/INetworkScoreService.aidl \ core/java/android/net/INetworkStatsService.aidl \ core/java/android/net/INetworkStatsSession.aidl \ + core/java/android/net/ITetheringStatsProvider.aidl \ core/java/android/net/nsd/INsdManager.aidl \ core/java/android/nfc/IAppCallback.aidl \ core/java/android/nfc/INfcAdapter.aidl \ diff --git a/api/test-current.txt b/api/test-current.txt index c2a1231ee2f9..171fa6650dcd 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -46190,6 +46190,7 @@ package android.view { method public void setFocusable(int); method public void setFocusableInTouchMode(boolean); method public void setFocusedByDefault(boolean); + method public final void setFocusedInCluster(); method public void setForeground(android.graphics.drawable.Drawable); method public void setForegroundGravity(int); method public void setForegroundTintList(android.content.res.ColorStateList); diff --git a/cmds/bootanimation/BootAnimationUtil.cpp b/cmds/bootanimation/BootAnimationUtil.cpp index 377d6ce372f2..7718daf61d81 100644 --- a/cmds/bootanimation/BootAnimationUtil.cpp +++ b/cmds/bootanimation/BootAnimationUtil.cpp @@ -29,7 +29,7 @@ bool bootAnimationDisabled() { char value[PROPERTY_VALUE_MAX]; property_get("debug.sf.nobootanimation", value, "0"); if (atoi(value) > 0) { - return false; + return true; } property_get("ro.boot.quiescent", value, "0"); diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp index daac5887a500..8501982d071c 100644 --- a/cmds/bootanimation/bootanimation_main.cpp +++ b/cmds/bootanimation/bootanimation_main.cpp @@ -157,8 +157,10 @@ int main() // create the boot animation object sp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks()); + ALOGV("Boot animation set up. Joining pool."); IPCThreadState::self()->joinThreadPool(); } + ALOGV("Boot animation exit"); return 0; } diff --git a/core/java/android/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java index 87e512c31bfa..bf9bd79e63ef 100644 --- a/core/java/android/accounts/AbstractAccountAuthenticator.java +++ b/core/java/android/accounts/AbstractAccountAuthenticator.java @@ -547,7 +547,9 @@ public abstract class AbstractAccountAuthenticator { * @param authTokenType the type of auth token to retrieve after adding the account, may be null * @param requiredFeatures a String array of authenticator-specific features that the added * account must support, may be null - * @param options a Bundle of authenticator-specific options, may be null + * @param options a Bundle of authenticator-specific options. It always contains + * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID} + * fields which will let authenticator know the identity of the caller. * @return a Bundle result or null if the result is to be returned via the response. The result * will contain either: * <ul> @@ -603,21 +605,24 @@ public abstract class AbstractAccountAuthenticator { * addition {@link AbstractAccountAuthenticator} implementations that declare themselves * {@code android:customTokens=true} may also provide a non-negative {@link * #KEY_CUSTOM_TOKEN_EXPIRY} long value containing the expiration timestamp of the expiration - * time (in millis since the unix epoch). + * time (in millis since the unix epoch), tokens will be cached in memory based on + * application's packageName/signature for however long that was specified. * <p> * Implementers should assume that tokens will be cached on the basis of account and * authTokenType. The system may ignore the contents of the supplied options Bundle when * determining to re-use a cached token. Furthermore, implementers should assume a supplied * expiration time will be treated as non-binding advice. * <p> - * Finally, note that for android:customTokens=false authenticators, tokens are cached + * Finally, note that for {@code android:customTokens=false} authenticators, tokens are cached * indefinitely until some client calls {@link * AccountManager#invalidateAuthToken(String,String)}. * * @param response to send the result back to the AccountManager, will never be null * @param account the account whose credentials are to be retrieved, will never be null * @param authTokenType the type of auth token to retrieve, will never be null - * @param options a Bundle of authenticator-specific options, may be null + * @param options a Bundle of authenticator-specific options. It always contains + * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID} + * fields which will let authenticator know the identity of the caller. * @return a Bundle result or null if the result is to be returned via the response. * @throws NetworkErrorException if the authenticator could not honor the request due to a * network error diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index a446296fe393..a209d2809ac3 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -242,10 +242,13 @@ public class AccountManager { public static final String KEY_LAST_AUTHENTICATED_TIME = "lastAuthenticatedTime"; /** - * Authenticators using 'customTokens' option will also get the UID of the - * caller + * The UID of caller app. */ public static final String KEY_CALLER_UID = "callerUid"; + + /** + * The process id of caller app. + */ public static final String KEY_CALLER_PID = "callerPid"; /** diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 3d2e0619af92..21270c50f8f2 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -6423,9 +6423,9 @@ public final class ActivityThread { private <T> T instantiate(ClassLoader cl, String className, Context c, Instantiator<T> instantiator) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - if (c.getApplicationContext() instanceof Application) { - T a = instantiator.instantiate((Application) c.getApplicationContext(), - cl, className); + Application app = getApp(c); + if (app != null) { + T a = instantiator.instantiate(app, cl, className); if (a != null) return a; } return (T) cl.loadClass(className).newInstance(); @@ -6434,14 +6434,25 @@ public final class ActivityThread { private <T> T instantiate(ClassLoader cl, String className, Intent intent, Context c, IntentInstantiator<T> instantiator) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - if (c.getApplicationContext() instanceof Application) { - T a = instantiator.instantiate((Application) c.getApplicationContext(), - cl, className, intent); + Application app = getApp(c); + if (app != null) { + T a = instantiator.instantiate(app, cl, className, intent); if (a != null) return a; } return (T) cl.loadClass(className).newInstance(); } + private Application getApp(Context c) { + // We need this shortcut to avoid actually calling getApplicationContext() on an Application + // because the Application may not return itself for getApplicationContext() because the + // API doesn't enforce it. + if (c instanceof Application) return (Application) c; + if (c.getApplicationContext() instanceof Application) { + return (Application) c.getApplicationContext(); + } + return null; + } + private interface Instantiator<T> { T instantiate(Application app, ClassLoader cl, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException; diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 9c9d6556598c..c48be7705706 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -60,12 +60,10 @@ import android.os.Looper; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.IStorageManager; -import android.os.storage.StorageManager; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -621,7 +619,8 @@ class ContextImpl extends Context { @Override public File getExternalFilesDir(String type) { // Operates on primary external storage - return getExternalFilesDirs(type)[0]; + final File[] dirs = getExternalFilesDirs(type); + return (dirs != null && dirs.length > 0) ? dirs[0] : null; } @Override @@ -638,7 +637,8 @@ class ContextImpl extends Context { @Override public File getObbDir() { // Operates on primary external storage - return getObbDirs()[0]; + final File[] dirs = getObbDirs(); + return (dirs != null && dirs.length > 0) ? dirs[0] : null; } @Override @@ -672,7 +672,8 @@ class ContextImpl extends Context { @Override public File getExternalCacheDir() { // Operates on primary external storage - return getExternalCacheDirs()[0]; + final File[] dirs = getExternalCacheDirs(); + return (dirs != null && dirs.length > 0) ? dirs[0] : null; } @Override diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java index 143d147ab4e7..d6e36914ac6c 100644 --- a/core/java/android/app/NotificationChannel.java +++ b/core/java/android/app/NotificationChannel.java @@ -15,11 +15,6 @@ */ package android.app; -import org.json.JSONException; -import org.json.JSONObject; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; - import android.annotation.SystemApi; import android.app.NotificationManager.Importance; import android.content.Intent; @@ -31,6 +26,11 @@ import android.provider.Settings; import android.service.notification.NotificationListenerService; import android.text.TextUtils; +import org.json.JSONException; +import org.json.JSONObject; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlSerializer; + import java.io.IOException; import java.util.Arrays; @@ -743,7 +743,7 @@ public final class NotificationChannel implements Parcelable { private static String longArrayToString(long[] values) { StringBuffer sb = new StringBuffer(); - if (values != null) { + if (values != null && values.length > 0) { for (int i = 0; i < values.length - 1; i++) { sb.append(values[i]).append(DELIMITER); } diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index 5a356d9d4a6d..d0d98c9fb10f 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -659,13 +659,13 @@ public class DeviceAdminReceiver extends BroadcastReceiver { * managed provisioning. * * <p>When provisioning of a managed profile is complete, the managed profile is hidden until - * the profile owner calls {DevicePolicyManager#setProfileEnabled(ComponentName admin)}. + * the profile owner calls {@link DevicePolicyManager#setProfileEnabled(ComponentName admin)}. * Typically a profile owner will enable the profile when it has finished any additional setup - * such as adding an account by using the {@link AccountManager} and calling apis to bring the + * such as adding an account by using the {@link AccountManager} and calling APIs to bring the * profile into the desired state. * * <p> Note that provisioning completes without waiting for any server interactions, so the - * profile owner needs to wait for data to be available if required (e.g. android device ids or + * profile owner needs to wait for data to be available if required (e.g. Android device IDs or * other data that is set as a result of server interactions). * * <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 23591c7893fb..a8b8c4b5cd43 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -15,9 +15,6 @@ */ package android.content.res; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import android.animation.Animator; import android.animation.StateListAnimator; import android.annotation.AnyRes; @@ -32,7 +29,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.Config; import android.content.res.Configuration.NativeConfig; import android.content.res.Resources.NotFoundException; -import android.graphics.FontFamily; +import android.graphics.Bitmap; import android.graphics.Typeface; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -40,8 +37,9 @@ import android.graphics.drawable.DrawableContainer; import android.icu.text.PluralRules; import android.os.Build; import android.os.LocaleList; +import android.os.SystemClock; +import android.os.SystemProperties; import android.os.Trace; -import android.text.FontConfig; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; @@ -51,10 +49,12 @@ import android.util.TypedValue; import android.util.Xml; import android.view.DisplayAdjustments; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; import java.io.InputStream; import java.util.Arrays; -import java.util.List; import java.util.Locale; /** @@ -72,9 +72,20 @@ public class ResourcesImpl { private static final boolean DEBUG_LOAD = false; private static final boolean DEBUG_CONFIG = false; - private static final boolean TRACE_FOR_PRELOAD = false; - private static final boolean TRACE_FOR_MISS_PRELOAD = false; + static final String TAG_PRELOAD = TAG + ".preload"; + + private static final boolean TRACE_FOR_PRELOAD = false; // Do we still need it? + private static final boolean TRACE_FOR_MISS_PRELOAD = false; // Do we still need it? + + public static final boolean TRACE_FOR_DETAILED_PRELOAD = + SystemProperties.getBoolean("debug.trace_resource_preload", false); + + /** Used only when TRACE_FOR_DETAILED_PRELOAD is true. */ + private static int sPreloadTracingNumLoadedDrawables; + private long mPreloadTracingPreloadStartTime; + private long mPreloadTracingStartBitmapSize; + private long mPreloadTracingStartBitmapCount; private static final int ID_OTHER = 0x01000004; @@ -593,6 +604,16 @@ public class ResourcesImpl { Drawable dr; boolean needsNewDrawableAfterCache = false; if (cs != null) { + if (TRACE_FOR_DETAILED_PRELOAD) { + // Log only framework resources + if (((id >>> 24) == 0x1) && (android.os.Process.myUid() != 0)) { + final String name = getResourceName(id); + if (name != null) { + Log.d(TAG_PRELOAD, "Hit preloaded FW drawable #" + + Integer.toHexString(id) + " " + name); + } + } + } dr = cs.newDrawable(wrapper); } else if (isColorDrawable) { dr = new ColorDrawable(value.data); @@ -744,6 +765,18 @@ public class ResourcesImpl { } } + // For prelaod tracing. + long startTime = 0; + int startBitmapCount = 0; + long startBitmapSize = 0; + int startDrwableCount = 0; + if (TRACE_FOR_DETAILED_PRELOAD) { + startTime = System.nanoTime(); + startBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps; + startBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize; + startDrwableCount = sPreloadTracingNumLoadedDrawables; + } + if (DEBUG_LOAD) { Log.v(TAG, "Loading drawable for cookie " + value.assetCookie + ": " + file); } @@ -772,6 +805,37 @@ public class ResourcesImpl { } Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); + if (TRACE_FOR_DETAILED_PRELOAD) { + if (((id >>> 24) == 0x1)) { + final String name = getResourceName(id); + if (name != null) { + final long time = System.nanoTime() - startTime; + final int loadedBitmapCount = + Bitmap.sPreloadTracingNumInstantiatedBitmaps - startBitmapCount; + final long loadedBitmapSize = + Bitmap.sPreloadTracingTotalBitmapsSize - startBitmapSize; + final int loadedDrawables = + sPreloadTracingNumLoadedDrawables - startDrwableCount; + + sPreloadTracingNumLoadedDrawables++; + + final boolean isRoot = (android.os.Process.myUid() == 0); + + Log.d(TAG_PRELOAD, + (isRoot ? "Preloaded FW drawable #" + : "Loaded non-preloaded FW drawable #") + + Integer.toHexString(id) + + " " + name + + " " + file + + " " + dr.getClass().getCanonicalName() + + " #nested_drawables= " + loadedDrawables + + " #bitmaps= " + loadedBitmapCount + + " total_bitmap_size= " + loadedBitmapSize + + " in[us] " + (time / 1000)); + } + } + } + return dr; } @@ -1102,6 +1166,13 @@ public class ResourcesImpl { mPreloading = true; mConfiguration.densityDpi = DisplayMetrics.DENSITY_DEVICE; updateConfiguration(null, null, null); + + if (TRACE_FOR_DETAILED_PRELOAD) { + mPreloadTracingPreloadStartTime = SystemClock.uptimeMillis(); + mPreloadTracingStartBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize; + mPreloadTracingStartBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps; + Log.d(TAG_PRELOAD, "Preload starting"); + } } } @@ -1111,6 +1182,16 @@ public class ResourcesImpl { */ void finishPreloading() { if (mPreloading) { + if (TRACE_FOR_DETAILED_PRELOAD) { + final long time = SystemClock.uptimeMillis() - mPreloadTracingPreloadStartTime; + final long size = + Bitmap.sPreloadTracingTotalBitmapsSize - mPreloadTracingStartBitmapSize; + final long count = Bitmap.sPreloadTracingNumInstantiatedBitmaps + - mPreloadTracingStartBitmapCount; + Log.d(TAG_PRELOAD, "Preload finished, " + + count + " bitmaps of " + size + " bytes in " + time + " ms"); + } + mPreloading = false; flushLayoutCache(); } diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index 4bc62b1d04d3..e1cd451ba2a8 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -894,8 +894,9 @@ public abstract class SensorManager { * to free up resource in sensor system associated with the direct channel. * * @param mem A {@link android.os.MemoryFile} shared memory object. - * @return A {@link android.hardware.SensorDirectChannel} object if successful, null otherwise. + * @return A {@link android.hardware.SensorDirectChannel} object. * @throws NullPointerException when mem is null. + * @throws UncheckedIOException if not able to create channel. * @see SensorDirectChannel#close() * @see #configureDirectChannel(SensorDirectChannel, Sensor, int) */ @@ -916,9 +917,9 @@ public abstract class SensorManager { * to free up resource in sensor system associated with the direct channel. * * @param mem A {@link android.hardware.HardwareBuffer} shared memory object. - * @return A {@link android.hardware.SensorDirectChannel} object if successful, - * null otherwise. + * @return A {@link android.hardware.SensorDirectChannel} object. * @throws NullPointerException when mem is null. + * @throws UncheckedIOException if not able to create channel. * @see SensorDirectChannel#close() * @see #configureDirectChannel(SensorDirectChannel, Sensor, int) */ diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 1b150bfca63a..90bf896c2225 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -16,28 +16,29 @@ package android.hardware.camera2; -import android.annotation.RequiresPermission; -import android.annotation.SystemService; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.annotation.SystemService; import android.content.Context; -import android.hardware.ICameraService; -import android.hardware.ICameraServiceListener; import android.hardware.CameraInfo; import android.hardware.CameraStatus; +import android.hardware.ICameraService; +import android.hardware.ICameraServiceListener; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.legacy.CameraDeviceUserShim; import android.hardware.camera2.legacy.LegacyMetadataMapper; -import android.os.IBinder; import android.os.Binder; import android.os.DeadObjectException; import android.os.Handler; +import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; -import android.util.Log; +import android.os.SystemProperties; import android.util.ArrayMap; +import android.util.Log; import java.util.ArrayList; @@ -210,7 +211,9 @@ public final class CameraManager { public CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId) throws CameraAccessException { CameraCharacteristics characteristics = null; - + if (CameraManagerGlobal.sCameraServiceDisabled) { + throw new IllegalArgumentException("No cameras available on device"); + } synchronized (mLock) { /* * Get the camera characteristics from the camera service directly if it supports it, @@ -462,6 +465,9 @@ public final class CameraManager { "Handler argument is null, but no looper exists in the calling thread"); } } + if (CameraManagerGlobal.sCameraServiceDisabled) { + throw new IllegalArgumentException("No cameras available on device"); + } openCameraDeviceUserAsync(cameraId, callback, handler, clientUid); } @@ -507,6 +513,9 @@ public final class CameraManager { */ public void setTorchMode(@NonNull String cameraId, boolean enabled) throws CameraAccessException { + if (CameraManagerGlobal.sCameraServiceDisabled) { + throw new IllegalArgumentException("No cameras available on device"); + } CameraManagerGlobal.get().setTorchMode(cameraId, enabled); } @@ -745,6 +754,9 @@ public final class CameraManager { private CameraManagerGlobal() { } + public static final boolean sCameraServiceDisabled = + SystemProperties.getBoolean("config.disable_cameraservice", false); + public static CameraManagerGlobal get() { return gCameraManager; } @@ -764,7 +776,7 @@ public final class CameraManager { public ICameraService getCameraService() { synchronized(mLock) { connectCameraServiceLocked(); - if (mCameraService == null) { + if (mCameraService == null && !sCameraServiceDisabled) { Log.e(TAG, "Camera service is unavailable"); } return mCameraService; @@ -779,7 +791,7 @@ public final class CameraManager { */ private void connectCameraServiceLocked() { // Only reconnect if necessary - if (mCameraService != null) return; + if (mCameraService != null || sCameraServiceDisabled) return; Log.i(TAG, "Connecting to camera service"); diff --git a/core/java/android/hardware/location/NanoApp.java b/core/java/android/hardware/location/NanoApp.java index d5d428e95080..0465defc41ef 100644 --- a/core/java/android/hardware/location/NanoApp.java +++ b/core/java/android/hardware/location/NanoApp.java @@ -56,10 +56,10 @@ public class NanoApp { * {@link #setAppBinary(byte[])} and {@link #setAppId(long)} must be called * prior to passing this object to any managers. * - * @see #NanoApp(int, byte[]) + * @see #NanoApp(long, byte[]) */ public NanoApp() { - this(0, null); + this(0L, null); mAppIdSet = false; } diff --git a/core/java/android/net/ITetheringStatsProvider.aidl b/core/java/android/net/ITetheringStatsProvider.aidl new file mode 100644 index 000000000000..769086da42b4 --- /dev/null +++ b/core/java/android/net/ITetheringStatsProvider.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net; + +import android.net.NetworkStats; + +/** + * Interface that allows NetworkManagementService to query for tethering statistics. + * + * TODO: this does not really need to be an interface since Tethering runs in the same process + * as NetworkManagementService. Consider refactoring Tethering to use direct access to + * NetworkManagementService instead of using INetworkManagementService, and then deleting this + * interface. + * + * @hide + */ +interface ITetheringStatsProvider { + NetworkStats getTetherStats(); +} diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index de5974216f71..b46c6b1620b1 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -223,28 +223,69 @@ public final class Debug /** @hide */ public static final int OTHER_OTHER_MEMTRACK = 16; + // Needs to be declared here for the DVK_STAT ranges below. + /** @hide */ + public static final int NUM_OTHER_STATS = 17; + + // Dalvik subsections. /** @hide */ public static final int OTHER_DALVIK_NORMAL = 17; /** @hide */ public static final int OTHER_DALVIK_LARGE = 18; /** @hide */ - public static final int OTHER_DALVIK_LINEARALLOC = 19; + public static final int OTHER_DALVIK_ZYGOTE = 19; + /** @hide */ + public static final int OTHER_DALVIK_NON_MOVING = 20; + // Section begins and ends for dumpsys, relative to the DALVIK categories. + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_START = + OTHER_DALVIK_NORMAL - NUM_OTHER_STATS; /** @hide */ - public static final int OTHER_DALVIK_ACCOUNTING = 20; + public static final int OTHER_DVK_STAT_DALVIK_END = + OTHER_DALVIK_NON_MOVING - NUM_OTHER_STATS; + + // Dalvik Other subsections. + /** @hide */ + public static final int OTHER_DALVIK_OTHER_LINEARALLOC = 21; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22; /** @hide */ - public static final int OTHER_DALVIK_CODE_CACHE = 21; + public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23; /** @hide */ - public static final int OTHER_DALVIK_ZYGOTE = 22; + public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24; /** @hide */ - public static final int OTHER_DALVIK_NON_MOVING = 23; + public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25; /** @hide */ - public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24; + public static final int OTHER_DVK_STAT_DALVIK_OTHER_START = + OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_OTHER_END = + OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE - NUM_OTHER_STATS; + // Dex subsections (Boot vdex, App dex, and App vdex). /** @hide */ - public static final int NUM_OTHER_STATS = 17; + public static final int OTHER_DEX_BOOT_VDEX = 26; + /** @hide */ + public static final int OTHER_DEX_APP_DEX = 27; + /** @hide */ + public static final int OTHER_DEX_APP_VDEX = 28; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_END = OTHER_DEX_APP_VDEX - NUM_OTHER_STATS; + + // Art subsections (App image, boot image). + /** @hide */ + public static final int OTHER_ART_APP = 29; + /** @hide */ + public static final int OTHER_ART_BOOT = 30; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_END = OTHER_ART_BOOT - NUM_OTHER_STATS; /** @hide */ - public static final int NUM_DVK_STATS = 8; + public static final int NUM_DVK_STATS = 14; /** @hide */ public static final int NUM_CATEGORIES = 8; @@ -408,12 +449,18 @@ public final class Debug case OTHER_OTHER_MEMTRACK: return "Other mtrack"; case OTHER_DALVIK_NORMAL: return ".Heap"; case OTHER_DALVIK_LARGE: return ".LOS"; - case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc"; - case OTHER_DALVIK_ACCOUNTING: return ".GC"; - case OTHER_DALVIK_CODE_CACHE: return ".JITCache"; case OTHER_DALVIK_ZYGOTE: return ".Zygote"; case OTHER_DALVIK_NON_MOVING: return ".NonMoving"; - case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc"; + case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC"; + case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache"; + case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata"; + case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DEX_BOOT_VDEX: return ".Boot vdex"; + case OTHER_DEX_APP_DEX: return ".App dex"; + case OTHER_DEX_APP_VDEX: return ".App vdex"; + case OTHER_ART_APP: return ".App art"; + case OTHER_ART_BOOT: return ".Boot art"; default: return "????"; } } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 92e78bc8d977..3de217494ac5 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -20,6 +20,7 @@ package android.os; import android.net.InterfaceConfiguration; import android.net.INetd; import android.net.INetworkManagementEventObserver; +import android.net.ITetheringStatsProvider; import android.net.Network; import android.net.NetworkStats; import android.net.RouteInfo; @@ -207,6 +208,18 @@ interface INetworkManagementService void disableNat(String internalInterface, String externalInterface); /** + * Registers a {@code ITetheringStatsProvider} to provide tethering statistics. + * All registered providers will be called in order, and their results will be added together. + * Netd is always registered as a tethering stats provider. + */ + void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name); + + /** + * Unregisters a previously-registered {@code ITetheringStatsProvider}. + */ + void unregisterTetheringStatsProvider(ITetheringStatsProvider provider); + + /** ** PPPD **/ diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 1f8de044b280..7fa1c5acb688 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -751,7 +751,9 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); - wipeEuiccData(context, wipeEuicc); + // TODO(b/63693573): Uncomment this once the pSIM slot is restored as needed + // after the ensuing boot. Currently you end up stuck on the eSIM. + // wipeEuiccData(context, wipeEuicc); String shutdownArg = null; if (shutdown) { diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl index bfc8636c70a4..42282ac2858b 100644 --- a/core/java/android/security/IKeystoreService.aidl +++ b/core/java/android/security/IKeystoreService.aidl @@ -48,7 +48,7 @@ interface IKeystoreService { byte[] sign(String name, in byte[] data); int verify(String name, in byte[] data, in byte[] signature); byte[] get_pubkey(String name); - int grant(String name, int granteeUid); + String grant(String name, int granteeUid); int ungrant(String name, int granteeUid); long getmtime(String name, int uid); int duplicate(String srcKey, int srcUid, String destKey, int destUid); diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index 1aaf73e6e12c..2dbff100375a 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -72,8 +72,8 @@ class TextLine { private final SpanSet<ReplacementSpan> mReplacementSpanSpanSet = new SpanSet<ReplacementSpan>(ReplacementSpan.class); - private final UnderlineInfo mUnderlineInfo = new UnderlineInfo(); - private final ArrayList<UnderlineInfo> mUnderlines = new ArrayList(); + private final DecorationInfo mDecorationInfo = new DecorationInfo(); + private final ArrayList<DecorationInfo> mDecorations = new ArrayList(); private static final TextLine[] sCached = new TextLine[3]; @@ -704,9 +704,9 @@ class TextLine { fmi.leading = Math.max(fmi.leading, previousLeading); } - private static void drawUnderline(TextPaint wp, Canvas c, int color, float thickness, - float xleft, float xright, float baseline) { - final float underlineTop = baseline + wp.baselineShift + wp.getUnderlinePosition(); + private static void drawStroke(TextPaint wp, Canvas c, int color, float position, + float thickness, float xleft, float xright, float baseline) { + final float strokeTop = baseline + wp.baselineShift + position; final int previousColor = wp.getColor(); final Paint.Style previousStyle = wp.getStyle(); @@ -716,7 +716,7 @@ class TextLine { wp.setAntiAlias(true); wp.setColor(color); - c.drawRect(xleft, underlineTop, xright, underlineTop + thickness, wp); + c.drawRect(xleft, strokeTop, xright, strokeTop + thickness, wp); wp.setStyle(previousStyle); wp.setColor(previousColor); @@ -750,7 +750,7 @@ class TextLine { * @param fmi receives metrics information, can be null * @param needWidth true if the width of the run is needed * @param offset the offset for the purpose of measuring - * @param underlines the list of locations and paremeters for drawing underlines + * @param decorations the list of locations and paremeters for drawing decorations * @return the signed width of the run based on the run direction; only * valid if needWidth is true */ @@ -758,7 +758,7 @@ class TextLine { int contextStart, int contextEnd, boolean runIsRtl, Canvas c, float x, int top, int y, int bottom, FontMetricsInt fmi, boolean needWidth, int offset, - @Nullable ArrayList<UnderlineInfo> underlines) { + @Nullable ArrayList<DecorationInfo> decorations) { wp.setWordSpacing(mAddedWidth); // Get metrics first (even for empty strings or "0" width runs) @@ -773,8 +773,8 @@ class TextLine { float totalWidth = 0; - final int numUnderlines = underlines == null ? 0 : underlines.size(); - if (needWidth || (c != null && (wp.bgColor != 0 || numUnderlines != 0 || runIsRtl))) { + final int numDecorations = decorations == null ? 0 : decorations.size(); + if (needWidth || (c != null && (wp.bgColor != 0 || numDecorations != 0 || runIsRtl))) { totalWidth = getRunAdvance(wp, start, end, contextStart, contextEnd, runIsRtl, offset); } @@ -800,37 +800,44 @@ class TextLine { wp.setColor(previousColor); } - if (numUnderlines != 0) { - for (int i = 0; i < numUnderlines; i++) { - final UnderlineInfo info = underlines.get(i); - - final int underlineStart = Math.max(info.start, start); - final int underlineEnd = Math.min(info.end, offset); - float underlineStartAdvance = getRunAdvance( - wp, start, end, contextStart, contextEnd, runIsRtl, underlineStart); - float underlineEndAdvance = getRunAdvance( - wp, start, end, contextStart, contextEnd, runIsRtl, underlineEnd); - final float underlineXLeft, underlineXRight; + if (numDecorations != 0) { + for (int i = 0; i < numDecorations; i++) { + final DecorationInfo info = decorations.get(i); + + final int decorationStart = Math.max(info.start, start); + final int decorationEnd = Math.min(info.end, offset); + float decorationStartAdvance = getRunAdvance( + wp, start, end, contextStart, contextEnd, runIsRtl, decorationStart); + float decorationEndAdvance = getRunAdvance( + wp, start, end, contextStart, contextEnd, runIsRtl, decorationEnd); + final float decorationXLeft, decorationXRight; if (runIsRtl) { - underlineXLeft = rightX - underlineEndAdvance; - underlineXRight = rightX - underlineStartAdvance; + decorationXLeft = rightX - decorationEndAdvance; + decorationXRight = rightX - decorationStartAdvance; } else { - underlineXLeft = leftX + underlineStartAdvance; - underlineXRight = leftX + underlineEndAdvance; + decorationXLeft = leftX + decorationStartAdvance; + decorationXRight = leftX + decorationEndAdvance; } // Theoretically, there could be cases where both Paint's and TextPaint's // setUnderLineText() are called. For backward compatibility, we need to draw // both underlines, the one with custom color first. if (info.underlineColor != 0) { - drawUnderline(wp, c, info.underlineColor, info.underlineThickness, - underlineXLeft, underlineXRight, y); + drawStroke(wp, c, info.underlineColor, wp.getUnderlinePosition(), + info.underlineThickness, decorationXLeft, decorationXRight, y); } if (info.isUnderlineText) { final float thickness = Math.max(((Paint) wp).getUnderlineThickness(), 1.0f); - drawUnderline(wp, c, wp.getColor(), thickness, - underlineXLeft, underlineXRight, y); + drawStroke(wp, c, wp.getColor(), wp.getUnderlinePosition(), thickness, + decorationXLeft, decorationXRight, y); + } + + if (info.isStrikeThruText) { + final float thickness = + Math.max(((Paint) wp).getStrikeThruThickness(), 1.0f); + drawStroke(wp, c, wp.getColor(), wp.getStrikeThruPosition(), thickness, + decorationXLeft, decorationXRight, y); } } } @@ -919,20 +926,22 @@ class TextLine { return result; } - private static final class UnderlineInfo { + private static final class DecorationInfo { + public boolean isStrikeThruText; public boolean isUnderlineText; public int underlineColor; public float underlineThickness; public int start = -1; public int end = -1; - public boolean hasUnderline() { - return isUnderlineText || underlineColor != 0; + public boolean hasDecoration() { + return isStrikeThruText || isUnderlineText || underlineColor != 0; } // Copies the info, but not the start and end range. - public UnderlineInfo copyInfo() { - final UnderlineInfo copy = new UnderlineInfo(); + public DecorationInfo copyInfo() { + final DecorationInfo copy = new DecorationInfo(); + copy.isStrikeThruText = isStrikeThruText; copy.isUnderlineText = isUnderlineText; copy.underlineColor = underlineColor; copy.underlineThickness = underlineThickness; @@ -940,7 +949,11 @@ class TextLine { } } - private void extractUnderlineInfo(@NonNull TextPaint paint, @NonNull UnderlineInfo info) { + private void extractDecorationInfo(@NonNull TextPaint paint, @NonNull DecorationInfo info) { + info.isStrikeThruText = paint.isStrikeThruText(); + if (info.isStrikeThruText) { + paint.setStrikeThruText(false); + } info.isUnderlineText = paint.isUnderlineText(); if (info.isUnderlineText) { paint.setUnderlineText(false); @@ -1047,8 +1060,8 @@ class TextLine { activePaint.set(mPaint); int activeStart = i; int activeEnd = mlimit; - final UnderlineInfo underlineInfo = mUnderlineInfo; - mUnderlines.clear(); + final DecorationInfo decorationInfo = mDecorationInfo; + mDecorations.clear(); for (int j = i, jnext; j < mlimit; j = jnext) { jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + inext) - mStart; @@ -1064,7 +1077,7 @@ class TextLine { span.updateDrawState(wp); } - extractUnderlineInfo(wp, underlineInfo); + extractDecorationInfo(wp, decorationInfo); if (j == i) { // First chunk of text. We can't handle it yet, since we may need to merge it @@ -1079,24 +1092,24 @@ class TextLine { activeStart, activeEnd, mPaint.getHyphenEdit())); x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x, top, y, bottom, fmi, needWidth || activeEnd < measureLimit, - Math.min(activeEnd, mlimit), mUnderlines); + Math.min(activeEnd, mlimit), mDecorations); activeStart = j; activePaint.set(wp); - mUnderlines.clear(); + mDecorations.clear(); } else { // The present TextPaint is substantially equal to the last TextPaint except - // perhaps for underlines. We just need to expand the active piece of text to + // perhaps for decorations. We just need to expand the active piece of text to // include the present chunk, which we always do anyway. We don't need to save // wp to activePaint, since they are already equal. } activeEnd = jnext; - if (underlineInfo.hasUnderline()) { - final UnderlineInfo copy = underlineInfo.copyInfo(); + if (decorationInfo.hasDecoration()) { + final DecorationInfo copy = decorationInfo.copyInfo(); copy.start = j; copy.end = jnext; - mUnderlines.add(copy); + mDecorations.add(copy); } } // Handle the final piece of text. @@ -1104,7 +1117,7 @@ class TextLine { activeStart, activeEnd, mPaint.getHyphenEdit())); x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x, top, y, bottom, fmi, needWidth || activeEnd < measureLimit, - Math.min(activeEnd, mlimit), mUnderlines); + Math.min(activeEnd, mlimit), mDecorations); } return x - originalX; diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java index e5bc32bb4f0a..fc56455236a2 100644 --- a/core/java/android/text/format/Formatter.java +++ b/core/java/android/text/format/Formatter.java @@ -20,7 +20,11 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.res.Resources; +import android.icu.text.DecimalFormat; import android.icu.text.MeasureFormat; +import android.icu.text.NumberFormat; +import android.icu.text.UnicodeSet; +import android.icu.text.UnicodeSetSpanner; import android.icu.util.Measure; import android.icu.util.MeasureUnit; import android.net.NetworkUtils; @@ -28,6 +32,7 @@ import android.text.BidiFormatter; import android.text.TextUtils; import android.view.View; +import java.math.BigDecimal; import java.util.Locale; /** @@ -37,6 +42,8 @@ import java.util.Locale; public final class Formatter { /** {@hide} */ + public static final int FLAG_DEFAULT = 0; + /** {@hide} */ public static final int FLAG_SHORTER = 1 << 0; /** {@hide} */ public static final int FLAG_CALCULATE_ROUNDED = 1 << 1; @@ -58,7 +65,9 @@ public final class Formatter { return context.getResources().getConfiguration().getLocales().get(0); } - /* Wraps the source string in bidi formatting characters in RTL locales */ + /** + * Wraps the source string in bidi formatting characters in RTL locales. + */ private static String bidiWrap(@NonNull Context context, String source) { final Locale locale = localeFromContext(context); if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) { @@ -87,12 +96,7 @@ public final class Formatter { * @return formatted string with the number */ public static String formatFileSize(@Nullable Context context, long sizeBytes) { - if (context == null) { - return ""; - } - final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0); - return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix, - res.value, res.units)); + return formatFileSize(context, sizeBytes, FLAG_DEFAULT); } /** @@ -100,88 +104,191 @@ public final class Formatter { * (showing fewer digits of precision). */ public static String formatShortFileSize(@Nullable Context context, long sizeBytes) { + return formatFileSize(context, sizeBytes, FLAG_SHORTER); + } + + private static String formatFileSize(@Nullable Context context, long sizeBytes, int flags) { if (context == null) { return ""; } - final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER); - return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix, - res.value, res.units)); + final RoundedBytesResult res = RoundedBytesResult.roundBytes(sizeBytes, flags); + return bidiWrap(context, formatRoundedBytesResult(context, res)); } - /** {@hide} */ - public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) { - final boolean isNegative = (sizeBytes < 0); - float result = isNegative ? -sizeBytes : sizeBytes; - int suffix = com.android.internal.R.string.byteShort; - long mult = 1; - if (result > 900) { - suffix = com.android.internal.R.string.kilobyteShort; - mult = 1000; - result = result / 1000; + private static String getSuffixOverride(@NonNull Resources res, MeasureUnit unit) { + if (unit == MeasureUnit.BYTE) { + return res.getString(com.android.internal.R.string.byteShort); + } else { // unit == PETABYTE + return res.getString(com.android.internal.R.string.petabyteShort); } - if (result > 900) { - suffix = com.android.internal.R.string.megabyteShort; - mult *= 1000; - result = result / 1000; + } + + private static NumberFormat getNumberFormatter(Locale locale, int fractionDigits) { + final NumberFormat numberFormatter = NumberFormat.getInstance(locale); + numberFormatter.setMinimumFractionDigits(fractionDigits); + numberFormatter.setMaximumFractionDigits(fractionDigits); + numberFormatter.setGroupingUsed(false); + if (numberFormatter instanceof DecimalFormat) { + // We do this only for DecimalFormat, since in the general NumberFormat case, calling + // setRoundingMode may throw an exception. + numberFormatter.setRoundingMode(BigDecimal.ROUND_HALF_UP); } - if (result > 900) { - suffix = com.android.internal.R.string.gigabyteShort; - mult *= 1000; - result = result / 1000; + return numberFormatter; + } + + private static String deleteFirstFromString(String source, String toDelete) { + final int location = source.indexOf(toDelete); + if (location == -1) { + return source; + } else { + return source.substring(0, location) + + source.substring(location + toDelete.length(), source.length()); } - if (result > 900) { - suffix = com.android.internal.R.string.terabyteShort; - mult *= 1000; - result = result / 1000; + } + + private static String formatMeasureShort(Locale locale, NumberFormat numberFormatter, + float value, MeasureUnit units) { + final MeasureFormat measureFormatter = MeasureFormat.getInstance( + locale, MeasureFormat.FormatWidth.SHORT, numberFormatter); + return measureFormatter.format(new Measure(value, units)); + } + + private static final UnicodeSetSpanner SPACES_AND_CONTROLS = + new UnicodeSetSpanner(new UnicodeSet("[[:Zs:][:Cf:]]").freeze()); + + private static String formatRoundedBytesResult( + @NonNull Context context, @NonNull RoundedBytesResult input) { + final Locale locale = localeFromContext(context); + final NumberFormat numberFormatter = getNumberFormatter(locale, input.fractionDigits); + if (input.units == MeasureUnit.BYTE || input.units == PETABYTE) { + // ICU spells out "byte" instead of "B", and can't format petabytes yet. + final String formattedNumber = numberFormatter.format(input.value); + return context.getString(com.android.internal.R.string.fileSizeSuffix, + formattedNumber, getSuffixOverride(context.getResources(), input.units)); + } else { + return formatMeasureShort(locale, numberFormatter, input.value, input.units); } - if (result > 900) { - suffix = com.android.internal.R.string.petabyteShort; - mult *= 1000; - result = result / 1000; + } + + /** {@hide} */ + public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) { + final RoundedBytesResult rounded = RoundedBytesResult.roundBytes(sizeBytes, flags); + final Locale locale = res.getConfiguration().getLocales().get(0); + final NumberFormat numberFormatter = getNumberFormatter(locale, rounded.fractionDigits); + final String formattedNumber = numberFormatter.format(rounded.value); + final String units; + if (rounded.units == MeasureUnit.BYTE || rounded.units == PETABYTE) { + // ICU spells out "byte" instead of "B", and can't format petabytes yet. + units = getSuffixOverride(res, rounded.units); + } else { + // Since ICU does not give us access to the pattern, we need to extract the unit string + // from ICU, which we do by taking out the formatted number out of the formatted string + // and trimming the result of spaces and controls. + final String formattedMeasure = formatMeasureShort( + locale, numberFormatter, rounded.value, rounded.units); + final String numberRemoved = deleteFirstFromString(formattedMeasure, formattedNumber); + units = SPACES_AND_CONTROLS.trim(numberRemoved).toString(); } - // Note we calculate the rounded long by ourselves, but still let String.format() - // compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to - // floating point errors. - final int roundFactor; - final String roundFormat; - if (mult == 1 || result >= 100) { - roundFactor = 1; - roundFormat = "%.0f"; - } else if (result < 1) { - roundFactor = 100; - roundFormat = "%.2f"; - } else if (result < 10) { - if ((flags & FLAG_SHORTER) != 0) { - roundFactor = 10; - roundFormat = "%.1f"; - } else { - roundFactor = 100; - roundFormat = "%.2f"; + return new BytesResult(formattedNumber, units, rounded.roundedBytes); + } + + /** + * ICU doesn't support PETABYTE yet. Fake it so that we can treat all units the same way. + * {@hide} + */ + public static final MeasureUnit PETABYTE = MeasureUnit.internalGetInstance( + "digital", "petabyte"); + + /** {@hide} */ + public static class RoundedBytesResult { + public final float value; + public final MeasureUnit units; + public final int fractionDigits; + public final long roundedBytes; + + private RoundedBytesResult( + float value, MeasureUnit units, int fractionDigits, long roundedBytes) { + this.value = value; + this.units = units; + this.fractionDigits = fractionDigits; + this.roundedBytes = roundedBytes; + } + + /** + * Returns a RoundedBytesResult object based on the input size in bytes and the rounding + * flags. The result can be used for formatting. + */ + public static RoundedBytesResult roundBytes(long sizeBytes, int flags) { + final boolean isNegative = (sizeBytes < 0); + float result = isNegative ? -sizeBytes : sizeBytes; + MeasureUnit units = MeasureUnit.BYTE; + long mult = 1; + if (result > 900) { + units = MeasureUnit.KILOBYTE; + mult = 1000; + result = result / 1000; + } + if (result > 900) { + units = MeasureUnit.MEGABYTE; + mult *= 1000; + result = result / 1000; + } + if (result > 900) { + units = MeasureUnit.GIGABYTE; + mult *= 1000; + result = result / 1000; + } + if (result > 900) { + units = MeasureUnit.TERABYTE; + mult *= 1000; + result = result / 1000; } - } else { // 10 <= result < 100 - if ((flags & FLAG_SHORTER) != 0) { + if (result > 900) { + units = PETABYTE; + mult *= 1000; + result = result / 1000; + } + // Note we calculate the rounded long by ourselves, but still let NumberFormat compute + // the rounded value. NumberFormat.format(0.1) might not return "0.1" due to floating + // point errors. + final int roundFactor; + final int roundDigits; + if (mult == 1 || result >= 100) { roundFactor = 1; - roundFormat = "%.0f"; - } else { + roundDigits = 0; + } else if (result < 1) { roundFactor = 100; - roundFormat = "%.2f"; + roundDigits = 2; + } else if (result < 10) { + if ((flags & FLAG_SHORTER) != 0) { + roundFactor = 10; + roundDigits = 1; + } else { + roundFactor = 100; + roundDigits = 2; + } + } else { // 10 <= result < 100 + if ((flags & FLAG_SHORTER) != 0) { + roundFactor = 1; + roundDigits = 0; + } else { + roundFactor = 100; + roundDigits = 2; + } } - } - - if (isNegative) { - result = -result; - } - final String roundedString = String.format(roundFormat, result); - // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like 80PB so - // it's okay (for now)... - final long roundedBytes = - (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0 - : (((long) Math.round(result * roundFactor)) * mult / roundFactor); + if (isNegative) { + result = -result; + } - final String units = res.getString(suffix); + // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like + // 80PB so it's okay (for now)... + final long roundedBytes = + (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0 + : (((long) Math.round(result * roundFactor)) * mult / roundFactor); - return new BytesResult(roundedString, units, roundedBytes); + return new RoundedBytesResult(result, units, roundDigits, roundedBytes); + } } /** diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 52251214d611..6af01f66ac6e 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10180,6 +10180,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @hide */ + @TestApi public final void setFocusedInCluster() { setFocusedInCluster(findKeyboardNavigationCluster()); } diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 4def0d02c225..574137b30f1e 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -35,7 +35,7 @@ public class ViewConfiguration { * Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in * dips */ - private static final int SCROLL_BAR_SIZE = 10; + private static final int SCROLL_BAR_SIZE = 4; /** * Duration of the fade when scrollbars fade away in milliseconds @@ -354,7 +354,8 @@ public class ViewConfiguration { mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f); mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f); - mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f); + mScrollbarSize = res.getDimensionPixelSize( + com.android.internal.R.dimen.config_scrollbarSize); mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f); mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e38a55f76b7d..05f9da5e2867 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -28,7 +28,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import android.Manifest; import android.animation.LayoutTransition; import android.annotation.NonNull; -import android.annotation.TestApi; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.ResourcesManager; @@ -214,11 +213,8 @@ public final class ViewRootImpl implements ViewParent, /** * Always assign focus if a focusable View is available. - * - * @hide */ - @TestApi - public static boolean sAlwaysAssignFocus; + private static boolean sAlwaysAssignFocus; /** * This list must only be modified by the main thread, so a lock is only needed when changing diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java index da064d4d47a1..e7e539c7f01c 100644 --- a/core/java/android/webkit/WebViewClient.java +++ b/core/java/android/webkit/WebViewClient.java @@ -16,6 +16,7 @@ package android.webkit; +import android.annotation.IntDef; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Message; @@ -23,6 +24,9 @@ import android.view.InputEvent; import android.view.KeyEvent; import android.view.ViewRootImpl; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + public class WebViewClient { /** @@ -237,6 +241,16 @@ public class WebViewClient { /** Resource load was cancelled by Safe Browsing */ public static final int ERROR_UNSAFE_RESOURCE = -16; + /** @hide */ + @IntDef({ + SAFE_BROWSING_THREAT_UNKNOWN, + SAFE_BROWSING_THREAT_MALWARE, + SAFE_BROWSING_THREAT_PHISHING, + SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SafeBrowsingThreat {} + /** The resource was blocked for an unknown reason */ public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0; /** The resource was blocked because it contains malware */ @@ -521,8 +535,8 @@ public class WebViewClient { * SAFE_BROWSING_THREAT_* value. * @param callback Applications must invoke one of the callback methods. */ - public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, - SafeBrowsingResponse callback) { + public void onSafeBrowsingHit(WebView view, WebResourceRequest request, + @SafeBrowsingThreat int threatType, SafeBrowsingResponse callback) { callback.showInterstitial(/* allowReporting */ true); } } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index f21545fe8636..04a826514a83 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1387,7 +1387,7 @@ public class Editor { if (mTextActionMode != null) { switch (event.getActionMasked()) { case MotionEvent.ACTION_MOVE: - hideFloatingToolbar(); + hideFloatingToolbar(ActionMode.DEFAULT_HIDE_DURATION); break; case MotionEvent.ACTION_UP: // fall through case MotionEvent.ACTION_CANCEL: @@ -1396,10 +1396,10 @@ public class Editor { } } - private void hideFloatingToolbar() { + void hideFloatingToolbar(int duration) { if (mTextActionMode != null) { mTextView.removeCallbacks(mShowFloatingToolbar); - mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); + mTextActionMode.hide(duration); } } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 33e65214996b..75fc53864101 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -486,7 +486,7 @@ public class RelativeLayout extends ViewGroup { if (targetSdkVersion < Build.VERSION_CODES.KITKAT) { width = Math.max(width, myWidth - params.mLeft); } else { - width = Math.max(width, myWidth - params.mLeft - params.leftMargin); + width = Math.max(width, myWidth - params.mLeft + params.leftMargin); } } else { if (targetSdkVersion < Build.VERSION_CODES.KITKAT) { diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 142412ac8ccb..3f4ce4462ad1 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -68,9 +68,7 @@ final class SelectionActionModeHelper { public void startActionModeAsync(boolean adjustSelection) { cancelAsyncTask(); - if (isNoOpTextClassifier() || !hasSelection()) { - // No need to make an async call for a no-op TextClassifier. - // Do not call the TextClassifier if there is no selection. + if (skipTextClassification()) { startActionMode(null); } else { resetTextClassificationHelper(true /* resetSelectionTag */); @@ -88,9 +86,7 @@ final class SelectionActionModeHelper { public void invalidateActionModeAsync() { cancelAsyncTask(); - if (isNoOpTextClassifier() || !hasSelection()) { - // No need to make an async call for a no-op TextClassifier. - // Do not call the TextClassifier if there is no selection. + if (skipTextClassification()) { invalidateActionMode(null); } else { resetTextClassificationHelper(false /* resetSelectionTag */); @@ -132,13 +128,16 @@ final class SelectionActionModeHelper { mTextClassification = null; } - private boolean isNoOpTextClassifier() { - return mEditor.getTextView().getTextClassifier() == TextClassifier.NO_OP; - } - - private boolean hasSelection() { + private boolean skipTextClassification() { final TextView textView = mEditor.getTextView(); - return textView.getSelectionEnd() > textView.getSelectionStart(); + // No need to make an async call for a no-op TextClassifier. + final boolean noOpTextClassifier = textView.getTextClassifier() == TextClassifier.NO_OP; + // Do not call the TextClassifier if there is no selection. + final boolean noSelection = textView.getSelectionEnd() == textView.getSelectionStart(); + // Do not call the TextClassifier if this is a password field. + final boolean password = textView.hasPasswordTransformationMethod() + || TextView.isPasswordInputType(textView.getInputType()); + return noOpTextClassifier || noSelection || password; } private void startActionMode(@Nullable SelectionResult result) { diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java index 11b7514d6ac8..0cf8faad1c57 100644 --- a/core/java/android/widget/TextInputTimePickerView.java +++ b/core/java/android/widget/TextInputTimePickerView.java @@ -17,6 +17,7 @@ package android.widget; import android.content.Context; +import android.os.LocaleList; import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; @@ -141,6 +142,9 @@ public class TextInputTimePickerView extends RelativeLayout { new InputFilter.LengthFilter(maxCharLength)}); mMinuteEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxCharLength)}); + final LocaleList locales = mContext.getResources().getConfiguration().getLocales(); + mHourEditText.setImeHintLocales(locales); + mMinuteEditText.setImeHintLocales(locales); } boolean validateInput() { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 9a924890fcd7..69edbbba1386 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -374,6 +374,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private static final int KEY_DOWN_HANDLED_BY_KEY_LISTENER = 1; private static final int KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD = 2; + private static final int FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY = 500; + // System wide time for last cut, copy or text changed action. static long sLastCutCopyOrTextChangedTime; @@ -5674,7 +5676,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mTransformation instanceof PasswordTransformationMethod; } - private static boolean isPasswordInputType(int inputType) { + static boolean isPasswordInputType(int inputType) { final int variation = inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION); return variation @@ -11138,6 +11140,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } boolean selectAllText() { + if (mEditor != null) { + // Hide the toolbar before changing the selection to avoid flickering. + mEditor.hideFloatingToolbar(FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY); + } final int length = mText.length(); Selection.setSelection((Spannable) mText, 0, length); return length > 0; diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java index eda63b3da5b7..378826dc1deb 100644 --- a/core/java/com/android/internal/app/ResolverComparator.java +++ b/core/java/com/android/internal/app/ResolverComparator.java @@ -375,8 +375,15 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> { try { int selectedPos = new ArrayList<ComponentName>(mTargetsDict.keySet()) .indexOf(componentName); - logMetrics(selectedPos); - if (selectedPos > 0) { + if (selectedPos >= 0 && mTargets != null) { + final float selectedProbability = getScore(componentName); + int order = 0; + for (ResolverTarget target : mTargets) { + if (target.getSelectProbability() > selectedProbability) { + order++; + } + } + logMetrics(order); mRanker.train(mTargets, selectedPos); } else { if (DEBUG) { diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index 04819a5999eb..2648604291d9 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -51,7 +51,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener private WallpaperColors mLockColors; public ColorExtractor(Context context) { - this(context, new Tonal()); + this(context, new Tonal(context)); } @VisibleForTesting diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java index e78ca3844bed..dbc086c21304 100644 --- a/core/java/com/android/internal/colorextraction/types/Tonal.java +++ b/core/java/com/android/internal/colorextraction/types/Tonal.java @@ -19,15 +19,22 @@ package com.android.internal.colorextraction.types; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WallpaperColors; +import android.content.Context; import android.graphics.Color; import android.util.Log; import android.util.MathUtils; import android.util.Range; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.graphics.ColorUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -49,9 +56,23 @@ public class Tonal implements ExtractionType { public static final int MAIN_COLOR_DARK = 0xff212121; public static final int SECONDARY_COLOR_DARK = 0xff000000; + private final TonalPalette mGreyPalette; + private final ArrayList<TonalPalette> mTonalPalettes; + private final ArrayList<ColorRange> mBlacklistedColors; + // Temporary variable to avoid allocations private float[] mTmpHSL = new float[3]; + public Tonal(Context context) { + + ConfigParser parser = new ConfigParser(context); + mTonalPalettes = parser.getTonalPalettes(); + mBlacklistedColors = parser.getBlacklistedColors(); + + mGreyPalette = mTonalPalettes.get(0); + mTonalPalettes.remove(0); + } + /** * Grab colors from WallpaperColors and set them into GradientColors. * Also applies the default gradient in case extraction fails. @@ -220,7 +241,7 @@ public class Tonal implements ExtractionType { if (DEBUG) { Log.d(TAG, "Gradients: \n\tNormal " + outColorsNormal + "\n\tDark " + outColorsDark - + "\n\tExtra dark: " + outColorsExtraDark); + + "\n\tExtra dark: " + outColorsExtraDark); } return true; @@ -266,7 +287,8 @@ public class Tonal implements ExtractionType { * @return true if color should be avoided */ private boolean isBlacklisted(float[] hsl) { - for (ColorRange badRange: BLACKLISTED_COLORS) { + for (int i = mBlacklistedColors.size() - 1; i >= 0; i--) { + ColorRange badRange = mBlacklistedColors.get(i); if (badRange.containsColor(hsl[0], hsl[1], hsl[2])) { return true; } @@ -322,19 +344,25 @@ public class Tonal implements ExtractionType { return minErrorIndex; } + @VisibleForTesting + public List<ColorRange> getBlacklistedColors() { + return mBlacklistedColors; + } + @Nullable - private static TonalPalette findTonalPalette(float h, float s) { + private TonalPalette findTonalPalette(float h, float s) { // Fallback to a grey palette if the color is too desaturated. // This avoids hue shifts. if (s < 0.05f) { - return GREY_PALETTE; + return mGreyPalette; } TonalPalette best = null; float error = Float.POSITIVE_INFINITY; - for (int i = 0; i < TONAL_PALETTES.length; i++) { - final TonalPalette candidate = TONAL_PALETTES[i]; + final int tonalPalettesCount = mTonalPalettes.size(); + for (int i = 0; i < tonalPalettesCount; i++) { + final TonalPalette candidate = mTonalPalettes.get(i); if (h >= candidate.minHue && h <= candidate.maxHue) { best = candidate; @@ -388,7 +416,6 @@ public class Tonal implements ExtractionType { + Arrays.toString(h) + " s: " + Arrays.toString(s) + " l: " + Arrays.toString(l)); } - this.h = h; this.s = s; this.l = l; @@ -406,430 +433,6 @@ public class Tonal implements ExtractionType { } } - // Data definition of Material Design tonal palettes - // When the sort type is set to TONAL, these palettes are used to find - // a best fit. Each palette is defined as 22 HSL colors - private static final TonalPalette[] TONAL_PALETTES = { - new TonalPalette( - new float[] {1f, 1f, 0.991f, 0.991f, 0.9833333333333333f, 0f, 0f, 0f, - 0.01134380453752181f, 0.015625000000000003f, 0.024193548387096798f, - 0.027397260273972573f, 0.017543859649122865f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 0.8434782608695652f, 1f, 1f, 1f, 1f, - 1f}, - new float[] {0.04f, 0.09f, 0.14f, 0.2f, 0.27450980392156865f, - 0.34901960784313724f, 0.4235294117647059f, 0.5490196078431373f, - 0.6254901960784314f, 0.6862745098039216f, 0.7568627450980392f, - 0.8568627450980393f, 0.9254901960784314f} - ), - new TonalPalette( - new float[] {0.638f, 0.638f, 0.6385767790262171f, 0.6301169590643275f, - 0.6223958333333334f, 0.6151079136690647f, 0.6065400843881856f, - 0.5986964618249534f, 0.5910746812386157f, 0.5833333333333334f, - 0.5748031496062993f, 0.5582010582010583f}, - new float[] {1f, 1f, 1f, 1f, 0.9014084507042253f, 0.8128654970760234f, - 0.7979797979797981f, 0.7816593886462883f, 0.778723404255319f, 1f, 1f, - 1f}, - new float[] {0.05f, 0.12f, 0.17450980392156862f, 0.2235294117647059f, - 0.2784313725490196f, 0.3352941176470588f, 0.388235294117647f, - 0.44901960784313727f, 0.5392156862745098f, 0.6509803921568628f, - 0.7509803921568627f, 0.8764705882352941f} - ), - new TonalPalette( - new float[] {0.563f, 0.569f, 0.5666f, 0.5669934640522876f, 0.5748031496062993f, - 0.5595238095238095f, 0.5473118279569893f, 0.5393258426966292f, - 0.5315955766192734f, 0.524031007751938f, 0.5154711673699016f, - 0.508080808080808f, 0.5f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0.8847736625514403f, 1f, 1f, - 1f}, - new float[] {0.07f, 0.12f, 0.16f, 0.2f, 0.24901960784313726f, - 0.27450980392156865f, 0.30392156862745096f, 0.34901960784313724f, - 0.4137254901960784f, 0.47647058823529415f, 0.5352941176470588f, - 0.6764705882352942f, 0.8f} - ), - new TonalPalette( - new float[] {0.508f, 0.511f, 0.508f, 0.508f, 0.5082304526748972f, - 0.5069444444444444f, 0.5f, 0.5f, 0.5f, 0.48724954462659376f, - 0.4800347222222222f, 0.4755134281200632f, 0.4724409448818897f, - 0.4671052631578947f}, - new float[] {1f, 1f, 1f, 1f, 1f, 0.8888888888888887f, 0.9242424242424242f, 1f, - 1f, 0.8133333333333332f, 0.7868852459016393f, 1f, 1f, 1f}, - new float[] {0.04f, 0.06f, 0.08f, 0.12f, 0.1588235294117647f, - 0.21176470588235297f, 0.25882352941176473f, 0.3f, 0.34901960784313724f, - 0.44117647058823534f, 0.5215686274509804f, 0.5862745098039216f, - 0.7509803921568627f, 0.8509803921568627f} - ), - new TonalPalette( - new float[] {0.333f, 0.333f, 0.333f, 0.3333333333333333f, 0.3333333333333333f, - 0.34006734006734f, 0.34006734006734f, 0.34006734006734f, - 0.34259259259259256f, 0.3475783475783476f, 0.34767025089605735f, - 0.3467741935483871f, 0.3703703703703704f}, - new float[] {0.70f, 0.72f, 0.69f, 0.6703296703296703f, 0.728813559322034f, - 0.5657142857142856f, 0.5076923076923077f, 0.3944223107569721f, - 0.6206896551724138f, 0.8931297709923666f, 1f, 1f, 1f}, - new float[] {0.05f, 0.08f, 0.14f, 0.1784313725490196f, 0.23137254901960785f, - 0.3431372549019608f, 0.38235294117647056f, 0.49215686274509807f, - 0.6588235294117647f, 0.7431372549019608f, 0.8176470588235294f, - 0.8784313725490196f, 0.9294117647058824f} - ), - new TonalPalette( - new float[] {0.161f, 0.163f, 0.163f, 0.162280701754386f, 0.15032679738562088f, - 0.15879265091863518f, 0.16236559139784948f, 0.17443868739205526f, - 0.17824074074074076f, 0.18674698795180725f, 0.18692449355432778f, - 0.1946778711484594f, 0.18604651162790695f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, - new float[] {0.05f, 0.08f, 0.11f, 0.14901960784313725f, 0.2f, - 0.24901960784313726f, 0.30392156862745096f, 0.3784313725490196f, - 0.4235294117647059f, 0.48823529411764705f, 0.6450980392156863f, - 0.7666666666666666f, 0.8313725490196078f} - ), - new TonalPalette( - new float[] {0.108f, 0.105f, 0.105f, 0.105f, 0.10619469026548674f, - 0.11924686192468618f, 0.13046448087431692f, 0.14248366013071895f, - 0.1506024096385542f, 0.16220238095238093f, 0.16666666666666666f, - 0.16666666666666666f, 0.162280701754386f, 0.15686274509803924f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, - new float[] {0.17f, 0.22f, 0.28f, 0.35f, 0.44313725490196076f, - 0.46862745098039216f, 0.47843137254901963f, 0.5f, 0.5117647058823529f, - 0.5607843137254902f, 0.6509803921568628f, 0.7509803921568627f, - 0.8509803921568627f, 0.9f} - ), - new TonalPalette( - new float[] {0.036f, 0.036f, 0.036f, 0.036f, 0.03561253561253561f, - 0.05098039215686275f, 0.07516339869281045f, 0.09477124183006536f, - 0.1150326797385621f, 0.134640522875817f, 0.14640522875816991f, - 0.1582397003745319f, 0.15773809523809523f, 0.15359477124183002f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, - new float[] {0.19f, 0.26f, 0.34f, 0.39f, 0.4588235294117647f, 0.5f, 0.5f, 0.5f, - 0.5f, 0.5f, 0.5f, 0.6509803921568628f, 0.7803921568627451f, 0.9f} - ), - new TonalPalette( - new float[] {0.955f, 0.961f, 0.958f, 0.9596491228070175f, 0.9593837535014005f, - 0.9514767932489452f, 0.943859649122807f, 0.9396825396825397f, - 0.9395424836601307f, 0.9393939393939394f, 0.9362745098039216f, - 0.9754098360655739f, 0.9824561403508771f}, - new float[] {0.87f, 0.85f, 0.85f, 0.84070796460177f, 0.8206896551724138f, - 0.7979797979797981f, 0.7661290322580644f, 0.9051724137931036f, - 1f, 1f, 1f, 1f, 1f}, - new float[] {0.06f, 0.11f, 0.16f, 0.22156862745098038f, 0.2843137254901961f, - 0.388235294117647f, 0.48627450980392156f, 0.5450980392156863f, - 0.6f, 0.6764705882352942f, 0.8f, 0.8803921568627451f, - 0.9254901960784314f} - ), - new TonalPalette( - new float[] {0.866f, 0.855f, 0.841025641025641f, 0.8333333333333334f, - 0.8285256410256411f, 0.821522309711286f, 0.8083333333333333f, - 0.8046594982078853f, 0.8005822416302766f, 0.7842377260981912f, - 0.7771084337349398f, 0.7747747747747749f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, - 0.737142857142857f, 0.6434108527131781f, 0.46835443037974644f}, - new float[] {0.05f, 0.08f, 0.12745098039215685f, 0.15490196078431373f, - 0.20392156862745098f, 0.24901960784313726f, 0.3137254901960784f, - 0.36470588235294116f, 0.44901960784313727f, 0.6568627450980392f, - 0.7470588235294118f, 0.8450980392156863f} - ), - new TonalPalette( - new float[] {0.925f, 0.93f, 0.938f, 0.947f, 0.955952380952381f, - 0.9681069958847737f, 0.9760479041916167f, 0.9873563218390804f, 0f, 0f, - 0.009057971014492771f, 0.026748971193415648f, - 0.041666666666666616f, 0.05303030303030304f}, - new float[] {1f, 1f, 1f, 1f, 1f, 0.8350515463917526f, 0.6929460580912863f, - 0.6387665198237885f, 0.6914893617021276f, 0.7583892617449666f, - 0.8070175438596495f, 0.9310344827586209f, 1f, 1f}, - new float[] {0.10f, 0.13f, 0.17f, 0.2f, 0.27450980392156865f, - 0.3803921568627451f, 0.4725490196078432f, 0.5549019607843138f, - 0.6313725490196078f, 0.707843137254902f, 0.7764705882352941f, - 0.8294117647058823f, 0.9058823529411765f, 0.9568627450980391f} - ), - new TonalPalette( - new float[] {0.733f, 0.736f, 0.744f, 0.7514619883040936f, 0.7679738562091503f, - 0.7802083333333333f, 0.7844311377245509f, 0.796875f, - 0.8165618448637316f, 0.8487179487179487f, 0.8582375478927203f, - 0.8562091503267975f, 0.8666666666666667f}, - new float[] {1f, 1f, 1f, 1f, 1f, 0.8163265306122449f, 0.6653386454183268f, - 0.7547169811320753f, 0.929824561403509f, 0.9558823529411766f, - 0.9560439560439562f, 1f, 1f}, - new float[] {0.07f, 0.12f, 0.17f, 0.2235294117647059f, 0.3f, - 0.38431372549019605f, 0.492156862745098f, 0.5843137254901961f, - 0.6647058823529411f, 0.7333333333333334f, 0.8215686274509804f, 0.9f, - 0.9411764705882353f} - ), - new TonalPalette( - new float[] {0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f, - 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f, - 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f, - 0.6666666666666666f, 0.6666666666666666f}, - new float[] {0.25f, 0.24590163934426232f, 0.17880794701986752f, - 0.14606741573033713f, 0.13761467889908252f, 0.14893617021276592f, - 0.16756756756756758f, 0.20312500000000017f, 0.26086956521739135f, - 0.29999999999999966f, 0.5000000000000004f}, - new float[] {0.18f, 0.2392156862745098f, 0.296078431372549f, - 0.34901960784313724f, 0.4274509803921569f, 0.5392156862745098f, - 0.6372549019607843f, 0.7490196078431373f, 0.8196078431372549f, - 0.8823529411764706f, 0.9372549019607843f} - ), - new TonalPalette( - new float[] {0.938f, 0.944f, 0.952f, 0.961f, 0.9678571428571429f, - 0.9944812362030905f, 0f, 0f, - 0.0047348484848484815f, 0.00316455696202532f, 0f, - 0.9980392156862745f, 0.9814814814814816f, 0.9722222222222221f}, - new float[] {1f, 1f, 1f, 1f, 1f, 0.7023255813953488f, 0.6638655462184874f, - 0.6521739130434782f, 0.7719298245614035f, 0.8315789473684211f, - 0.6867469879518071f, 0.7264957264957265f, 0.8181818181818182f, - 0.8181818181818189f}, - new float[] {0.08f, 0.13f, 0.18f, 0.23f, 0.27450980392156865f, - 0.4215686274509804f, - 0.4666666666666667f, 0.503921568627451f, 0.5529411764705883f, - 0.6274509803921569f, 0.6745098039215687f, 0.7705882352941176f, - 0.892156862745098f, 0.9568627450980391f} - ), - new TonalPalette( - new float[] {0.88f, 0.888f, 0.897f, 0.9052287581699346f, 0.9112021857923498f, - 0.9270152505446624f, 0.9343137254901961f, 0.9391534391534391f, - 0.9437984496124031f, 0.943661971830986f, 0.9438943894389439f, - 0.9426229508196722f, 0.9444444444444444f}, - new float[] {1f, 1f, 1f, 1f, 0.8133333333333332f, 0.7927461139896375f, - 0.7798165137614679f, 0.7777777777777779f, 0.8190476190476191f, - 0.8255813953488372f, 0.8211382113821142f, 0.8133333333333336f, - 0.8000000000000006f}, - new float[] {0.08f, 0.12f, 0.16f, 0.2f, 0.29411764705882354f, - 0.3784313725490196f, 0.42745098039215684f, 0.4764705882352941f, - 0.5882352941176471f, 0.6627450980392157f, 0.7588235294117647f, - 0.8529411764705882f, 0.9411764705882353f} - ), - new TonalPalette( - new float[] {0.669f, 0.680f, 0.6884057971014492f, 0.6974789915966387f, - 0.7079889807162534f, 0.7154471544715447f, 0.7217741935483872f, - 0.7274143302180687f, 0.7272727272727273f, 0.7258064516129031f, - 0.7252252252252251f, 0.7333333333333333f}, - new float[] {0.81f, 0.81f, 0.8214285714285715f, 0.6878612716763006f, - 0.6080402010050251f, 0.5774647887323943f, 0.5391304347826086f, - 0.46724890829694316f, 0.4680851063829788f, 0.462686567164179f, - 0.45679012345678977f, 0.4545454545454551f}, - new float[] {0.12f, 0.16f, 0.2196078431372549f, 0.33921568627450976f, - 0.39019607843137255f, 0.4176470588235294f, 0.45098039215686275f, - 0.5509803921568628f, 0.6313725490196078f, 0.7372549019607844f, - 0.8411764705882353f, 0.9352941176470588f} - ), - new TonalPalette( - new float[] {0.6470588235294118f, 0.6516666666666667f, 0.6464174454828661f, - 0.6441441441441442f, 0.6432748538011696f, 0.6416666666666667f, - 0.6402439024390243f, 0.6412429378531074f, 0.6435185185185186f, - 0.6428571428571429f}, - new float[] {0.8095238095238095f, 0.6578947368421053f, 0.5721925133689839f, - 0.5362318840579711f, 0.5f, 0.4424778761061947f, 0.44086021505376327f, - 0.44360902255639095f, 0.4499999999999997f, 0.4375000000000006f}, - new float[] {0.16470588235294117f, 0.2980392156862745f, 0.36666666666666664f, - 0.40588235294117647f, 0.44705882352941173f, - 0.5568627450980392f, 0.6352941176470588f, 0.7392156862745098f, - 0.8431372549019608f, 0.9372549019607843f} - ), - new TonalPalette( - new float[] {0.469f, 0.46732026143790845f, 0.4718614718614719f, - 0.4793650793650794f, 0.48071625344352614f, 0.4829683698296837f, - 0.484375f, 0.4841269841269842f, 0.48444444444444457f, - 0.48518518518518516f, 0.4907407407407408f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 0.6274509803921569f, 0.41832669322709176f, - 0.41899441340782106f, 0.4128440366972478f, 0.4090909090909088f}, - new float[] {0.07f, 0.1f, 0.15098039215686274f, 0.20588235294117646f, - 0.2372549019607843f, 0.26862745098039215f, 0.4f, 0.5078431372549019f, - 0.6490196078431372f, 0.7862745098039216f, 0.9137254901960784f} - ), - new TonalPalette( - new float[] {0.542f, 0.5444444444444444f, 0.5555555555555556f, - 0.5555555555555556f, 0.553763440860215f, 0.5526315789473684f, - 0.5555555555555556f, 0.5555555555555555f, 0.5555555555555556f, - 0.5512820512820514f, 0.5666666666666667f}, - new float[] {0.25f, 0.24590163934426232f, 0.19148936170212766f, - 0.1791044776119403f, 0.18343195266272191f, 0.18446601941747576f, - 0.1538461538461539f, 0.15625000000000003f, 0.15328467153284678f, - 0.15662650602409653f, 0.151515151515151f}, - new float[] {0.05f, 0.1196078431372549f, 0.1843137254901961f, - 0.2627450980392157f, - 0.33137254901960783f, 0.403921568627451f, 0.5411764705882354f, - 0.6235294117647059f, 0.7313725490196079f, 0.8372549019607843f, - 0.9352941176470588f} - ), - new TonalPalette( - new float[] {0.022222222222222223f, 0.02469135802469136f, 0.031249999999999997f, - 0.03947368421052631f, 0.04166666666666668f, - 0.043650793650793655f, 0.04411764705882352f, 0.04166666666666652f, - 0.04444444444444459f, 0.05555555555555529f}, - new float[] {0.33333333333333337f, 0.2783505154639175f, 0.2580645161290323f, - 0.25675675675675674f, 0.2528735632183908f, 0.17500000000000002f, - 0.15315315315315312f, 0.15189873417721522f, - 0.15789473684210534f, 0.15789473684210542f}, - new float[] {0.08823529411764705f, 0.19019607843137254f, 0.2431372549019608f, - 0.2901960784313725f, 0.3411764705882353f, 0.47058823529411764f, - 0.5647058823529412f, 0.6901960784313725f, 0.8137254901960784f, - 0.9254901960784314f} - ), - new TonalPalette( - new float[] {0.027f, 0.03f, 0.038f, 0.044f, 0.050884955752212385f, - 0.07254901960784313f, 0.0934640522875817f, - 0.10457516339869281f, 0.11699346405228758f, - 0.1255813953488372f, 0.1268939393939394f, 0.12533333333333332f, - 0.12500000000000003f, 0.12777777777777777f}, - new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f}, - new float[] {0.25f, 0.3f, 0.35f, 0.4f, 0.44313725490196076f, 0.5f, 0.5f, 0.5f, - 0.5f, 0.5784313725490196f, - 0.6549019607843137f, 0.7549019607843137f, 0.8509803921568627f, - 0.9411764705882353f} - ) - }; - - private static final TonalPalette GREY_PALETTE = new TonalPalette( - new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, - new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, - new float[]{0.08f, 0.11f, 0.14901960784313725f, 0.2f, 0.2980392156862745f, 0.4f, - 0.4980392156862745f, 0.6196078431372549f, 0.7176470588235294f, - 0.8196078431372549f, 0.9176470588235294f, 0.9490196078431372f} - ); - - @SuppressWarnings("WeakerAccess") - @VisibleForTesting - public static final ColorRange[] BLACKLISTED_COLORS = new ColorRange[] { - - // Red - new ColorRange( - new Range<>(0f, 20f) /* H */, - new Range<>(0.7f, 1f) /* S */, - new Range<>(0.21f, 0.79f)) /* L */, - new ColorRange( - new Range<>(0f, 20f), - new Range<>(0.3f, 0.7f), - new Range<>(0.355f, 0.653f)), - - // Red Orange - new ColorRange( - new Range<>(20f, 40f), - new Range<>(0.7f, 1f), - new Range<>(0.28f, 0.643f)), - new ColorRange( - new Range<>(20f, 40f), - new Range<>(0.3f, 0.7f), - new Range<>(0.414f, 0.561f)), - new ColorRange( - new Range<>(20f, 40f), - new Range<>(0f, 3f), - new Range<>(0.343f, 0.584f)), - - // Orange - new ColorRange( - new Range<>(40f, 60f), - new Range<>(0.7f, 1f), - new Range<>(0.173f, 0.349f)), - new ColorRange( - new Range<>(40f, 60f), - new Range<>(0.3f, 0.7f), - new Range<>(0.233f, 0.427f)), - new ColorRange( - new Range<>(40f, 60f), - new Range<>(0f, 0.3f), - new Range<>(0.231f, 0.484f)), - - // Yellow 60 - new ColorRange( - new Range<>(60f, 80f), - new Range<>(0.7f, 1f), - new Range<>(0.488f, 0.737f)), - new ColorRange( - new Range<>(60f, 80f), - new Range<>(0.3f, 0.7f), - new Range<>(0.673f, 0.837f)), - - // Yellow Green 80 - new ColorRange( - new Range<>(80f, 100f), - new Range<>(0.7f, 1f), - new Range<>(0.469f, 0.61f)), - - // Yellow green 100 - new ColorRange( - new Range<>(100f, 120f), - new Range<>(0.7f, 1f), - new Range<>(0.388f, 0.612f)), - new ColorRange( - new Range<>(100f, 120f), - new Range<>(0.3f, 0.7f), - new Range<>(0.424f, 0.541f)), - - // Green - new ColorRange( - new Range<>(120f, 140f), - new Range<>(0.7f, 1f), - new Range<>(0.375f, 0.52f)), - new ColorRange( - new Range<>(120f, 140f), - new Range<>(0.3f, 0.7f), - new Range<>(0.435f, 0.524f)), - - // Green Blue 140 - new ColorRange( - new Range<>(140f, 160f), - new Range<>(0.7f, 1f), - new Range<>(0.496f, 0.641f)), - - // Seafoam - new ColorRange( - new Range<>(160f, 180f), - new Range<>(0.7f, 1f), - new Range<>(0.496f, 0.567f)), - - // Cyan - new ColorRange( - new Range<>(180f, 200f), - new Range<>(0.7f, 1f), - new Range<>(0.52f, 0.729f)), - - // Blue - new ColorRange( - new Range<>(220f, 240f), - new Range<>(0.7f, 1f), - new Range<>(0.396f, 0.571f)), - new ColorRange( - new Range<>(220f, 240f), - new Range<>(0.3f, 0.7f), - new Range<>(0.425f, 0.551f)), - - // Blue Purple 240 - new ColorRange( - new Range<>(240f, 260f), - new Range<>(0.7f, 1f), - new Range<>(0.418f, 0.639f)), - new ColorRange( - new Range<>(220f, 240f), - new Range<>(0.3f, 0.7f), - new Range<>(0.441f, 0.576f)), - - // Blue Purple 260 - new ColorRange( - new Range<>(260f, 280f), - new Range<>(0.3f, 1f), // Bigger range - new Range<>(0.461f, 0.553f)), - - // Fuchsia - new ColorRange( - new Range<>(300f, 320f), - new Range<>(0.7f, 1f), - new Range<>(0.484f, 0.588f)), - new ColorRange( - new Range<>(300f, 320f), - new Range<>(0.3f, 0.7f), - new Range<>(0.48f, 0.592f)), - - // Pink - new ColorRange( - new Range<>(320f, 340f), - new Range<>(0.7f, 1f), - new Range<>(0.466f, 0.629f)), - - // Soft red - new ColorRange( - new Range<>(340f, 360f), - new Range<>(0.7f, 1f), - new Range<>(0.437f, 0.596f)) - }; - /** * Representation of an HSL color range. * <ul> @@ -874,4 +477,124 @@ public class Tonal implements ExtractionType { return String.format("H: %s, S: %s, L %s", mHue, mSaturation, mLightness); } } -} + + @VisibleForTesting + public static class ConfigParser { + private final ArrayList<TonalPalette> mTonalPalettes; + private final ArrayList<ColorRange> mBlacklistedColors; + + public ConfigParser(Context context) { + mTonalPalettes = new ArrayList<>(); + mBlacklistedColors = new ArrayList<>(); + + // Load all palettes and the blacklist from an XML. + try { + XmlPullParser parser = context.getResources().getXml(R.xml.color_extraction); + int eventType = parser.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_DOCUMENT || + eventType == XmlPullParser.END_TAG) { + // just skip + } else if (eventType == XmlPullParser.START_TAG) { + String tagName = parser.getName(); + if (tagName.equals("palettes")) { + parsePalettes(parser); + } else if (tagName.equals("blacklist")) { + parseBlacklist(parser); + } + } else { + throw new XmlPullParserException("Invalid XML event " + eventType + " - " + + parser.getName(), parser, null); + } + eventType = parser.next(); + } + } catch (XmlPullParserException | IOException e) { + throw new RuntimeException(e); + } + } + + public ArrayList<TonalPalette> getTonalPalettes() { + return mTonalPalettes; + } + + public ArrayList<ColorRange> getBlacklistedColors() { + return mBlacklistedColors; + } + + private void parseBlacklist(XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, null, "blacklist"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // Starts by looking for the entry tag + if (name.equals("range")) { + mBlacklistedColors.add(readRange(parser)); + parser.next(); + } else { + throw new XmlPullParserException("Invalid tag: " + name, parser, null); + } + } + } + + private ColorRange readRange(XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, null, "range"); + float[] h = readFloatArray(parser.getAttributeValue(null, "h")); + float[] s = readFloatArray(parser.getAttributeValue(null, "s")); + float[] l = readFloatArray(parser.getAttributeValue(null, "l")); + + if (h == null || s == null || l == null) { + throw new XmlPullParserException("Incomplete range tag.", parser, null); + } + + return new ColorRange(new Range<>(h[0], h[1]), new Range<>(s[0], s[1]), + new Range<>(l[0], l[1])); + } + + private void parsePalettes(XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, null, "palettes"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // Starts by looking for the entry tag + if (name.equals("palette")) { + mTonalPalettes.add(readPalette(parser)); + parser.next(); + } else { + throw new XmlPullParserException("Invalid tag: " + name); + } + } + } + + private TonalPalette readPalette(XmlPullParser parser) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, null, "palette"); + + float[] h = readFloatArray(parser.getAttributeValue(null, "h")); + float[] s = readFloatArray(parser.getAttributeValue(null, "s")); + float[] l = readFloatArray(parser.getAttributeValue(null, "l")); + + if (h == null || s == null || l == null) { + throw new XmlPullParserException("Incomplete range tag.", parser, null); + } + + return new TonalPalette(h, s, l); + } + + private float[] readFloatArray(String attributeValue) + throws IOException, XmlPullParserException { + String[] tokens = attributeValue.replaceAll(" ", "").replaceAll("\n", "").split(","); + float[] numbers = new float[tokens.length]; + for (int i = 0; i < tokens.length; i++) { + numbers[i] = Float.parseFloat(tokens[i]); + } + return numbers; + } + } +}
\ No newline at end of file diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java index a7fdb27e03b8..dbb6e93de7d4 100644 --- a/core/java/com/android/internal/util/CollectionUtils.java +++ b/core/java/com/android/internal/util/CollectionUtils.java @@ -21,13 +21,16 @@ import static com.android.internal.util.ArrayUtils.isEmpty; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.ArraySet; +import android.util.ExceptionUtils; + +import com.android.internal.util.FunctionalUtils.ThrowingConsumer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.function.Function; +import java.util.function.*; import java.util.stream.Stream; /** @@ -58,6 +61,32 @@ public class CollectionUtils { } /** + * @see #filter(List, java.util.function.Predicate) + */ + public static @NonNull <T> Set<T> filter(@Nullable Set<T> set, + java.util.function.Predicate<? super T> predicate) { + if (set == null || set.size() == 0) return Collections.emptySet(); + ArraySet<T> result = null; + if (set instanceof ArraySet) { + ArraySet<T> arraySet = (ArraySet<T>) set; + int size = arraySet.size(); + for (int i = 0; i < size; i++) { + final T item = arraySet.valueAt(i); + if (predicate.test(item)) { + result = ArrayUtils.add(result, item); + } + } + } else { + for (T item : set) { + if (predicate.test(item)) { + result = ArrayUtils.add(result, item); + } + } + } + return emptyIfNull(result); + } + + /** * Returns a list of items resulting from applying the given function to each element of the * provided list. * @@ -77,6 +106,27 @@ public class CollectionUtils { } /** + * @see #map(List, Function) + */ + public static @NonNull <I, O> Set<O> map(@Nullable Set<I> cur, + Function<? super I, ? extends O> f) { + if (isEmpty(cur)) return Collections.emptySet(); + ArraySet<O> result = new ArraySet<>(); + if (cur instanceof ArraySet) { + ArraySet<I> arraySet = (ArraySet<I>) cur; + int size = arraySet.size(); + for (int i = 0; i < size; i++) { + result.add(f.apply(arraySet.valueAt(i))); + } + } else { + for (I item : cur) { + result.add(f.apply(item)); + } + } + return result; + } + + /** * {@link #map(List, Function)} + {@link #filter(List, java.util.function.Predicate)} * * Calling this is equivalent (but more memory efficient) to: @@ -180,6 +230,17 @@ public class CollectionUtils { } /** + * @see #add(List, Object) + */ + public static @NonNull <T> Set<T> add(@Nullable Set<T> cur, T val) { + if (cur == null || cur == Collections.emptySet()) { + cur = new ArraySet<>(); + } + cur.add(val); + return cur; + } + + /** * Similar to {@link List#remove}, but with support for list values of {@code null} and * {@link Collections#emptyList} */ @@ -192,9 +253,52 @@ public class CollectionUtils { } /** + * @see #remove(List, Object) + */ + public static @NonNull <T> Set<T> remove(@Nullable Set<T> cur, T val) { + if (isEmpty(cur)) { + return emptyIfNull(cur); + } + cur.remove(val); + return cur; + } + + /** * @return a list that will not be affected by mutations to the given original list. */ public static @NonNull <T> List<T> copyOf(@Nullable List<T> cur) { return isEmpty(cur) ? Collections.emptyList() : new ArrayList<>(cur); } + + /** + * @return a list that will not be affected by mutations to the given original list. + */ + public static @NonNull <T> Set<T> copyOf(@Nullable Set<T> cur) { + return isEmpty(cur) ? Collections.emptySet() : new ArraySet<>(cur); + } + + /** + * Applies {@code action} to each element in {@code cur} + * + * This avoids creating an iterator if the given set is an {@link ArraySet} + */ + public static <T> void forEach(@Nullable Set<T> cur, @Nullable ThrowingConsumer<T> action) { + if (cur == null || action == null) return; + int size = cur.size(); + if (size == 0) return; + try { + if (cur instanceof ArraySet) { + ArraySet<T> arraySet = (ArraySet<T>) cur; + for (int i = 0; i < size; i++) { + action.accept(arraySet.valueAt(i)); + } + } else { + for (T t : cur) { + action.accept(t); + } + } + } catch (Exception e) { + throw ExceptionUtils.propagate(e); + } + } } diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java index 9aeb0415b5fc..cdef97e84f62 100644 --- a/core/java/com/android/internal/util/FunctionalUtils.java +++ b/core/java/com/android/internal/util/FunctionalUtils.java @@ -45,4 +45,15 @@ public class FunctionalUtils { public interface ThrowingSupplier<T> { T get() throws Exception; } + + /** + * An equivalent of {@link java.util.function.Consumer} that allows throwing checked exceptions + * + * This can be used to specify a lambda argument without forcing all the checked exceptions + * to be handled within it + */ + @FunctionalInterface + public interface ThrowingConsumer<T> { + void accept(T t) throws Exception; + } } diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java index ff211b6c2d62..497e7b08d881 100644 --- a/core/java/com/android/internal/view/FloatingActionMode.java +++ b/core/java/com/android/internal/view/FloatingActionMode.java @@ -295,6 +295,8 @@ public final class FloatingActionMode extends ActionMode { */ private static final class FloatingToolbarVisibilityHelper { + private static final long MIN_SHOW_DURATION_FOR_MOVE_HIDE = 500; + private final FloatingToolbar mToolbar; private boolean mHideRequested; @@ -304,6 +306,8 @@ public final class FloatingActionMode extends ActionMode { private boolean mActive; + private long mLastShowTime; + public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) { mToolbar = Preconditions.checkNotNull(toolbar); } @@ -327,7 +331,13 @@ public final class FloatingActionMode extends ActionMode { } public void setMoving(boolean moving) { - mMoving = moving; + // Avoid unintended flickering by allowing the toolbar to show long enough before + // triggering the 'moving' flag - which signals a hide. + final boolean showingLongEnough = + System.currentTimeMillis() - mLastShowTime > MIN_SHOW_DURATION_FOR_MOVE_HIDE; + if (!moving || showingLongEnough) { + mMoving = moving; + } } public void setOutOfBounds(boolean outOfBounds) { @@ -347,6 +357,7 @@ public final class FloatingActionMode extends ActionMode { mToolbar.hide(); } else { mToolbar.show(); + mLastShowTime = System.currentTimeMillis(); } } } diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index 2cf58d7ac465..4f9e8a51b9a4 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -143,7 +143,6 @@ public class BootReceiver extends BroadcastReceiver { try { return FileUtils.readTextFile(lastHeaderFile, 0, null); } catch (IOException e) { - Slog.e(TAG, "Error reading " + lastHeaderFile, e); return null; } } diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index b93697398020..3ecbcc37f49b 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -985,6 +985,16 @@ namespace PaintGlue { } } + static jfloat getStrikeThruPosition(jlong paintHandle, jlong typefaceHandle) { + const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize(); + return SkScalarToFloat(Paint::kStdStrikeThru_Top * textSize); + } + + static jfloat getStrikeThruThickness(jlong paintHandle, jlong typefaceHandle) { + const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize(); + return SkScalarToFloat(Paint::kStdStrikeThru_Thickness * textSize); + } + static void setShadowLayer(jlong paintHandle, jfloat radius, jfloat dx, jfloat dy, jint color) { Paint* paint = reinterpret_cast<Paint*>(paintHandle); @@ -1098,6 +1108,8 @@ static const JNINativeMethod methods[] = { {"nDescent","(JJ)F", (void*) PaintGlue::descent}, {"nGetUnderlinePosition","(JJ)F", (void*) PaintGlue::getUnderlinePosition}, {"nGetUnderlineThickness","(JJ)F", (void*) PaintGlue::getUnderlineThickness}, + {"nGetStrikeThruPosition","(JJ)F", (void*) PaintGlue::getStrikeThruPosition}, + {"nGetStrikeThruThickness","(JJ)F", (void*) PaintGlue::getStrikeThruThickness}, {"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer}, {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer} }; diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 16a923098a27..6c2b4609ebc7 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -81,14 +81,27 @@ enum { HEAP_GL, HEAP_OTHER_MEMTRACK, + // Dalvik extra sections (heap). HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, - HEAP_DALVIK_LINEARALLOC, - HEAP_DALVIK_ACCOUNTING, - HEAP_DALVIK_CODE_CACHE, HEAP_DALVIK_ZYGOTE, HEAP_DALVIK_NON_MOVING, - HEAP_DALVIK_INDIRECT_REFERENCE_TABLE, + + // Dalvik other extra sections. + HEAP_DALVIK_OTHER_LINEARALLOC, + HEAP_DALVIK_OTHER_ACCOUNTING, + HEAP_DALVIK_OTHER_CODE_CACHE, + HEAP_DALVIK_OTHER_COMPILER_METADATA, + HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE, + + // Boot vdex / app dex / app vdex + HEAP_DEX_BOOT_VDEX, + HEAP_DEX_APP_DEX, + HEAP_DEX_APP_VDEX, + + // App art, boot art. + HEAP_ART_APP, + HEAP_ART_BOOT, _NUM_HEAP, _NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1, @@ -297,15 +310,30 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_TTF; is_swappable = true; } else if ((nameLen > 4 && strstr(name, ".dex") != NULL) || - (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0) || - (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0)) { + (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0)) { whichHeap = HEAP_DEX; + subHeap = HEAP_DEX_APP_DEX; + is_swappable = true; + } else if (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0) { + whichHeap = HEAP_DEX; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_DEX_BOOT_VDEX; + } else { + subHeap = HEAP_DEX_APP_VDEX; + } is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".oat") == 0) { whichHeap = HEAP_OAT; is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".art") == 0) { whichHeap = HEAP_ART; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_ART_BOOT; + } else { + subHeap = HEAP_ART_APP; + } is_swappable = true; } else if (strncmp(name, "/dev/", 5) == 0) { if (strncmp(name, "/dev/kgsl-3d0", 13) == 0) { @@ -314,7 +342,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) if (strncmp(name, "/dev/ashmem/dalvik-", 19) == 0) { whichHeap = HEAP_DALVIK_OTHER; if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) { - subHeap = HEAP_DALVIK_LINEARALLOC; + subHeap = HEAP_DALVIK_OTHER_LINEARALLOC; } else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) || (strstr(name, "/dev/ashmem/dalvik-main space") == name)) { // This is the regular Dalvik heap. @@ -332,13 +360,14 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_DALVIK; subHeap = HEAP_DALVIK_ZYGOTE; } else if (strstr(name, "/dev/ashmem/dalvik-indirect ref") == name) { - subHeap = HEAP_DALVIK_INDIRECT_REFERENCE_TABLE; + subHeap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE; } else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { - subHeap = HEAP_DALVIK_CODE_CACHE; + strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name) { + subHeap = HEAP_DALVIK_OTHER_CODE_CACHE; + } else if (strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { + subHeap = HEAP_DALVIK_OTHER_COMPILER_METADATA; } else { - subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting. + subHeap = HEAP_DALVIK_OTHER_ACCOUNTING; // Default to accounting. } } else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) { whichHeap = HEAP_CURSOR; @@ -423,7 +452,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) stats[whichHeap].sharedClean += shared_clean; stats[whichHeap].swappedOut += swapped_out; stats[whichHeap].swappedOutPss += swapped_out_pss; - if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER) { + if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER || + whichHeap == HEAP_DEX || whichHeap == HEAP_ART) { stats[subHeap].pss += pss; stats[subHeap].swappablePss += swappable_pss; stats[subHeap].privateDirty += private_dirty; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6e4bcef031bc..3e3585b0508d 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3849,6 +3849,11 @@ <service android:name="com.android.server.PreloadsFileCacheExpirationJobService" android:permission="android.permission.BIND_JOB_SERVICE" > </service> + + <service android:name="com.android.server.camera.CameraStatsJobService" + android:permission="android.permission.BIND_JOB_SERVICE" > + </service> + </application> </manifest> diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png Binary files differindex ddfd5ede5804..5aa4e98dee7e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png Binary files differindex 7ab09d121854..2afba7fb686d 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png Binary files differindex 8cdf2c3901dc..94c696ca2a47 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png Binary files differindex e1721fc8cf61..2bbc0e0091ba 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png Binary files differindex f64d2c700a3a..1554f45e6de1 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png Binary files differindex c312fd89cacd..f7f9bec695e2 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png Binary files differindex 5cb787c0fb89..caf35d090f59 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png Binary files differindex 2e759dfcb37d..428b6cf0026b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png Binary files differindex b4c1b63bdf27..5bba9bb54f99 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png Binary files differindex 53b435de7612..d5623753cc6b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png Binary files differindex 58d81c0ff1b7..a083bd2f3905 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png Binary files differindex 3834afdea9cc..cdd80c8ff876 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png Binary files differindex de0f726bad0b..f38ba5069f05 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png Binary files differindex d8c095dc1db3..92d58870b204 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png Binary files differindex e053b97d00f8..e5fb30641a70 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png Binary files differindex 7feb4ae47b3f..ae625880ca88 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png Binary files differindex caed47b2b644..952eda0c708b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png Binary files differindex b38c2abbc887..d51aa427e59e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png Binary files differindex a1b947f542db..95a696f871e0 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png Binary files differindex b7016fa67dfd..a9435e375f30 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png Binary files differindex f4b22530f011..851168a3ba29 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png Binary files differindex 1d9943f7e6b2..c0e15e9ebff6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png Binary files differindex 685da616a5a3..41a7b9c186b1 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png Binary files differindex 8e34fdcd71d8..8618f96262f7 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png Binary files differindex 3bc67c35e8e6..81488d17c100 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png Binary files differindex 78e3c42a5abd..6b635c994959 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png Binary files differindex bfc42fdb9091..8a7e4fca8498 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png Binary files differindex cbe0c18c0417..6f7d3a23f6e5 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png Binary files differindex 8f68ecbc52f7..fc6caf57d350 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png Binary files differindex 324f74f8aca3..3554271c091d 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png Binary files differindex 9e9435a34a35..6c82a8924bd1 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png Binary files differindex 9558f21326f1..d6daf80223a3 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png Binary files differindex 1b1fe4dd22af..41275f109aa4 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png Binary files differindex db5fbdc06f18..b63b7c3c5a6e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png Binary files differindex 39c5f673c961..403d1b7a8043 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png Binary files differindex a166aaeec9c6..a19aa06bd7a6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png Binary files differnew file mode 100644 index 000000000000..33d4dbf2447b --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png Binary files differindex 243e7aabd8e6..ad89fa1453f6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png Binary files differindex a04df8cdb609..9a970c8801a7 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png Binary files differindex 97eee99969ec..5c7121722b57 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png Binary files differindex 77f13e2227fe..181c8122b140 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png Binary files differindex 62346b452e49..1b285a735957 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png Binary files differnew file mode 100644 index 000000000000..00f1c62cdfea --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png Binary files differindex 7411d2494bb7..f86cca719f59 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png Binary files differindex edd8f35da9af..4e47fc8be440 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png Binary files differindex 3f17c956944f..8b33f2ce3228 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png Binary files differindex 6a4521a1f481..451bda75c08c 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png Binary files differindex 16f6f9cc7862..dedbff18655b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png Binary files differnew file mode 100644 index 000000000000..d6be31c4987a --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png Binary files differindex 15819d89afa3..bfd1900c6e97 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png Binary files differindex 433f7c5f960c..003f13dadc38 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png Binary files differindex 8c925bc1f1ae..55647603c424 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png Binary files differindex b509204c2232..ebc1ae139076 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png Binary files differindex 30cddc6babdf..92a92300b01b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png Binary files differnew file mode 100644 index 000000000000..6f5c84a9749e --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png Binary files differindex 0ff15ea35b66..ba4ab1d0bdb7 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png Binary files differindex 21489b2a0105..f246835f83be 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png Binary files differindex 57df6e14b8b9..04b790baf44e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png Binary files differindex d8821ad06bca..63e0d79b5a11 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png Binary files differindex 8222d289652c..89027f4c9483 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png Binary files differnew file mode 100644 index 000000000000..4b4870b1669b --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png Binary files differindex fe85c1d44857..1dae891a13f2 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png Binary files differindex 1f180adb5bc6..5aa4e98dee7e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png Binary files differindex b27556a1414d..2afba7fb686d 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png Binary files differindex 1235c5dd8b9f..94c696ca2a47 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png Binary files differindex cd60ff412c50..2bbc0e0091ba 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png Binary files differindex 96f3272a57c3..1554f45e6de1 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png Binary files differindex 93b78fc73469..f7f9bec695e2 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png Binary files differindex 5ec23a0e8380..caf35d090f59 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png Binary files differindex ed5bed86a949..4c36c708cd04 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png Binary files differindex 1842d3bf8a0a..5bba9bb54f99 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png Binary files differindex 538d42072118..d5623753cc6b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png Binary files differindex abd8ed3ef468..19b7700e9cdd 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png Binary files differindex 3d5a1738d248..d86fe79d501b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png Binary files differindex 0ad076f5897c..c38e4be2a6c8 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png Binary files differindex 392aa232f49f..4ea1ce3dc56e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png Binary files differindex 6f64e23cbf97..b49e12c1a3de 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png Binary files differindex 92f932c8c364..5ce70642a017 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png Binary files differindex 14a07f05b8e7..ebc0b5003971 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png Binary files differindex 4f2ef7319484..04af4599df46 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png Binary files differindex 4b110fa7afa6..862f22d6ed58 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png Binary files differindex 9162814f1217..9d8f434f61f9 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png Binary files differindex 48631d85965f..099703e06497 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png Binary files differindex 67720fdc0b5c..64637438c4f8 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png Binary files differindex b237c01f69d7..c3808eb3c562 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png Binary files differindex f265ac90fdd1..14215bb84901 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png Binary files differindex 05e81394f2c5..0720a34e1817 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png Binary files differindex d64eba8dbf36..08d94b0367d8 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png Binary files differindex cee235f4f3c3..58bd80badde2 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png Binary files differindex ba6ce2fc3c7d..0c7a1f3f79a9 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png Binary files differindex 38b822a9daf7..1a8c1e6496aa 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png Binary files differindex 4639678da518..10bc6c48f299 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png Binary files differindex 1f180adb5bc6..5aa4e98dee7e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png Binary files differindex 18d83e9731d6..d6daf80223a3 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png Binary files differindex 85b2ca6d6dd7..41275f109aa4 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png Binary files differindex f72387297fe1..b63b7c3c5a6e 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png Binary files differindex aa12de28ee06..403d1b7a8043 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png Binary files differindex 841bcd9084ed..a19aa06bd7a6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png Binary files differindex 0d50319fd31a..33d4dbf2447b 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png Binary files differindex 965a3ad08f47..ad89fa1453f6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png Binary files differindex 9a5a60a60074..9a970c8801a7 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png Binary files differindex 79107fd27eda..5c7121722b57 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png Binary files differindex 712b827d8d35..181c8122b140 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png Binary files differindex 410f684a175f..1b285a735957 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png Binary files differindex d84e60745de1..4a916880be7f 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png Binary files differindex 9f8f46f0a064..4a3bc21e4525 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png Binary files differindex c9e01ba1e354..84d944dbe617 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png Binary files differindex a9a5f08cb7cd..8fe61bc6d499 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png Binary files differindex 2218d2d109b1..d1a99062f9d7 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png Binary files differindex db4ead0eebdd..3de70e3042c6 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png Binary files differindex bbeedbc68f02..a2caa3170b91 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png Binary files differindex c3f5036b16d1..984e0b17bb63 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png Binary files differindex 370e49c6b96d..1a20df84b483 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png Binary files differindex f1ca743d50ef..2ffe3f791c89 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png Binary files differindex 63c14259fac1..87f788062498 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png Binary files differindex d0ee3febfd63..39f1db7838fb 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png Binary files differindex 936d5de72544..e1501fe6c7f5 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png Binary files differindex 703aba97dc80..1ac9df6ca012 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png Binary files differindex 2f0aacb93c34..486225b8586f 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png Binary files differindex f975916eaacb..e2aec2bd8617 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png Binary files differindex a81d8f845ed0..c63ee047ceaf 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png Binary files differindex 6419d9027774..2f92d6173ca8 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png Binary files differindex 801e5f65b6be..9b7c06560480 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png Binary files differindex 18d83e9731d6..d6daf80223a3 100644 --- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png +++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png Binary files differindex c6e2e53e501f..49d353df0ed3 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png Binary files differindex c573cd835ab4..ca1bf45e9205 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png Binary files differindex a2a31f771dd9..69611bc2e463 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png Binary files differindex 9f5561fa4f96..53e0f64ad360 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png Binary files differindex 2067c4401f82..bcf2a18b619d 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png Binary files differindex d32a2fd9aaac..937f5a0ffe1b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png Binary files differindex 6982586266bd..5a5e2d58063b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png Binary files differindex a868a0c3e1e4..82cf33cf9a04 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png Binary files differindex 64fc4946284e..522b331ef5cc 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png Binary files differindex 752155a6834d..23723a38d458 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png Binary files differindex f20c33e012be..313b6d2f54be 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png Binary files differindex 37cb41232af4..cfbc110287f7 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png Binary files differindex fe332bf89090..2b2c628ea382 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png Binary files differindex 62c6cd697e3c..260adcaa5f72 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png Binary files differindex bd7ad0c901e2..cadb1c5d189c 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png Binary files differindex eb30288adf6a..b91e79997231 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png Binary files differindex f6499d7b631b..19edb967ae98 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png Binary files differindex e0e04a3ebe75..e7b20cc3efed 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png Binary files differindex 7b8cb18c5b19..7ea341e3d5a0 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png Binary files differindex 8a11c7a1e4c9..fb8b55627dba 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png Binary files differindex 3525a4b8dde6..91016aaea105 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png Binary files differindex 91fa1cd3ffc2..c51481ac0886 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png Binary files differindex 5743b6b94d6f..80d09e29e5ba 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png Binary files differindex ca095f733034..c4ad65fc9fb8 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png Binary files differindex cfbc6b653c24..060be80bd2c3 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png Binary files differindex 88563fe9e35b..e45e858132a2 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png Binary files differindex 93f8826c80ca..55c3959bceed 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png Binary files differindex c10996c0da1c..9c11d9967c00 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png Binary files differindex c070849046ca..d3c334bb5486 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png Binary files differindex 2dd4589d84d8..a3164c9ef124 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png Binary files differindex 02dd21b3b5d0..b5507604d51d 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png Binary files differindex 46fea5b24aa8..d5efab4ad17a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png Binary files differindex fbca13ed48ae..74d39acf56b7 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png Binary files differindex 71ae1206561e..3775cefae334 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png Binary files differindex 706787056ac0..d960a394b6ff 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png Binary files differindex 6484f4b031da..6101cdf0f80a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png Binary files differnew file mode 100644 index 000000000000..fca6c9678410 --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png Binary files differindex 06f65280fb90..b2bdc468722f 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png Binary files differindex 4c6a2364b788..9d8335e02496 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png Binary files differindex 973675217432..459376589c45 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png Binary files differindex 7b9440861dfa..d740810d1c74 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png Binary files differindex f588e9796400..7b8a7fcb3e0e 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png Binary files differnew file mode 100644 index 000000000000..e5d3c6823e94 --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png Binary files differindex 375d27eb87dd..b264a999b707 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png Binary files differindex 9f52306fc448..0232d72d0526 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png Binary files differindex 4f219e4f3bdd..2aa94bb31334 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png Binary files differindex 6928e4ea7786..693f6c6f1add 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png Binary files differindex 7dab339ac4d3..b7aea5c341b9 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png Binary files differnew file mode 100644 index 000000000000..217cb3de802c --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png Binary files differindex 71f9afa933ee..933f338e1218 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png Binary files differindex c8dba8d5f8f8..a2ced7181060 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png Binary files differindex 5923869dd88b..4303ca429a96 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png Binary files differindex 5c2e9d3246ff..c4d955974968 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png Binary files differindex 74464bab2eb8..a6e278bae2f9 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png Binary files differnew file mode 100644 index 000000000000..19bf6c2f2cef --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png Binary files differindex 73b6e12f5182..c6c2163e12ea 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png Binary files differindex e88bf8bfe64b..fe872389ea4d 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png Binary files differindex c55137084a49..229c489aa539 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png Binary files differindex 82380e5a9ca4..64155d9790a3 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png Binary files differindex aed77cbd7b91..cb4c0ed9e2b2 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png Binary files differnew file mode 100644 index 000000000000..a85c70c92592 --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png Binary files differindex bf8bedf55922..d99afbf72f47 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png Binary files differindex 9ef3ea60d13d..49d353df0ed3 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png Binary files differindex a6bf744b0151..ca1bf45e9205 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png Binary files differindex 0bca0a25b468..69611bc2e463 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png Binary files differindex 2850d0bf2368..53e0f64ad360 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png Binary files differindex 28045ef42ec5..bcf2a18b619d 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png Binary files differindex 148c6844cd1b..937f5a0ffe1b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png Binary files differindex b3f7cf512d25..5a5e2d58063b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png Binary files differindex 1c3976402744..82cf33cf9a04 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png Binary files differindex f7bfb79f7c17..522b331ef5cc 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png Binary files differindex a68989098180..23723a38d458 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png Binary files differindex b86016429c9f..313b6d2f54be 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png Binary files differindex 76ea54c79072..db37fc53790a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png Binary files differindex 44a818abd3ee..79941dce4845 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png Binary files differindex 40a8654019d8..3361fe2ae354 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png Binary files differindex 02c69892d184..5649d0f691e6 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png Binary files differindex 0749100540bb..801b562b80ea 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png Binary files differindex c820e4a50ded..38e14080d3e4 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png Binary files differindex 081f548b4e76..f99797dd73b7 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png Binary files differindex bbdc3c80f858..7048711dbfc1 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png Binary files differindex 1f9653f918e6..6f608047ed3b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png Binary files differindex 2f8bdf513c27..da3a23bf1c67 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png Binary files differindex 1400616f9e3f..4007ed1bd75e 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png Binary files differindex 887e00d05da1..518d2b9ee2a0 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png Binary files differindex 84eab6485b94..d821697d75c7 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png Binary files differindex 6815686a9c13..aa19608164d6 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png Binary files differindex 1cab25914002..81bf08c79316 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png Binary files differindex c5d149a42061..1bb7aecd3a29 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png Binary files differindex 22495c56aab9..864795cf9321 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png Binary files differindex cc60f354c04d..ed07e9fb890c 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png Binary files differindex cff5567c2a7e..a188260090d5 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png Binary files differindex 9ef3ea60d13d..49d353df0ed3 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png Binary files differindex cbcc75a3ce52..d5efab4ad17a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png Binary files differindex 52a5ee8df01f..74d39acf56b7 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png Binary files differindex 528554aea0ed..3775cefae334 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png Binary files differindex 28b0f41f0da4..d960a394b6ff 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png Binary files differindex 772d39e9bbe3..6101cdf0f80a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png Binary files differindex c87eecf948a5..fca6c9678410 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png Binary files differindex d98025442ebc..b2bdc468722f 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png Binary files differindex d38af8e959ac..9d8335e02496 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png Binary files differindex 92087b7dd2df..459376589c45 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png Binary files differindex 5b161a269769..d740810d1c74 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png Binary files differindex 62a925ffd8d3..7b8a7fcb3e0e 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png Binary files differindex 6b8ac608cc9f..aadb0cdc0970 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png Binary files differindex cfcdfaccde33..628e63dd5449 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png Binary files differindex e124d271cbbb..dfc63ae305a1 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png Binary files differindex 98cb9334300f..450ead15d35b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png Binary files differindex d2867c1e237f..64249585037b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png Binary files differindex df22da999d60..c5b7fa4277c0 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png Binary files differindex 376ebf6b6c05..13fcf6f4c2d4 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png Binary files differindex 3178adbb7157..5be9c699e67c 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png Binary files differindex fc9a8e2f47c0..3de2194ddb7a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png Binary files differindex 41768523400e..c40a2cfd3d27 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png Binary files differindex c598e69af1b9..9923ccd371c8 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png Binary files differindex e186799c3e1f..8a000c1872db 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png Binary files differindex 532bfba8a272..3680cede4dfa 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png Binary files differindex b47cf1f4e353..d014f5ea8fcf 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png Binary files differindex 95fed6cacb5d..a8aefdbb3440 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png Binary files differindex 9097ffad545d..4716d66ec97b 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png Binary files differindex cfd8d068e129..fdeaf4f52c03 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png Binary files differindex 2013328caec2..9accc7a8a498 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png Binary files differindex 39d8e5be519f..1f0a327f91ac 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png Binary files differindex cbcc75a3ce52..d5efab4ad17a 100644 --- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png +++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png Binary files differindex 4c54483dc335..0907a1e8b1aa 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png Binary files differindex ea059cfe2490..365d96e4eacf 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png Binary files differindex 3f4d55485306..7191add8b4a9 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png Binary files differindex e6dbf9b752db..fd8a5dff27bc 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png Binary files differindex 6e173ddc466b..9ae573be0ec1 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png Binary files differindex 8ae261f16fc9..a41d549dd0a5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png Binary files differindex 07040a28d6c4..4faef9853ba5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png Binary files differindex 2a35082605bd..337372c10980 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png Binary files differindex dc790f33778a..a78de95cd866 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png Binary files differindex 47c7f7e720bb..74f891287946 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png Binary files differindex 0f21484e26ef..0b868fb92fd2 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png Binary files differindex 89e811ca1065..8c381cc68b3b 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png Binary files differindex 7da883a52a5f..17e40a0b0b5d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png Binary files differindex 928fd3044cb3..5280b2fc15d3 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png Binary files differindex d9718df33f61..dfe29ce64773 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png Binary files differindex 85289ccec47d..663d361b0acc 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png Binary files differindex a36ba095266a..5e2ecdf66307 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png Binary files differindex 234d92f91c9c..8d6c1f243eed 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png Binary files differindex 156a7273f602..4edd1acb0013 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png Binary files differindex 4e9e5ede65e2..af45ea74bb1a 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png Binary files differindex 04162890147f..f0757561d8e0 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png Binary files differindex 01c1798d6770..69bd8775bdca 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png Binary files differindex 9dfb7b3aa254..8c956bb6706e 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png Binary files differindex af378045c750..76bf9ab8d68f 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png Binary files differindex 08a5e4161bd0..1a7f9a13132f 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png Binary files differindex 428e20cf53de..1275eaa508c1 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png Binary files differindex c57b40ce4b4b..c4ed71defa7f 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png Binary files differindex 5c06f4620f0d..03252d77af9c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png Binary files differindex 3eac7d47f93f..ea8ee855796c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png Binary files differindex ac970b00b7f8..b024c4e68eff 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png Binary files differindex df1e54c3f1dd..35516f6d21a4 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png Binary files differindex 495606cc3294..dbd985495bc5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png Binary files differindex b4604c514b38..f0c30b10e79c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png Binary files differindex 72c1f6e0a8b5..f21743b18161 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png Binary files differindex 117c5b5161fd..0b96ae0b6634 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png Binary files differindex e8cbbb8e760e..2e5407ff2a8c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png Binary files differnew file mode 100644 index 000000000000..0beb38973c4d --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png Binary files differindex 35341d712c3a..a41586e5a929 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png Binary files differindex 8f17e37948d3..709f6501f0c7 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png Binary files differindex 93a977f2befd..494a7165c531 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png Binary files differindex 2ebed2a2e54e..9ec48f4ad21d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png Binary files differindex dfa06434a163..f4c22b14cc57 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png Binary files differnew file mode 100644 index 000000000000..6fd600f48d9b --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png Binary files differindex dd2d79a71fee..cfee3e1f927d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png Binary files differindex e9064d5c11c0..cc79904e3fe1 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png Binary files differindex 50cf467af43b..28c7441da0f6 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png Binary files differindex 7be4fba78c30..6c7e53435deb 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png Binary files differindex ba828043995d..e7d20d751b8a 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png Binary files differnew file mode 100644 index 000000000000..ea492d2b76ab --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png Binary files differindex 220cbccacee1..92c6ad85e507 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png Binary files differindex bbb16bacbfde..f666d8930d98 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png Binary files differindex 8f6c739f640e..c2b600de2f5d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png Binary files differindex 9ab0656d14c0..31736aaca08b 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png Binary files differindex 9bea94e33c9b..3032ef0c0134 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png Binary files differnew file mode 100644 index 000000000000..1d5cbc012bb6 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png Binary files differindex baa05f77d6bb..84ebcc3676bf 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png Binary files differindex 35d8280c638b..505aadf7f2d7 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png Binary files differindex 76900eeb2136..3b8c662c91c5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png Binary files differindex 9f86a59d323a..d650c07f749a 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png Binary files differindex f9a6d4c9490f..3caa40d1db15 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png Binary files differnew file mode 100644 index 000000000000..d3f8ea616044 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png Binary files differindex 235e12d83405..b54396c39da7 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png Binary files differindex 1d85b667c57e..0907a1e8b1aa 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png Binary files differindex 856292fc2c64..365d96e4eacf 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png Binary files differindex 68223c3920ca..7191add8b4a9 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png Binary files differindex db58987c1528..fd8a5dff27bc 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png Binary files differindex 668789a28267..9ae573be0ec1 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png Binary files differindex 268879e4f983..a41d549dd0a5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png Binary files differindex 72096a75d093..4faef9853ba5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png Binary files differindex 04cce3d9ae3f..337372c10980 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png Binary files differindex 573e6d6b6f2f..a78de95cd866 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png Binary files differindex 64556a41e7d2..74f891287946 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png Binary files differindex 4a0d428a6a57..0b868fb92fd2 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png Binary files differindex c3ab54bdbb0e..90ca46c80594 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png Binary files differindex b431a09d5806..db0201973d84 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png Binary files differindex 6a0f0af6f26b..ce5ee81a329a 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png Binary files differindex 1c69324cb484..3dcbef6a6079 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png Binary files differindex 7d90e57d7887..7646f1831231 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png Binary files differindex 59a41215084e..c16cac96f868 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png Binary files differindex 2baf7f6325b9..7dbc57cd70fc 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png Binary files differindex 66c61d424b66..39d17e04ae57 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png Binary files differindex 8a77aa513fe0..ad0e12128a7b 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png Binary files differindex 6820b623bd52..30ea5dfd1431 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png Binary files differindex ce4a1c706f44..151a2223dbef 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png Binary files differindex fe765c49c8f2..7d4e66068793 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png Binary files differindex 85897efe18a3..8e26d54bfd85 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png Binary files differindex 7a68cf7edc23..e85f2394349a 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png Binary files differindex bf0a05371016..81f38ac32a5c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png Binary files differindex 5bb46b30e8d1..5a50e6ac56c5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png Binary files differindex cc9cf53b4eea..6069dadd5af2 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png Binary files differindex c98d4e59cc4e..37cc4c6a5549 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png Binary files differindex 43bb757028e4..aff0d4c3ef8d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png Binary files differindex 1d85b667c57e..0907a1e8b1aa 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png Binary files differindex 231aec4f7960..dbd985495bc5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png Binary files differindex e20c2a288f1c..f0c30b10e79c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png Binary files differindex 9c247a68a2c6..f21743b18161 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png Binary files differindex 2a5da5f41cd2..0b96ae0b6634 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png Binary files differindex 31224e178ae0..2e5407ff2a8c 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png Binary files differindex 1a792fbe6bdf..302fafa14873 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png Binary files differindex 9c9190dd0704..a41586e5a929 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png Binary files differindex 07b666c2f334..709f6501f0c7 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png Binary files differindex 8cc43fd28cbd..494a7165c531 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png Binary files differindex 7f8a8017e77b..9ec48f4ad21d 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png Binary files differindex fe321acd8438..f4c22b14cc57 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png Binary files differindex a37741cc0ec0..7d72685f8c65 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png Binary files differindex 395bebd74e60..4c545efd2c01 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png Binary files differindex 746580deb32c..a8e9b007f24b 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png Binary files differindex b279cf2f2ee9..b67140d9e94b 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png Binary files differindex d99a66ec5390..166bdaeb942e 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png Binary files differindex e0232dcc8562..1bda465b4148 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png Binary files differindex de27b754e163..cc8ec51fa963 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png Binary files differindex e2e2c475998b..cf2013c61140 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png Binary files differindex 53cc9a6b540a..daa1ca17c7df 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png Binary files differindex 1b2422c9960e..56355d9bebf7 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png Binary files differindex 8d03f5590565..42657ec39ab4 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png Binary files differindex e938e3a700a2..53e4121c0be6 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png Binary files differindex d3c0395a6313..f6e9ffa00ab9 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png Binary files differindex f8b5ab3e38e1..a313e16015cc 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png Binary files differindex aa935f894c67..40034b6512e0 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png Binary files differindex 7a536897cc12..678f9725eecf 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png Binary files differindex 31cee6454e7c..d2a37073d8b8 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png Binary files differindex 98db967c9629..427c52e3ea4f 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png Binary files differindex 5b05e0f69727..8a4d80759435 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png Binary files differindex 231aec4f7960..dbd985495bc5 100644 --- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png +++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png Binary files differindex 80ffc08bac67..97949c66b112 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png Binary files differindex 5640697ebbb4..3f35bcd9bb15 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png Binary files differindex c1ec38a8477c..0ed20948bca7 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png Binary files differindex 781f4699644d..7fa7f010af2d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png Binary files differindex 9edcb9fd5171..b7e1ea164a96 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png Binary files differindex fe9eee463f11..ff079326e9ad 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png Binary files differindex e5155fef3766..4a7b283bf4ca 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png Binary files differindex e1bf3b8265b6..41c4443cf05c 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png Binary files differindex 4ec553a107f9..461fa4622a0d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png Binary files differindex 67685b48f585..f96d1f010de9 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png Binary files differindex 527dbde5ba0d..87a9b49722d2 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png Binary files differindex 77f9e4657d1d..96b536653900 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png Binary files differindex a0395a157aa7..532a86dd35f7 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png Binary files differindex 26e73070c25e..9f37eb266f02 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png Binary files differindex 632457f7ac37..2437e0e80a01 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png Binary files differindex d80234ad5bad..79bc6ce0d6ed 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png Binary files differindex 4297fefd3227..9dbbe2f712c2 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png Binary files differindex a646b4a621eb..1da48b863b17 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png Binary files differindex fc49b39aaf20..89635820b32a 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png Binary files differindex bfa795ebe0c6..ec4be833f959 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png Binary files differindex 70f49a9fef1c..4658fc3ad101 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png Binary files differindex 7d1d7c7addc5..3ecd6bd1409a 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png Binary files differindex 94692f02f179..565e8deec640 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png Binary files differindex f38d3fb2e861..9c5c607cb7f1 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png Binary files differindex 3bc7ab93ba41..87b84a7c33b9 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png Binary files differindex b644a7787ccd..9e12e5bb7998 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png Binary files differindex 478828349bab..85e8791bdd33 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png Binary files differindex dedfebcf3966..a7bd75d73764 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png Binary files differindex be40ac1d85f9..204f3936ebf6 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png Binary files differindex d4376f501f8e..78f787abcdb1 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png Binary files differindex aca83dacae4e..a2e61c2cb0ab 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png Binary files differindex c3f20e520de0..80d5155c0fbd 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png Binary files differindex 49d5421bb032..8ec05aeee823 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png Binary files differindex 33c3956f3673..42cd13cf7e57 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png Binary files differindex aa349f6d1ed2..f43727f0138e 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png Binary files differindex af6117a417b9..e61a05c074c6 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png Binary files differnew file mode 100644 index 000000000000..8dc5976ad6b7 --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png Binary files differindex e7e8d2a1a98d..ead968ed5d75 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png Binary files differindex 5470a0422450..52aa7d52f033 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png Binary files differindex d73361aa2c9d..58986d450b96 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png Binary files differindex eba4134376d1..42d6c7ce51da 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png Binary files differindex c27f694807ec..e7e0e60d1e05 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png Binary files differnew file mode 100644 index 000000000000..75bd261f2b85 --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png Binary files differindex c60098ef41bc..5207dac42a19 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png Binary files differindex 302614521441..c2f69e79f7bb 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png Binary files differindex 377e026106e0..167f8824bd25 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png Binary files differindex f69791636329..d6a85f2442c0 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png Binary files differindex f5df91c23c78..cb0390dc5681 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png Binary files differnew file mode 100644 index 000000000000..6a65d158f89d --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png Binary files differindex d2b5e76d42e0..8086a55f1cbf 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png Binary files differindex 213f37ecf756..eee4115746c4 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png Binary files differindex 23ba68e1aa39..d214ad1eea50 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png Binary files differindex 58267608f7c9..ac56ac46e1e3 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png Binary files differindex 1f66a8e19453..49af14e70b58 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png Binary files differnew file mode 100644 index 000000000000..5003095b4e97 --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png Binary files differindex af64c3c9725d..62054a0e1146 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png Binary files differindex 8284f706b404..4c83dd483684 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png Binary files differindex 18c513e50df4..a55f8e414735 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png Binary files differindex d6d6b1734b05..81567b7e691b 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png Binary files differindex 89b9d3a0c024..40474754575e 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png Binary files differnew file mode 100644 index 000000000000..23db45a064e8 --- /dev/null +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png Binary files differindex 1ae65d0f27c0..e7d9961a11c0 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png Binary files differindex 9acbd296eb58..97949c66b112 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png Binary files differindex 5de2581409ca..3f35bcd9bb15 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png Binary files differindex 9a566b8b9948..0ed20948bca7 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png Binary files differindex bceaead08e6e..7fa7f010af2d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png Binary files differindex faa78ec6c87b..b7e1ea164a96 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png Binary files differindex 78f84346d052..ff079326e9ad 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png Binary files differindex 7746465ae3d8..4a7b283bf4ca 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png Binary files differindex 1df1530af807..41c4443cf05c 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png Binary files differindex ae9702a85a48..461fa4622a0d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png Binary files differindex f637e79abfea..f96d1f010de9 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png Binary files differindex fa8f06290099..87a9b49722d2 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png Binary files differindex a780ae4a5418..685a340b5216 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png Binary files differindex cb2a15a14e97..b49c30e85173 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png Binary files differindex 7588633e73db..aa92d9ed7952 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png Binary files differindex bbcedcc96148..73d487cc2432 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png Binary files differindex c521567dd69b..f427d0c4a3f9 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png Binary files differindex 6add7d38d16e..8fbaa08778af 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png Binary files differindex e907da57a658..1f0fcd67ee8a 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png Binary files differindex 733af5f15e1c..80c905a91181 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png Binary files differindex cf990dba052c..9b27fa38626f 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png Binary files differindex c025fffb7af4..24f2b75803f6 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png Binary files differindex 443fcd8c334f..f499d0a6fcdb 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png Binary files differindex 5532128118a7..e22ca9bb42a5 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png Binary files differindex 2800b0078e7c..596ca8b67250 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png Binary files differindex 31fd5de8fe38..363a4d647736 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png Binary files differindex 8a7c4f964d6f..10e275bdb90f 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png Binary files differindex f4258ccd4306..aa87c9e5cd9c 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png Binary files differindex 5d87f0c41559..77a2b8f56d4a 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png Binary files differindex 366537e770f9..f6108d95c30d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png Binary files differindex 6326ac5ed0b5..e3a6a20d3376 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png Binary files differindex 9acbd296eb58..fa6dc9aacd49 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png Binary files differindex 5d4273d62d9a..80d5155c0fbd 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png Binary files differindex 4524cb18a4c2..8ec05aeee823 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png Binary files differindex 766caeff3323..42cd13cf7e57 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png Binary files differindex c25cc84d5bfc..f43727f0138e 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png Binary files differindex 8b02b5ab8d95..849638b1ed4f 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png Binary files differindex efc4d557547a..06e21b06a1ec 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png Binary files differindex a504cb515fd2..ead968ed5d75 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png Binary files differindex 093531c90427..52aa7d52f033 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png Binary files differindex f847e1b3fcec..58986d450b96 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png Binary files differindex 35d97efa0b4e..42d6c7ce51da 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png Binary files differindex 140b74b88a13..e7e0e60d1e05 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png Binary files differindex da14c62aa486..933be303500d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png Binary files differindex f7ae5e7944f7..b39230f429cb 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png Binary files differindex 2251e146a62e..01492c44a2e8 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png Binary files differindex 131c64d50896..b56aa16538a7 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png Binary files differindex 92ac75af36d1..bdd3d2c74e0f 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png Binary files differindex 2d8ebc4ec871..b76d5d70f521 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png Binary files differindex 1b804bb7f891..5fb12e763b12 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png Binary files differindex 5457baa5b84b..64fe3c53ec61 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png Binary files differindex 47d5bd4843aa..68fd05155db4 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png Binary files differindex acadb307d5c9..a4fd4cc9a400 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png Binary files differindex f17cb4af83c3..40b02f06c3dc 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png Binary files differindex 3766cb9383c5..fcd6ddb844c8 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png Binary files differindex 307e313b7c1a..cb250dddd69d 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png Binary files differindex 850e96a768d1..43d211921b62 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png Binary files differindex ec3127854ff2..bdcaf69feb71 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png Binary files differindex 56b1c0f1f3cf..3d2bff466008 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png Binary files differindex 47cf5787389a..290e7d906049 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png Binary files differindex a9ffc25fbf6b..6c670fb9068a 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png Binary files differindex 96e450223b84..e93c824660c9 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png Binary files differindex 5d4273d62d9a..80d5155c0fbd 100644 --- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png +++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png Binary files differindex 81af491ff1d6..5561c6275711 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png Binary files differindex 2a003905d215..9eff17e594b4 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png Binary files differindex 87b5f5aa72c8..67923e25999c 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png Binary files differindex 0a0d97f1ae02..1aa0e98965c1 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png Binary files differindex c4f0a3857c1e..7cd549df58c3 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png Binary files differindex e084de37413f..2c14d79181b6 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png Binary files differindex 899c37d6def3..9f061a5331a0 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png Binary files differindex 7ff2f313659b..fe1523086df5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png Binary files differindex 737ff623382f..220a4fed4b64 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png Binary files differindex 5125e4fcc1eb..77aac4cb6daa 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png Binary files differindex 3a7d3b7edad7..bf691881dc3c 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png Binary files differindex 6d05101572d8..22197da7f540 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png Binary files differindex 99f93cfbd9e3..380e9298a0d0 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png Binary files differindex a4a258e820ae..d93a600938bd 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png Binary files differindex 35e58d5ecff6..3709d5fa21d5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png Binary files differindex 4b012b629971..2a5019b59195 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png Binary files differindex eaa8cf4c9969..f75a0720e711 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png Binary files differindex 389637ef9730..c8dcd0da0269 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png Binary files differindex 4e3484ebde31..172775e7db1f 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png Binary files differindex 12c6b8365b31..2f081fd81e9a 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png Binary files differindex a3eb0f11cce9..cb4c55b9deed 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png Binary files differindex 8a98d5fe6282..de155f6ae4ff 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png Binary files differindex 68960384d4ab..2cc028d8b576 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png Binary files differindex 2a0e403c42c9..e848d08f6852 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png Binary files differindex 5043219ceb26..584c2f8c197f 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png Binary files differindex 58b5eeff3923..c9299be66fb6 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png Binary files differindex 553209cc3f2d..8abcbd69ad42 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png Binary files differindex 48a38b52484e..ee53e472e9d7 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png Binary files differindex ead8201da714..b10d23a26c19 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png Binary files differindex cb6a80b68e9b..65a23632c952 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png Binary files differindex b7bcbb9956f9..2b7347282253 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png Binary files differindex 8397f98c3e22..6a656b855186 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png Binary files differindex eb5e3cfa728f..7d3a3b6b3461 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png Binary files differindex 8aaa830b1c85..6b22554baf95 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png Binary files differindex 668df6619dff..0a9245c6db7b 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png Binary files differindex abbe1cecb1ce..f9a7f6c93714 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png Binary files differindex 85a1d17e7c9a..ac396ed23c13 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png Binary files differindex e2beede5b3f4..8c15241d09d5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png Binary files differindex 726bf50a7f56..e6a75e217481 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png Binary files differindex cdf76217c7c8..90280a926217 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png Binary files differindex f69cfd5063f4..d9a4632bb320 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png Binary files differindex 51ba70e447c0..b1ae68b5fdb4 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png Binary files differindex 69e0b671febb..e5cba8f18e14 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png Binary files differindex 8b12a77cb509..611faeb14ba5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png Binary files differindex 95c5074d09c6..dfada4df313f 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png Binary files differindex 26ee16002bac..6118202120e2 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png Binary files differindex a651506de656..60d51994d058 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png Binary files differindex 58978c62b965..ee0b672c5bfd 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png Binary files differindex f5cf8f771a9d..5a97f67416ca 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png Binary files differindex b35afdd19605..9237a7d516fe 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png Binary files differindex 222abf4910bf..4d4c663064bd 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png Binary files differindex c71b11f97483..141f9f6e1f48 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png Binary files differindex b96abd9e371b..2baa531f5cf5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png Binary files differindex 6aedd05ad60a..7a911d5a22cc 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png Binary files differindex 84e5f94f149d..a760b85ff924 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png Binary files differindex 95d38b41889e..5c15a879a9b1 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png Binary files differindex 469001642ce2..36a9f1fe8e17 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png Binary files differindex 60f9f48c72a2..03e8c9f7c2dc 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png Binary files differindex 32bcf2778381..533c69498f6f 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png Binary files differindex 11e51f30e14a..ead60f5e6fef 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png Binary files differindex 43f51fe6f379..0a8534f56507 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png Binary files differindex 8d6d3ddd5e33..fa69ad0a39c2 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png Binary files differindex 81af491ff1d6..5561c6275711 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png Binary files differindex 2a003905d215..9eff17e594b4 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png Binary files differindex 87b5f5aa72c8..67923e25999c 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png Binary files differindex 0a0d97f1ae02..1aa0e98965c1 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png Binary files differindex c4f0a3857c1e..7cd549df58c3 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png Binary files differindex e084de37413f..2c14d79181b6 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png Binary files differindex 899c37d6def3..9f061a5331a0 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png Binary files differindex 7ff2f313659b..fe1523086df5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png Binary files differindex 737ff623382f..220a4fed4b64 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png Binary files differindex 5125e4fcc1eb..77aac4cb6daa 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png Binary files differindex 3a7d3b7edad7..bf691881dc3c 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png Binary files differindex 6369e1f17649..98b04487e0f7 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png Binary files differindex 759be2541134..a92641958a6b 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png Binary files differindex 51e4386b4610..53f6e3ed1d64 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png Binary files differindex d52b63f791d0..4a2d1b1768f2 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png Binary files differindex 8e41ba9a326c..22cce05577c7 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png Binary files differindex c7c63dce5425..d40db2168eb1 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png Binary files differindex 18cefd6d777d..0a95b7ef7c76 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png Binary files differindex 48bb6c96c6ae..08698bde6d28 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png Binary files differindex 11a09139b4e4..698d23ad1793 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png Binary files differindex c1e6b511cb7e..36ed854751e0 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png Binary files differindex afd3b9d98ed5..2c0d9252e8e7 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png Binary files differindex 97e0dab40765..747b90162a90 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png Binary files differindex 483046b3f718..bae86656ce2d 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png Binary files differindex 3c492d9cf2f9..fd7b1a88af81 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png Binary files differindex 4eecaace99ea..03f624e33c5d 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png Binary files differindex ce234e6023fb..d2a06ed167f9 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png Binary files differindex 95f25c32c357..c5b2a165b824 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png Binary files differindex 9f880db049f2..8b045cb1d798 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png Binary files differindex 3a7551e454a1..522ec676aa93 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png Binary files differindex 81af491ff1d6..5561c6275711 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png Binary files differindex 8397f98c3e22..6a656b855186 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png Binary files differindex eb5e3cfa728f..7d3a3b6b3461 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png Binary files differindex 8aaa830b1c85..6b22554baf95 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png Binary files differindex 668df6619dff..0a9245c6db7b 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png Binary files differindex abbe1cecb1ce..f9a7f6c93714 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png Binary files differindex 85a1d17e7c9a..ac396ed23c13 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png Binary files differindex e2beede5b3f4..8c15241d09d5 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png Binary files differindex 726bf50a7f56..e6a75e217481 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png Binary files differindex cdf76217c7c8..90280a926217 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png Binary files differindex f69cfd5063f4..d9a4632bb320 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png Binary files differindex 51ba70e447c0..b1ae68b5fdb4 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png Binary files differindex 9c817429cb4f..e3ce3fd3d3db 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png Binary files differindex 939cd54c195b..42482a45fd5e 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png Binary files differindex 03615c3962d1..ff30f9877138 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png Binary files differindex d9d9374aa0fc..0ddcb5515bad 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png Binary files differindex e81e8c237ebf..46ec435d158f 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png Binary files differindex bfb261aa2e64..d95fd77adacf 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png Binary files differindex 03171d0ef012..f116a1fa1951 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png Binary files differindex d0d97db3c3c6..957db7fc9c97 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png Binary files differindex 3c3e9dd2deba..624ec473b5e8 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png Binary files differindex 4bd347af5789..362fba40c74e 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png Binary files differindex 28f32777ffa5..24032b979b5e 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png Binary files differindex 30beb557beaf..6e4c83c2ea58 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png Binary files differindex df5f1ce9ac08..1d2a09e4b904 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png Binary files differindex 6985c8c68f36..7b05dfaac1ba 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png Binary files differindex 337089888d12..30de74a12996 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png Binary files differindex 6ef6a2c8953d..b08b782f1f09 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png Binary files differindex 60e5ef962209..e52a1aa381a0 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png Binary files differindex 76a675cde09f..2c311f56adaa 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png Binary files differindex c92dcd405017..efdf5fca48bd 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png Binary files differindex 8397f98c3e22..6a656b855186 100644 --- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png +++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png diff --git a/core/res/res/drawable/scrollbar_handle_material.xml b/core/res/res/drawable/scrollbar_handle_material.xml index 33efbbac8690..f020112d1329 100644 --- a/core/res/res/drawable/scrollbar_handle_material.xml +++ b/core/res/res/drawable/scrollbar_handle_material.xml @@ -19,7 +19,4 @@ android:shape="rectangle"> <solid android:color="#84ffffff" /> - <size - android:width="4dp" - android:height="4dp" /> </shape> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 186cbbf3837e..1c1ec2565254 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1509,7 +1509,7 @@ <string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"Koristi prečicu"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> - <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> + <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> <string name="user_switched" msgid="3768006783166984410">"Trenutni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> @@ -1736,7 +1736,7 @@ <string name="user_creation_adding" msgid="4482658054622099197">"Da li dozvoljavate da <xliff:g id="APP">%1$s</xliff:g> kreira novog korisnika za <xliff:g id="ACCOUNT">%2$s</xliff:g> (Korisnik sa ovim nalogom već postoji)?"</string> <string name="language_selection_title" msgid="2680677278159281088">"Dodaj jezik"</string> <string name="country_selection_title" msgid="2954859441620215513">"Izbor regije"</string> - <string name="search_language_hint" msgid="7042102592055108574">"Ukucajte ime jezika"</string> + <string name="search_language_hint" msgid="7042102592055108574">"Upišite ime jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index e8df21f36558..6c5e7e566398 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1296,7 +1296,7 @@ <string name="submit" msgid="1602335572089911941">"Enviar"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string> <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para salir del modo coche."</string> - <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir Internet/Zona Wi-Fi activado"</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string> <string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string> <string name="back_button_label" msgid="2300470004503343439">"Atrás"</string> <string name="next_button_label" msgid="1080555104677992408">"Siguiente"</string> @@ -1383,7 +1383,7 @@ <string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móviles superado"</string> <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string> <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Límite superado en <xliff:g id="SIZE">%s</xliff:g>"</string> - <string name="data_usage_restricted_title" msgid="5965157361036321914">"Conexiones automáticas restringidas"</string> + <string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos en segundo plano restringidos"</string> <string name="data_usage_restricted_body" msgid="469866376337242726">"Toca para quitar la restricción."</string> <string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguridad"</string> <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado es válido."</string> @@ -1618,7 +1618,7 @@ <string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string> <string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string> <string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el administrador"</string> - <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string> + <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string> <string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 36922d985056..b5234a8e3154 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1770,8 +1770,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Ebakuatu kostaldeak eta ibaialdeak berehala eta joan toki seguru batera, adibidez, toki garai batera."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ez larritu eta bilatu babesleku bat inguruan."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Larrialdi-mezuen proba"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Erantzun"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Ez da onartzen SIM txartela"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Ez dago SIM txartelik"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index a39bc3ff5b4e..c6881825bfe1 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1769,8 +1769,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Évacuez immédiatement les zones côtières et les rives des fleuves, et réfugiez-vous dans un endroit plus sécuritaire, comme un terrain surélevé."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Restez calme et cherchez un abri à proximité."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Test de messages d\'urgence"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Répondre"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Carte SIM non autorisée"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Carte SIM non configurée"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 728de0546f1d..a5c9b0f9c4fb 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1420,7 +1420,7 @@ <string name="media_route_button_content_description" msgid="591703006349356016">"Caster"</string> <string name="media_route_chooser_title" msgid="1751618554539087622">"Connexion à l\'appareil"</string> <string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Caster l\'écran sur l\'appareil"</string> - <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils en cours…"</string> + <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils…"</string> <string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Paramètres"</string> <string name="media_route_controller_disconnect" msgid="8966120286374158649">"Déconnecter"</string> <string name="media_route_status_scanning" msgid="7279908761758293783">"Analyse en cours..."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 09104db004e4..8db169b0276e 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1770,8 +1770,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Abandona de inmediato rexións costeiras e situadas na beira de ríos para dirixirte a un lugar máis seguro, como un terreo elevado."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Mantén a calma e busca refuxio cerca."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Proba de mensaxes de emerxencia"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Responder"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Non se admite a tarxeta SIM"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Non se introduciu ningunha tarxeta SIM"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index f0732d41fd37..bffede48084f 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -837,7 +837,7 @@ <string name="save_password_remember" msgid="6491879678996749466">"याद रखें"</string> <string name="save_password_never" msgid="8274330296785855105">"कभी नहीं"</string> <string name="open_permission_deny" msgid="7374036708316629800">"आपके पास इस पेज को खोलने की अनुमति नहीं है."</string> - <string name="text_copied" msgid="4985729524670131385">"लेख की क्लिपबोर्ड पर प्रतिलिपि बनाई गई."</string> + <string name="text_copied" msgid="4985729524670131385">"लेख को क्लिपबोर्ड पर कॉपी किया गया."</string> <string name="more_item_label" msgid="4650918923083320495">"अधिक"</string> <string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनू+"</string> <string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string> @@ -954,12 +954,12 @@ <string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll" msgid="6876518925844129331">"सभी को चुनें"</string> <string name="cut" msgid="3092569408438626261">"काटें"</string> - <string name="copy" msgid="2681946229533511987">"प्रतिलिपि बनाएं"</string> + <string name="copy" msgid="2681946229533511987">"कॉपी करें"</string> <string name="paste" msgid="5629880836805036433">"चिपकाएं"</string> <string name="paste_as_plain_text" msgid="5427792741908010675">"सादे पाठ के रूप में चिपकाएं"</string> <string name="replace" msgid="5781686059063148930">"बदलें•"</string> <string name="delete" msgid="6098684844021697789">"हटाएं"</string> - <string name="copyUrl" msgid="2538211579596067402">"URL की प्रतिलिपि बनाएं"</string> + <string name="copyUrl" msgid="2538211579596067402">"URL को कॉपी करें"</string> <string name="selectTextMode" msgid="1018691815143165326">"लेख को चुनें"</string> <string name="undo" msgid="7905788502491742328">"वापस लाएं"</string> <string name="redo" msgid="7759464876566803888">"फिर से करें"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 5b741ca5fb21..7cf7507e9100 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -567,8 +567,8 @@ <string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Կարգավորել, որ սարքի համընդհանուր պրոքսի-սերվերն օգտագործվի, երբ քաղաքականությունը միացված է: Միայն սարքի սեփականատերը կարող է կարգավորել համընդհանուր պրոքսի-սերվերը:"</string> <string name="policylab_expirePassword" msgid="5610055012328825874">"Նշել էկր կողպ գաղտնաբ սպառումը"</string> <string name="policydesc_expirePassword" msgid="5367525762204416046">"Փոխել էկրանի կողպման գաղտնաբառի, PIN-ի կամ նախշի փոփոխման հաճախականությունը:"</string> - <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի կոդավորումը"</string> - <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն կոդավորված:"</string> + <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի գաղտնագրումը"</string> + <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն գաղտնագրված:"</string> <string name="policylab_disableCamera" msgid="6395301023152297826">"Կասեցնել տեսախցիկները"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"Կանխել բոլոր սարքերի ֆոտոխցիկների օգտագործումը:"</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Անջատել կողպման գործառույթները"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 938b03aac6fd..426442c0734c 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1837,8 +1837,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"הישאר רגוע וחפש מחסה בקרבת מקום."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"בדיקה של הודעות חירום"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"השב"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"כרטיס ה-SIM לא מורשה"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"כרטיס ה-SIM לא מזוהה"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index affd2874990d..52d5b0b4b8cf 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1769,8 +1769,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"ອົບພະຍົບອອກຈາກເຂດຊາຍຝັ່ງທະເລ ແລະ ບໍລິເວນແມ່ນ້ຳໄປບ່ອນທີ່ປອດໄພກວ່າ ເຊັ່ນ: ບ່ອນສູງ ໂດຍທັນທີ."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"ໃຈເຢັນໆ ແລະ ຊອກຫາບ່ອນພັກຢູ່ໃກ້ໆ."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"ທົດສອບຂໍ້ຄວາມສຸກເສີນ"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"ຕອບກັບ"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ SIM"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ບໍ່ມີການນຳໃຊ້ SIM"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 48baf056fa3b..ac24366aadc1 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1837,8 +1837,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Takoj se umaknite z obalnih območij in bregov rek na varnejše mesto, na primer na višje ležeča mesta."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ostanite mirni in poiščite zavetje v bližini."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Preskus sporočil v sili"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Odgovor"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"Kartica SIM ni dovoljena"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Kartica SIM ni omogočena za uporabo"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index aa6356248b73..48c714b64658 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1769,8 +1769,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Kıyı kesimlerini ve nehir kenarlarını hemen boşaltarak yüksek yerler gibi daha güvenli bölgelere gidin."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Sakin olun ve yakınlarda sığınabileceğiniz bir yer bulun."</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"Acil durum mesajları testi"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Yanıtla"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"SIM\'e izin verilmiyor"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM için temel hazırlık yapılmadı"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 0a39be07eb22..dc0395adf6dd 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -999,7 +999,7 @@ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"使用%1$s分享"</string> <string name="whichSendApplicationLabel" msgid="4579076294675975354">"分享"</string> <string name="whichSendToApplication" msgid="8272422260066642057">"通过以下应用发送"</string> - <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过1$s发送"</string> + <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过%1$s发送"</string> <string name="whichSendToApplicationLabel" msgid="8878962419005813500">"发送"</string> <string name="whichHomeApplication" msgid="4307587691506919691">"选择主屏幕应用"</string> <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"将“%1$s”设为主屏幕应用"</string> @@ -1769,8 +1769,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"请立即从沿海和河滨区域撤离到高地等较安全的地方。"</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"请保持冷静,并寻找附近的避难地点。"</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"紧急消息测试"</string> - <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) --> - <skip /> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"回复"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="7729819349669603406">"不受允许的 SIM 卡"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"未配置的 SIM 卡"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 10ffa5d74df7..ceb7ccdca190 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1990,6 +1990,10 @@ <!-- Amount of time in ms the user needs to press the relevant key to bring up the global actions dialog --> <integer name="config_globalActionsKeyTimeout">500</integer> + <!-- Default width of a vertical scrollbar and height of a horizontal scrollbar. + Takes effect only if the scrollbar drawables have no intrinsic size. --> + <dimen name="config_scrollbarSize">4dp</dimen> + <!-- Distance that should be scrolled, per axis value, in response to a horizontal {@link MotionEvent#ACTION_SCROLL} event. --> <dimen name="config_horizontalScrollFactor">64dp</dimen> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 18e8af7836d2..8c26db43fc41 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -20,23 +20,13 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Suffix added to a number to signify size in bytes. --> <string name="byteShort">B</string> - <!-- Suffix added to a number to signify size in kilobytes (1000 bytes). - If you retain the Latin script for the localization, please use the lowercase - 'k', as it signifies 1000 bytes as opposed to 1024 bytes. --> - <string name="kilobyteShort">kB</string> - <!-- Suffix added to a number to signify size in megabytes. --> - <string name="megabyteShort">MB</string> - <!-- Suffix added to a number to signify size in gigabytes. --> - <string name="gigabyteShort">GB</string> - <!-- Suffix added to a number to signify size in terabytes. --> - <string name="terabyteShort">TB</string> <!-- Suffix added to a number to signify size in petabytes. --> <string name="petabyteShort">PB</string> - <!-- Format string used to add a suffix like "kB" or "MB" to a number - to display a size in kilobytes, megabytes, or other size units. - Some languages (like French) will want to add a space between - the placeholders. --> - <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="MB">%2$s</xliff:g></string> + <!-- Format string used to add a suffix like "B" or "PB" to a number + to display a size in bytes or petabytes. + Some languages may want to remove the space between the placeholders + or replace it with a non-breaking space. --> + <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="B">%2$s</xliff:g></string> <!-- Used in Contacts for a field that has no label and in Note Pad for a note with no name. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 8a7d8e3e8293..beab29aff1c5 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -451,6 +451,7 @@ <java-symbol type="dimen" name="config_viewConfigurationTouchSlop" /> <java-symbol type="dimen" name="config_viewMinFlingVelocity" /> <java-symbol type="dimen" name="config_viewMaxFlingVelocity" /> + <java-symbol type="dimen" name="config_scrollbarSize" /> <java-symbol type="dimen" name="config_horizontalScrollFactor" /> <java-symbol type="dimen" name="config_verticalScrollFactor" /> <java-symbol type="dimen" name="config_scrollFactor" /> @@ -677,7 +678,6 @@ <java-symbol type="string" name="fileSizeSuffix" /> <java-symbol type="string" name="force_close" /> <java-symbol type="string" name="gadget_host_error_inflating" /> - <java-symbol type="string" name="gigabyteShort" /> <java-symbol type="string" name="gpsNotifMessage" /> <java-symbol type="string" name="gpsNotifTicker" /> <java-symbol type="string" name="gpsNotifTitle" /> @@ -733,7 +733,6 @@ <java-symbol type="string" name="keyboardview_keycode_enter" /> <java-symbol type="string" name="keyboardview_keycode_mode_change" /> <java-symbol type="string" name="keyboardview_keycode_shift" /> - <java-symbol type="string" name="kilobyteShort" /> <java-symbol type="string" name="last_month" /> <java-symbol type="string" name="launchBrowserDefault" /> <java-symbol type="string" name="lock_to_app_toast" /> @@ -754,7 +753,6 @@ <java-symbol type="string" name="lockscreen_emergency_call" /> <java-symbol type="string" name="lockscreen_return_to_call" /> <java-symbol type="string" name="low_memory" /> - <java-symbol type="string" name="megabyteShort" /> <java-symbol type="string" name="midnight" /> <java-symbol type="string" name="mismatchPin" /> <java-symbol type="string" name="mmiComplete" /> @@ -957,7 +955,6 @@ <java-symbol type="string" name="sync_really_delete" /> <java-symbol type="string" name="sync_too_many_deletes_desc" /> <java-symbol type="string" name="sync_undo_deletes" /> - <java-symbol type="string" name="terabyteShort" /> <java-symbol type="string" name="text_copied" /> <java-symbol type="string" name="time_of_day" /> <java-symbol type="string" name="time_picker_decrement_hour_button" /> @@ -1472,6 +1469,7 @@ <java-symbol type="xml" name="global_keys" /> <java-symbol type="xml" name="default_zen_mode_config" /> <java-symbol type="xml" name="sms_7bit_translation_table" /> + <java-symbol type="xml" name="color_extraction" /> <java-symbol type="raw" name="color_fade_vert" /> <java-symbol type="raw" name="color_fade_frag" /> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index 86abe9782c09..9dafa7a02849 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -214,7 +214,7 @@ please see themes_device_defaults.xml. <!-- Scrollbar attributes --> <item name="scrollbarFadeDuration">250</item> <item name="scrollbarDefaultDelayBeforeFade">400</item> - <item name="scrollbarSize">10dp</item> + <item name="scrollbarSize">@dimen/config_scrollbarSize</item> <item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item> <item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item> <item name="scrollbarTrackHorizontal">@null</item> @@ -582,7 +582,7 @@ please see themes_device_defaults.xml. <!-- Scrollbar attributes --> <item name="scrollbarFadeDuration">250</item> <item name="scrollbarDefaultDelayBeforeFade">400</item> - <item name="scrollbarSize">10dp</item> + <item name="scrollbarSize">@dimen/config_scrollbarSize</item> <item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item> <item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item> <item name="scrollbarTrackHorizontal">@null</item> diff --git a/core/res/res/xml/color_extraction.xml b/core/res/res/xml/color_extraction.xml new file mode 100644 index 000000000000..7d52b20f7614 --- /dev/null +++ b/core/res/res/xml/color_extraction.xml @@ -0,0 +1,348 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2017 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<colorextraction> + <!-- List of material color palettes in HSL --> + <palettes> + <!-- Grey scale --> + <palette h="0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f" + s="0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f" + l="0.08f, 0.11f, 0.14901960784313725f, 0.2f, 0.2980392156862745f, 0.4f, + 0.4980392156862745f, 0.6196078431372549f, 0.7176470588235294f, + 0.8196078431372549f, 0.9176470588235294f, 0.9490196078431372f"/> + <!-- All colors --> + <palette h="1,1,0.991,0.991,0.9833333333333333,0,0,0, + 0.01134380453752181,0.015625000000000003,0.024193548387096798, + 0.027397260273972573,0.017543859649122865" + s="1,1,1,1,1,1,1,0.8434782608695652,1,1,1,1,1" + l="0.04,0.09,0.14,0.2,0.27450980392156865, + 0.34901960784313724,0.4235294117647059,0.5490196078431373, + 0.6254901960784314,0.6862745098039216,0.7568627450980392, + 0.8568627450980393,0.9254901960784314"/> + <palette h="0.638,0.638,0.6385767790262171,0.6301169590643275, + 0.6223958333333334,0.6151079136690647,0.6065400843881856, + 0.5986964618249534,0.5910746812386157,0.5833333333333334, + 0.5748031496062993,0.5582010582010583" + s="1,1,1,1,0.9014084507042253,0.8128654970760234, + 0.7979797979797981,0.7816593886462883,0.778723404255319,1,1,1" + l="0.05,0.12,0.17450980392156862,0.2235294117647059, + 0.2784313725490196,0.3352941176470588,0.388235294117647, + 0.44901960784313727,0.5392156862745098,0.6509803921568628, + 0.7509803921568627,0.8764705882352941"/> + <palette h="0.563,0.569,0.5666,0.5669934640522876,0.5748031496062993, + 0.5595238095238095,0.5473118279569893,0.5393258426966292, + 0.5315955766192734,0.524031007751938,0.5154711673699016, + 0.508080808080808,0.5" + s="1,1,1,1,1,1,1,1,1,0.8847736625514403,1,1,1" + l="0.07,0.12,0.16,0.2,0.24901960784313726, + 0.27450980392156865,0.30392156862745096,0.34901960784313724, + 0.4137254901960784,0.47647058823529415,0.5352941176470588, + 0.6764705882352942,0.8"/> + <palette h="0.508,0.511,0.508,0.508,0.5082304526748972, + 0.5069444444444444,0.5,0.5,0.5,0.48724954462659376, + 0.4800347222222222,0.4755134281200632,0.4724409448818897, + 0.4671052631578947" + s="1,1,1,1,1,0.8888888888888887,0.9242424242424242,1, + 1,0.8133333333333332,0.7868852459016393,1,1,1" + l="0.04,0.06,0.08,0.12,0.1588235294117647, + 0.21176470588235297,0.25882352941176473,0.3,0.34901960784313724, + 0.44117647058823534,0.5215686274509804,0.5862745098039216, + 0.7509803921568627,0.8509803921568627"/> + <palette h="0.333,0.333,0.333,0.3333333333333333,0.3333333333333333, + 0.34006734006734,0.34006734006734,0.34006734006734, + 0.34259259259259256,0.3475783475783476,0.34767025089605735, + 0.3467741935483871,0.3703703703703704" + s="0.70,0.72,0.69,0.6703296703296703,0.728813559322034, + 0.5657142857142856,0.5076923076923077,0.3944223107569721, + 0.6206896551724138,0.8931297709923666,1,1,1" + l="0.05,0.08,0.14,0.1784313725490196,0.23137254901960785, + 0.3431372549019608,0.38235294117647056,0.49215686274509807, + 0.6588235294117647,0.7431372549019608,0.8176470588235294, + 0.8784313725490196,0.9294117647058824"/> + <palette h="0.161,0.163,0.163,0.162280701754386,0.15032679738562088, + 0.15879265091863518,0.16236559139784948,0.17443868739205526, + 0.17824074074074076,0.18674698795180725,0.18692449355432778, + 0.1946778711484594,0.18604651162790695" + s="1,1,1,1,1,1,1,1,1,1,1,1,1" + l="0.05,0.08,0.11,0.14901960784313725,0.2, + 0.24901960784313726,0.30392156862745096,0.3784313725490196, + 0.4235294117647059,0.48823529411764705,0.6450980392156863, + 0.7666666666666666,0.8313725490196078"/> + <palette h="0.108,0.105,0.105,0.105,0.10619469026548674, + 0.11924686192468618,0.13046448087431692,0.14248366013071895, + 0.1506024096385542,0.16220238095238093,0.16666666666666666, + 0.16666666666666666,0.162280701754386,0.15686274509803924" + s="1,1,1,1,1,1,1,1,1,1,1,1,1,1" + l="0.17,0.22,0.28,0.35,0.44313725490196076, + 0.46862745098039216,0.47843137254901963,0.5,0.5117647058823529, + 0.5607843137254902,0.6509803921568628,0.7509803921568627, + 0.8509803921568627,0.9"/> + <palette h="0.036,0.036,0.036,0.036,0.03561253561253561, + 0.05098039215686275,0.07516339869281045,0.09477124183006536, + 0.1150326797385621,0.134640522875817,0.14640522875816991, + 0.1582397003745319,0.15773809523809523,0.15359477124183002" + s="1,1,1,1,1,1,1,1,1,1,1,1,1,1" + l="0.19,0.26,0.34,0.39,0.4588235294117647,0.5,0.5,0.5, + 0.5,0.5,0.5,0.6509803921568628,0.7803921568627451,0.9"/> + <palette h="0.955,0.961,0.958,0.9596491228070175,0.9593837535014005, + 0.9514767932489452,0.943859649122807,0.9396825396825397, + 0.9395424836601307,0.9393939393939394,0.9362745098039216, + 0.9754098360655739,0.9824561403508771" + s="0.87,0.85,0.85,0.84070796460177,0.8206896551724138, + 0.7979797979797981,0.7661290322580644,0.9051724137931036, + 1,1,1,1,1" + l="0.06,0.11,0.16,0.22156862745098038,0.2843137254901961, + 0.388235294117647,0.48627450980392156,0.5450980392156863, + 0.6,0.6764705882352942,0.8,0.8803921568627451, + 0.9254901960784314"/> + <palette h="0.866,0.855,0.841025641025641,0.8333333333333334, + 0.8285256410256411,0.821522309711286,0.8083333333333333, + 0.8046594982078853,0.8005822416302766,0.7842377260981912, + 0.7771084337349398,0.7747747747747749" + s="1,1,1,1,1,1,1,1,1, + 0.737142857142857,0.6434108527131781,0.46835443037974644" + l="0.05,0.08,0.12745098039215685,0.15490196078431373, + 0.20392156862745098,0.24901960784313726,0.3137254901960784, + 0.36470588235294116,0.44901960784313727,0.6568627450980392, + 0.7470588235294118,0.8450980392156863"/> + <palette h="0.925,0.93,0.938,0.947,0.955952380952381, + 0.9681069958847737,0.9760479041916167,0.9873563218390804,0,0, + 0.009057971014492771,0.026748971193415648, + 0.041666666666666616,0.05303030303030304" + s="1,1,1,1,1,0.8350515463917526,0.6929460580912863, + 0.6387665198237885,0.6914893617021276,0.7583892617449666, + 0.8070175438596495,0.9310344827586209,1,1" + l="0.10,0.13,0.17,0.2,0.27450980392156865, + 0.3803921568627451,0.4725490196078432,0.5549019607843138, + 0.6313725490196078,0.707843137254902,0.7764705882352941, + 0.8294117647058823,0.9058823529411765,0.9568627450980391"/> + <palette h="0.733,0.736,0.744,0.7514619883040936,0.7679738562091503, + 0.7802083333333333,0.7844311377245509,0.796875, + 0.8165618448637316,0.8487179487179487,0.8582375478927203, + 0.8562091503267975,0.8666666666666667" + s="1,1,1,1,1,0.8163265306122449,0.6653386454183268, + 0.7547169811320753,0.929824561403509,0.9558823529411766, + 0.9560439560439562,1,1" + l="0.07,0.12,0.17,0.2235294117647059,0.3, + 0.38431372549019605,0.492156862745098,0.5843137254901961, + 0.6647058823529411,0.7333333333333334,0.8215686274509804,0.9, + 0.9411764705882353"/> + <palette h="0.6666666666666666,0.6666666666666666,0.6666666666666666, + 0.6666666666666666,0.6666666666666666,0.6666666666666666, + 0.6666666666666666,0.6666666666666666,0.6666666666666666, + 0.6666666666666666,0.6666666666666666" + s="0.25,0.24590163934426232,0.17880794701986752, + 0.14606741573033713,0.13761467889908252,0.14893617021276592, + 0.16756756756756758,0.20312500000000017,0.26086956521739135, + 0.29999999999999966,0.5000000000000004" + l="0.18,0.2392156862745098,0.296078431372549, + 0.34901960784313724,0.4274509803921569,0.5392156862745098, + 0.6372549019607843,0.7490196078431373,0.8196078431372549, + 0.8823529411764706,0.9372549019607843"/> + <palette h="0.938,0.944,0.952,0.961,0.9678571428571429, + 0.9944812362030905,0,0, + 0.0047348484848484815,0.00316455696202532,0, + 0.9980392156862745,0.9814814814814816,0.9722222222222221" + s="1,1,1,1,1,0.7023255813953488,0.6638655462184874, + 0.6521739130434782,0.7719298245614035,0.8315789473684211, + 0.6867469879518071,0.7264957264957265,0.8181818181818182, + 0.8181818181818189" + l="0.08,0.13,0.18,0.23,0.27450980392156865, + 0.4215686274509804, + 0.4666666666666667,0.503921568627451,0.5529411764705883, + 0.6274509803921569,0.6745098039215687,0.7705882352941176, + 0.892156862745098,0.9568627450980391"/> + <palette h="0.88,0.888,0.897,0.9052287581699346,0.9112021857923498, + 0.9270152505446624,0.9343137254901961,0.9391534391534391, + 0.9437984496124031,0.943661971830986,0.9438943894389439, + 0.9426229508196722,0.9444444444444444" + s="1,1,1,1,0.8133333333333332,0.7927461139896375, + 0.7798165137614679,0.7777777777777779,0.8190476190476191, + 0.8255813953488372,0.8211382113821142,0.8133333333333336, + 0.8000000000000006" + l="0.08,0.12,0.16,0.2,0.29411764705882354, + 0.3784313725490196,0.42745098039215684,0.4764705882352941, + 0.5882352941176471,0.6627450980392157,0.7588235294117647, + 0.8529411764705882,0.9411764705882353"/> + <palette h="0.669,0.680,0.6884057971014492,0.6974789915966387, + 0.7079889807162534,0.7154471544715447,0.7217741935483872, + 0.7274143302180687,0.7272727272727273,0.7258064516129031, + 0.7252252252252251,0.7333333333333333" + s="0.81,0.81,0.8214285714285715,0.6878612716763006, + 0.6080402010050251,0.5774647887323943,0.5391304347826086, + 0.46724890829694316,0.4680851063829788,0.462686567164179, + 0.45679012345678977,0.4545454545454551" + l="0.12,0.16,0.2196078431372549,0.33921568627450976, + 0.39019607843137255,0.4176470588235294,0.45098039215686275, + 0.5509803921568628,0.6313725490196078,0.7372549019607844, + 0.8411764705882353,0.9352941176470588"/> + <palette h="0.6470588235294118,0.6516666666666667,0.6464174454828661, + 0.6441441441441442,0.6432748538011696,0.6416666666666667, + 0.6402439024390243,0.6412429378531074,0.6435185185185186, + 0.6428571428571429" + s="0.8095238095238095,0.6578947368421053,0.5721925133689839, + 0.5362318840579711,0.5,0.4424778761061947,0.44086021505376327, + 0.44360902255639095,0.4499999999999997,0.4375000000000006" + l="0.16470588235294117,0.2980392156862745,0.36666666666666664, + 0.40588235294117647,0.44705882352941173, + 0.5568627450980392,0.6352941176470588,0.7392156862745098, + 0.8431372549019608,0.9372549019607843"/> + <palette h="0.469,0.46732026143790845,0.4718614718614719, + 0.4793650793650794,0.48071625344352614,0.4829683698296837, + 0.484375,0.4841269841269842,0.48444444444444457, + 0.48518518518518516,0.4907407407407408" + s="1,1,1,1,1,1,0.6274509803921569,0.41832669322709176, + 0.41899441340782106,0.4128440366972478,0.4090909090909088" + l="0.07,0.1,0.15098039215686274,0.20588235294117646, + 0.2372549019607843,0.26862745098039215,0.4,0.5078431372549019, + 0.6490196078431372,0.7862745098039216,0.9137254901960784"/> + <palette h="0.542,0.5444444444444444,0.5555555555555556, + 0.5555555555555556,0.553763440860215,0.5526315789473684, + 0.5555555555555556,0.5555555555555555,0.5555555555555556, + 0.5512820512820514,0.5666666666666667" + s="0.25,0.24590163934426232,0.19148936170212766, + 0.1791044776119403,0.18343195266272191,0.18446601941747576, + 0.1538461538461539,0.15625000000000003,0.15328467153284678, + 0.15662650602409653,0.151515151515151" + l="0.05,0.1196078431372549,0.1843137254901961, + 0.2627450980392157, + 0.33137254901960783,0.403921568627451,0.5411764705882354, + 0.6235294117647059,0.7313725490196079,0.8372549019607843, + 0.9352941176470588"/> + <palette h="0.022222222222222223,0.02469135802469136,0.031249999999999997, + 0.03947368421052631,0.04166666666666668, + 0.043650793650793655,0.04411764705882352,0.04166666666666652, + 0.04444444444444459,0.05555555555555529" + s="0.33333333333333337,0.2783505154639175,0.2580645161290323, + 0.25675675675675674,0.2528735632183908,0.17500000000000002, + 0.15315315315315312,0.15189873417721522, + 0.15789473684210534,0.15789473684210542" + l="0.08823529411764705,0.19019607843137254,0.2431372549019608, + 0.2901960784313725,0.3411764705882353,0.47058823529411764, + 0.5647058823529412,0.6901960784313725,0.8137254901960784, + 0.9254901960784314"/> + <palette h="0.027,0.03,0.038,0.044,0.050884955752212385, + 0.07254901960784313,0.0934640522875817, + 0.10457516339869281,0.11699346405228758, + 0.1255813953488372,0.1268939393939394,0.12533333333333332, + 0.12500000000000003,0.12777777777777777" + s="1,1,1,1,1,1,1,1,1,1,1,1,1,1" + l="0.25,0.3,0.35,0.4,0.44313725490196076,0.5,0.5,0.5, + 0.5,0.5784313725490196, + 0.6549019607843137,0.7549019607843137,0.8509803921568627, + 0.9411764705882353"/> + </palettes> + <blacklist> + <!-- Red --> + <range h="0, 20" + s="0.7, 1" + l="0.21, 0.79"/> + <range h="0, 20" + s="0.3, 0.7" + l="0.355, 0.653"/> + <!-- Red Orange --> + <range h="20, 40" + s="0.7, 1" + l="0.28, 0.643"/> + <range h="20, 40" + s="0.3, 0.7" + l="0.414, 0.561"/> + <range h="20, 40" + s="0, 3" + l="0.343, 0.584"/> + <!-- Orange --> + <range h="40, 60" + s="0.7, 1" + l="0.173, 0.349"/> + <range h="40, 60" + s="0.3, 0.7" + l="0.233, 0.427"/> + <range h="40, 60" + s="0, 0.3" + l="0.231, 0.484"/> + <!-- Yellow 60 --> + <range h="60, 80" + s="0.7, 1" + l="0.488, 0.737"/> + <range h="60, 80" + s="0.3, 0.7" + l="0.673, 0.837"/> + <!-- Yellow Green 80 --> + <range h="80, 100" + s="0.7, 1" + l="0.469, 0.61"/> + <!-- Yellow green 100 --> + <range h="100, 120" + s="0.7, 1" + l="0.388, 0.612"/> + <range h="100, 120" + s="0.3, 0.7" + l="0.424, 0.541"/> + <!-- Green --> + <range h="120, 140" + s="0.7, 1" + l="0.375, 0.52"/> + <range h="120, 140" + s="0.3, 0.7" + l="0.435, 0.524"/> + <!-- Green Blue 140 --> + <range h="140, 160" + s="0.7, 1" + l="0.496, 0.641"/> + <!-- Seaoam --> + <range h="160, 180" + s="0.7, 1" + l="0.496, 0.567"/> + <!-- Cyan --> + <range h="180, 200" + s="0.7, 1" + l="0.52, 0.729"/> + <!-- Blue --> + <range h="220, 240" + s="0.7, 1" + l="0.396, 0.571"/> + <range h="220, 240" + s="0.3, 0.7" + l="0.425, 0.551"/> + <!-- Blue Purple 240 --> + <range h="240, 260" + s="0.7, 1" + l="0.418, 0.639"/> + <range h="220, 240" + s="0.3, 0.7" + l="0.441, 0.576"/> + <!-- Blue Purple 260 --> + <range h="260, 280" + s="0.3, 1" + l="0.461, 0.553"/> + <!-- Fuchsia --> + <range h="300, 320" + s="0.7, 1" + l="0.484, 0.588"/> + <range h="300, 320" + s="0.3, 0.7" + l="0.48, 0.592"/> + <!-- Pink --> + <range h="320, 340" + s="0.7, 1" + l="0.466, 0.629"/> + <!-- Soft red --> + <range h="340, 360" + s="0.7, 1" + l="0.437, 0.596"/> + </blacklist> +</colorextraction>
\ No newline at end of file diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index d69b1e4e4922..56c72d214347 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -786,7 +786,7 @@ public class TextViewActivityTest { @Test public void testAssistItemIsAtIndexZero() throws Throwable { - mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null); + useSystemDefaultTextClassifier(); final TextView textView = mActivity.findViewById(R.id.textview); mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback( new ActionMode.Callback() { @@ -822,6 +822,23 @@ public class TextViewActivityTest { } @Test + public void testNoAssistItemForPasswordField() throws Throwable { + useSystemDefaultTextClassifier(); + final TextView textView = mActivity.findViewById(R.id.textview); + mActivityRule.runOnUiThread(() -> { + textView.setInputType( + InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + }); + mInstrumentation.waitForIdleSync(); + final String password = "afigbo@android.com"; + + onView(withId(R.id.textview)).perform(replaceText(password)); + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(password.indexOf('@'))); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarDoesNotContainItem(android.R.id.textAssist); + } + + @Test public void testPastePlainText_menuAction() { initializeClipboardWithText(TextStyle.STYLED); @@ -848,6 +865,10 @@ public class TextViewActivityTest { mActivity.getString(com.android.internal.R.string.paste_as_plain_text)); } + private void useSystemDefaultTextClassifier() { + mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null); + } + private void initializeClipboardWithText(TextStyle textStyle) { final ClipData clip; switch (textStyle) { diff --git a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java index 5206c9b553a6..3825e3f3f9ea 100644 --- a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java +++ b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java @@ -23,29 +23,31 @@ import static android.support.test.espresso.matcher.RootMatchers.withDecorView; import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isRoot; -import static android.support.test.espresso.matcher.ViewMatchers.withTagValue; import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withTagValue; import static android.support.test.espresso.matcher.ViewMatchers.withText; + import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.is; -import android.view.MenuItem; -import android.view.ViewGroup; -import java.util.ArrayList; -import java.util.List; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; - import android.support.test.espresso.NoMatchingRootException; import android.support.test.espresso.NoMatchingViewException; import android.support.test.espresso.UiController; import android.support.test.espresso.ViewAction; import android.support.test.espresso.ViewInteraction; +import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import com.android.internal.widget.FloatingToolbar; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +import java.util.ArrayList; +import java.util.List; + /** * Espresso utility methods for the floating toolbar. */ @@ -177,6 +179,39 @@ public class FloatingToolbarEspressoUtils { } /** + * Asserts that the floating toolbar does not contain a menu item with the specified id. + * + * @param menuItemId id of the menu item + * @throws AssertionError if the assertion fails + */ + public static void assertFloatingToolbarDoesNotContainItem(final int menuItemId) { + onFloatingToolBar().check(matches(new TypeSafeMatcher<View>() { + @Override + public boolean matchesSafely(View view) { + return !hasMenuItemWithSpecifiedId(view); + } + + @Override + public void describeTo(Description description) {} + + private boolean hasMenuItemWithSpecifiedId(View view) { + if (view.getTag() instanceof MenuItem + && ((MenuItem) view.getTag()).getItemId() == menuItemId) { + return true; + } else if (view instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) view; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + if (hasMenuItemWithSpecifiedId(viewGroup.getChildAt(i))) { + return true; + } + } + } + return false; + } + })); + } + + /** * Click specified item on the floating tool bar. * * @param itemLabel label of the item. diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index d586db438765..57c75490ec47 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -21,6 +21,7 @@ import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; +import android.content.res.ResourcesImpl; import android.os.Parcel; import android.os.Parcelable; import android.os.StrictMode; @@ -82,6 +83,12 @@ public final class Bitmap implements Parcelable { private static volatile int sDefaultDensity = -1; + /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */ + public static volatile int sPreloadTracingNumInstantiatedBitmaps; + + /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */ + public static volatile long sPreloadTracingTotalBitmapsSize; + /** * For backwards compatibility, allows the app layer to change the default * density when running old apps. @@ -128,6 +135,11 @@ public final class Bitmap implements Parcelable { NativeAllocationRegistry registry = new NativeAllocationRegistry( Bitmap.class.getClassLoader(), nativeGetNativeFinalizer(), nativeSize); registry.registerNativeAllocation(this, nativeBitmap); + + if (ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD) { + sPreloadTracingNumInstantiatedBitmaps++; + sPreloadTracingTotalBitmapsSize += nativeSize; + } } /** diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 1fd56974783e..aa9227c9bb08 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -852,6 +852,23 @@ public class Paint { } /** + * Distance from top of the strike-through line to the baseline. Negative values mean above the + * baseline. This method returns where the strike-through line should be drawn independent of if + * the strikeThruText bit is set at the moment. + * @hide + */ + public float getStrikeThruPosition() { + return nGetStrikeThruPosition(mNativePaint, mNativeTypeface); + } + + /** + * @hide + */ + public float getStrikeThruThickness() { + return nGetStrikeThruThickness(mNativePaint, mNativeTypeface); + } + + /** * Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit * * @param strikeThruText true to set the strikeThruText bit in the paint's @@ -2997,5 +3014,9 @@ public class Paint { @CriticalNative private static native float nGetUnderlineThickness(long paintPtr, long typefacePtr); @CriticalNative + private static native float nGetStrikeThruPosition(long paintPtr, long typefacePtr); + @CriticalNative + private static native float nGetStrikeThruThickness(long paintPtr, long typefacePtr); + @CriticalNative private static native void nSetTextSize(long paintPtr, float textSize); } diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index bfd1422ddca4..ccf9de0abdb4 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -341,12 +341,14 @@ public class KeyStore { } } - public boolean grant(String key, int uid) { + public String grant(String key, int uid) { try { - return mBinder.grant(key, uid) == NO_ERROR; + String grantAlias = mBinder.grant(key, uid); + if (grantAlias == "") return null; + return grantAlias; } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); - return false; + return null; } } diff --git a/legacy-test/jarjar-rules.txt b/legacy-test/jarjar-rules.txt index 9077e6f8ba26..fd8555c8931c 100644 --- a/legacy-test/jarjar-rules.txt +++ b/legacy-test/jarjar-rules.txt @@ -1,2 +1,3 @@ rule junit.** repackaged.junit.@1 rule android.test.** repackaged.android.test.@1 +rule com.android.internal.util.** repackaged.com.android.internal.util.@1 diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp index 4507c5018c26..e754daf7c42e 100644 --- a/libs/hwui/hwui/Canvas.cpp +++ b/libs/hwui/hwui/Canvas.cpp @@ -35,6 +35,13 @@ Canvas* Canvas::create_recording_canvas(int width, int height, uirenderer::Rende return new uirenderer::RecordingCanvas(width, height); } +static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkScalar thickness, + const SkPaint& paint, Canvas* canvas) { + const SkScalar strokeWidth = fmax(thickness, 1.0f); + const SkScalar bottom = top + strokeWidth; + canvas->drawRect(left, top, right, bottom, paint); +} + void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) { uint32_t flags; SkDrawFilter* drawFilter = getDrawFilter(); @@ -46,7 +53,6 @@ void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& flags = paint.getFlags(); } if (flags & (SkPaint::kUnderlineText_ReserveFlag | SkPaint::kStrikeThruText_ReserveFlag)) { - const SkScalar left = x; const SkScalar right = x + length; if (flags & SkPaint::kUnderlineText_ReserveFlag) { @@ -60,18 +66,15 @@ void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& if (!metrics.hasUnderlineThickness(&thickness)) { thickness = paint.getTextSize() * Paint::kStdUnderline_Thickness; } - const float strokeWidth = fmax(thickness, 1.0f); const SkScalar top = y + position; - const SkScalar bottom = top + strokeWidth; - drawRect(left, top, right, bottom, paint); + drawStroke(left, right, top, thickness, paint, this); } if (flags & SkPaint::kStrikeThruText_ReserveFlag) { const float textSize = paint.getTextSize(); - const float position = textSize * Paint::kStdStrikeThru_Offset; - const float strokeWidth = fmax(textSize * Paint::kStdUnderline_Thickness, 1.0f); - const SkScalar top = y + position - 0.5f * strokeWidth; - const SkScalar bottom = y + position + 0.5f * strokeWidth; - drawRect(left, top, right, bottom, paint); + const float position = textSize * Paint::kStdStrikeThru_Top; + const SkScalar thickness = textSize * Paint::kStdStrikeThru_Thickness; + const SkScalar top = y + position; + drawStroke(left, right, top, thickness, paint, this); } } } diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h index 4305025272b2..a5d83a0ca018 100644 --- a/libs/hwui/hwui/Paint.h +++ b/libs/hwui/hwui/Paint.h @@ -37,6 +37,10 @@ public: constexpr static float kStdUnderline_Top = kStdUnderline_Offset - 0.5f * kStdUnderline_Thickness; + constexpr static float kStdStrikeThru_Thickness = kStdUnderline_Thickness; + constexpr static float kStdStrikeThru_Top = + kStdStrikeThru_Offset - 0.5f * kStdStrikeThru_Thickness; + Paint(); Paint(const Paint& paint); Paint(const SkPaint& paint); // NOLINT(implicit) diff --git a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml index a054068d1ce0..285c15d49a05 100644 --- a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml @@ -25,12 +25,12 @@ <string name="allow_restore_button_label" msgid="3081286752277127827">"Վերականգնել իմ տվյալները"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"Չվերականգնել"</string> <string name="current_password_text" msgid="8268189555578298067">"Խնդրում ենք մուտքագրել ձեր ընթացիկ պահուստային գաղտնաբառը ներքևում`"</string> - <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում:"</string> - <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի կոդավորման համար:"</string> - <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները կոդավորելու համար: Եթե այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string> - <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ցանկանում եք կոդավորել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string> - <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը կոդավորված է, դուք պետք է կոդավորեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string> - <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե վերականգնվող տվյալները կոդավորված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում:"</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի գաղտնագրման համար:"</string> + <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները գաղտնագրելու համար: Եթե այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string> + <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ցանկանում եք գաղտնագրել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը գաղտնագրված է, դուք պետք է գաղտնագրեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string> + <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե վերականգնվող տվյալները գաղտնագրված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string> <string name="toast_backup_started" msgid="550354281452756121">"Պահուստավորումը սկսվում է..."</string> <string name="toast_backup_ended" msgid="3818080769548726424">"Պահուստավորումն ավարտվեց"</string> <string name="toast_restore_started" msgid="7881679218971277385">"Վերականգնումը մեկնարկեց..."</string> diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index a7e14909f1b6..be87ed2ed887 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -31,6 +31,7 @@ import android.net.NetworkRequest; import android.net.Proxy; import android.net.Uri; import android.net.http.SslError; +import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.util.ArrayMap; @@ -57,6 +58,7 @@ import java.net.URL; import java.lang.InterruptedException; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Objects; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; @@ -286,6 +288,18 @@ public class CaptivePortalLoginActivity extends Activity { return null; } + private static String host(URL url) { + if (url == null) { + return null; + } + return url.getHost(); + } + + private static String sanitizeURL(URL url) { + // In non-Debug build, only show host to avoid leaking private info. + return Build.IS_DEBUGGABLE ? Objects.toString(url) : host(url); + } + private void testForCaptivePortal() { // TODO: reuse NetworkMonitor facilities for consistent captive portal detection. new Thread(new Runnable() { @@ -339,6 +353,8 @@ public class CaptivePortalLoginActivity extends Activity { TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); private int mPagesLoaded; + // the host of the page that this webview is currently loading. Can be null when undefined. + private String mHostname; // If we haven't finished cleaning up the history, don't allow going back. public boolean allowBack() { @@ -346,8 +362,8 @@ public class CaptivePortalLoginActivity extends Activity { } @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - if (url.contains(mBrowserBailOutToken)) { + public void onPageStarted(WebView view, String urlString, Bitmap favicon) { + if (urlString.contains(mBrowserBailOutToken)) { mLaunchBrowser = true; done(Result.WANTED_AS_IS); return; @@ -355,11 +371,17 @@ public class CaptivePortalLoginActivity extends Activity { // The first page load is used only to cause the WebView to // fetch the proxy settings. Don't update the URL bar, and // don't check if the captive portal is still there. - if (mPagesLoaded == 0) return; + if (mPagesLoaded == 0) { + return; + } + final URL url = makeURL(urlString); + Log.d(TAG, "onPageSarted: " + sanitizeURL(url)); + mHostname = host(url); // For internally generated pages, leave URL bar listing prior URL as this is the URL // the page refers to. - if (!url.startsWith(INTERNAL_ASSETS)) { - getActionBar().setSubtitle(getHeaderSubtitle(url)); + if (!urlString.startsWith(INTERNAL_ASSETS)) { + String subtitle = (url != null) ? getHeaderSubtitle(url) : urlString; + getActionBar().setSubtitle(subtitle); } getProgressBar().setVisibility(View.VISIBLE); testForCaptivePortal(); @@ -401,15 +423,18 @@ public class CaptivePortalLoginActivity extends Activity { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + final URL url = makeURL(error.getUrl()); + final String host = host(url); + Log.d(TAG, String.format("SSL error: %s, url: %s, certificate: %s", + error.getPrimaryError(), sanitizeURL(url), error.getCertificate())); + if (url == null || !Objects.equals(host, mHostname)) { + // Ignore ssl errors for resources coming from a different hostname than the page + // that we are currently loading, and only cancel the request. + handler.cancel(); + return; + } logMetricsEvent(MetricsEvent.CAPTIVE_PORTAL_LOGIN_ACTIVITY_SSL_ERROR); - Log.w(TAG, "SSL error (error: " + error.getPrimaryError() + " host: " + - // Only show host to avoid leaking private info. - Uri.parse(error.getUrl()).getHost() + " certificate: " + - error.getCertificate() + "); displaying SSL warning."); final String sslErrorPage = makeSslErrorPage(); - if (VDBG) { - Log.d(TAG, sslErrorPage); - } view.loadDataWithBaseURL(INTERNAL_ASSETS, sslErrorPage, "text/HTML", "UTF-8", null); } @@ -502,16 +527,13 @@ public class CaptivePortalLoginActivity extends Activity { return getString(R.string.action_bar_title, info.getExtraInfo().replaceAll("^\"|\"$", "")); } - private String getHeaderSubtitle(String urlString) { - URL url = makeURL(urlString); - if (url == null) { - return urlString; - } + private String getHeaderSubtitle(URL url) { + String host = host(url); final String https = "https"; if (https.equals(url.getProtocol())) { - return https + "://" + url.getHost(); + return https + "://" + host; } - return url.getHost(); + return host; } private void logMetricsEvent(int event) { diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 0cf21d236041..30c1fff5e6ee 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -55,6 +55,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + mPairButton = findViewById(R.id.button_pair); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); @@ -62,9 +64,12 @@ public class DeviceChooserActivity extends Activity { R.string.confirmation_title, getCallingAppName(), selectedDevice.getDisplayName()), 0)); + mPairButton.setOnClickListener(v -> onDeviceConfirmed(getService().mSelectedDevice)); getService().mSelectedDevice = selectedDevice; + onSelectionUpdate(); } else { setContentView(R.layout.device_chooser); + mPairButton.setVisibility(View.GONE); setTitle(Html.fromHtml(getString(R.string.chooser_title, getCallingAppName()), 0)); mDeviceListView = findViewById(R.id.device_list); final DeviceDiscoveryService.DevicesAdapter adapter = getService().mDevicesAdapter; @@ -72,16 +77,12 @@ public class DeviceChooserActivity extends Activity { adapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { - updatePairButtonEnabled(); + onSelectionUpdate(); } }); mDeviceListView.addFooterView(getProgressBar(), null, false); } - mPairButton = findViewById(R.id.button_pair); - mPairButton.setOnClickListener(v -> onPairTapped(getService().mSelectedDevice)); - updatePairButtonEnabled(); - mCancelButton = findViewById(R.id.button_cancel); mCancelButton.setOnClickListener(v -> cancel()); } @@ -134,15 +135,20 @@ public class DeviceChooserActivity extends Activity { return r.getDimensionPixelSize(R.dimen.padding); } - private void updatePairButtonEnabled() { - mPairButton.setEnabled(getService().mSelectedDevice != null); + private void onSelectionUpdate() { + DeviceFilterPair selectedDevice = getService().mSelectedDevice; + if (mPairButton.getVisibility() != View.VISIBLE && selectedDevice != null) { + onDeviceConfirmed(selectedDevice); + } else { + mPairButton.setEnabled(selectedDevice != null); + } } private DeviceDiscoveryService getService() { return DeviceDiscoveryService.sInstance; } - protected void onPairTapped(DeviceFilterPair selectedDevice) { + protected void onDeviceConfirmed(DeviceFilterPair selectedDevice) { getService().onDeviceSelected( getCallingPackage(), getDeviceMacAddress(selectedDevice.device)); setResult(RESULT_OK, diff --git a/packages/PrintSpooler/res/values-bs/strings.xml b/packages/PrintSpooler/res/values-bs/strings.xml index d3f1b80088c0..2e9bfa317c64 100644 --- a/packages/PrintSpooler/res/values-bs/strings.xml +++ b/packages/PrintSpooler/res/values-bs/strings.xml @@ -53,7 +53,7 @@ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Okvir za pretraživanje je prikazan"</string> <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Okvir za pretraživanje je skriven"</string> <string name="print_add_printer" msgid="1088656468360653455">"Dodaj štampač"</string> - <string name="print_select_printer" msgid="7388760939873368698">"Izaberite štampač"</string> + <string name="print_select_printer" msgid="7388760939873368698">"Odaberite štampač"</string> <string name="print_forget_printer" msgid="5035287497291910766">"Zaboravi ovaj štampač"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> štampač je pronađen</item> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 56627031286b..00bb4a98a5ef 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -36,7 +36,7 @@ <string name="wifi_no_internet" msgid="3880396223819116454">"No hi ha accés a Internet"</string> <string name="saved_network" msgid="4352716707126620811">"Desat per <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"Connectada automàticament a través de: %1$s"</string> - <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de la xarxa"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connectada, sense Internet"</string> @@ -186,7 +186,7 @@ <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferència agressiva de Wi-Fi a mòbil"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Dades mòbils sempre actives"</string> - <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per a la compartició de xarxa"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per compartir la xarxa"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactiva el volum absolut"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activa el so al mateix canal"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versió AVRCP de Bluetooth"</string> @@ -218,7 +218,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Permet les ubicacions simulades"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Inspecció d\'atributs de visualització"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén les dades mòbils sempre actives, fins i tot quan la Wi‑Fi està activada (per canviar de xarxa ràpidament)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per a la compartició de xarxa, si està disponible"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per compartir la xarxa, si està disponible"</string> <string name="adb_warning_title" msgid="6234463310896563253">"Voleu permetre la depuració USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"La depuració USB només està indicada per a activitats de desenvolupament. Fes-la servir intercanviar dades entre l\'ordinador i el dispositiu, per instal·lar aplicacions al dispositiu sense rebre notificacions i per llegir dades de registre."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"Vols revocar l\'accés a la depuració d\'USB dels ordinadors que has autoritzat anteriorment?"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index e2e0e6212499..4a6f12d75f73 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -104,11 +104,11 @@ <string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string> <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicaciones eliminadas"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Usuarios y aplicaciones eliminados"</string> - <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir por USB"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir conexión por USB"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona Wi-Fi portátil"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir por Bluetooth"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir Internet"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir Internet y zona Wi-Fi"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir conexión por Bluetooth"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir conexión"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir conexión y zona Wi-Fi"</string> <string name="managed_user_title" msgid="8109605045406748842">"Todas las aplicaciones de trabajo"</string> <string name="user_guest" msgid="8475274842845401871">"Invitado"</string> <string name="unknown" msgid="1592123443519355854">"Desconocido"</string> @@ -162,7 +162,7 @@ <string name="development_settings_summary" msgid="1815795401632854041">"Establecer opciones de desarrollo de aplicaciones"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Las opciones de desarrollador no están disponibles para este usuario"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"Los ajustes de VPN no están disponibles para este usuario"</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir Internet no están disponibles para este usuario"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir conexión no están disponibles para este usuario"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Los ajustes del nombre de punto de acceso no están disponibles para este usuario"</string> <string name="enable_adb" msgid="7982306934419797485">"Depuración por USB"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Activar el modo de depuración cuando el dispositivo esté conectado por USB"</string> @@ -186,7 +186,7 @@ <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferencia agresiva de Wi-Fi a móvil"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activos"</string> - <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión mediante dispositivo portátil"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión compartida"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar tono de llamada por Bluetooth"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string> @@ -218,7 +218,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Permitir ubicaciones simuladas"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Inspección de atributos de vista"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén los datos móviles siempre activos, aunque la conexión Wi‑Fi esté activada (para cambiar de red rápidamente)."</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la aceleración por hardware para conexión mediante dispositivo portátil si está disponible"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la conexión compartida con aceleración por hardware si está disponible"</string> <string name="adb_warning_title" msgid="6234463310896563253">"¿Permitir depuración por USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"La depuración por USB solo está indicada para actividades de desarrollo. Puedes utilizarla para intercambiar datos entre el ordenador y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"¿Quieres revocar el acceso a la depuración por USB de todos los ordenadores que has autorizado?"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 7bbc598a0a0e..e0a88e4cf206 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -725,7 +725,7 @@ public class AccessPoint implements Comparable<AccessPoint> { } } - if (WifiTracker.sVerboseLogging > 0) { + if (WifiTracker.sVerboseLogging) { // Add RSSI/band information for this config, what was seen up to 6 seconds ago // verbose WiFi Logging is only turned on thru developers settings if (mInfo != null && mNetworkInfo != null) { // This is the active connection @@ -1166,8 +1166,9 @@ public class AccessPoint implements Comparable<AccessPoint> { if (nc != null) { if (nc.hasCapability(nc.NET_CAPABILITY_CAPTIVE_PORTAL)) { - return context.getString( - com.android.internal.R.string.network_available_sign_in); + int id = context.getResources() + .getIdentifier("network_available_sign_in", "string", "android"); + return context.getString(id); } else if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { return context.getString(R.string.wifi_connected_no_internet); } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 5a35da96375a..f0ac31fde23d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -68,11 +68,13 @@ public class WifiTracker { // TODO(b/36733768): Remove flag includeSaved and includePasspoints. private static final String TAG = "WifiTracker"; - private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG); + private static final boolean DBG() { + return Log.isLoggable(TAG, Log.DEBUG); + } /** verbose logging flag. this flag is set thru developer debugging options * and used so as to assist with in-the-field WiFi connectivity debugging */ - public static int sVerboseLogging = 0; + public static boolean sVerboseLogging; // TODO: Allow control of this? // Combo scans can take 5-6s to complete - set to 10s. @@ -193,7 +195,7 @@ public class WifiTracker { mConnectivityManager = connectivityManager; // check if verbose logging has been turned on or off - sVerboseLogging = mWifiManager.getVerboseLoggingLevel(); + sVerboseLogging = (mWifiManager.getVerboseLoggingLevel() > 0); mFilter = new IntentFilter(); mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); @@ -251,16 +253,12 @@ public class WifiTracker { List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks(); updateAccessPointsLocked(newScanResults, configs); - if (DBG) { - Log.d(TAG, "force update - internal access point list:\n" + mInternalAccessPoints); - } - // Synchronously copy access points mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED); mMainHandler.handleMessage( Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED)); - if (DBG) { - Log.d(TAG, "force update - external access point list:\n" + mAccessPoints); + if (sVerboseLogging) { + Log.i(TAG, "force update - external access point list:\n" + mAccessPoints); } } } @@ -338,7 +336,7 @@ public class WifiTracker { private void requestScoresForNetworkKeys(Collection<NetworkKey> keys) { if (keys.isEmpty()) return; - if (DBG) { + if (DBG()) { Log.d(TAG, "Requesting scores for Network Keys: " + keys); } mNetworkScoreManager.requestScores(keys.toArray(new NetworkKey[keys.size()])); @@ -443,19 +441,19 @@ public class WifiTracker { } if (mScanId > NUM_SCANS_TO_CONFIRM_AP_LOSS) { - if (DBG) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------"); + if (DBG()) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------"); Integer threshold = mScanId - NUM_SCANS_TO_CONFIRM_AP_LOSS; for (Iterator<Map.Entry<String, Integer>> it = mSeenBssids.entrySet().iterator(); it.hasNext(); /* nothing */) { Map.Entry<String, Integer> e = it.next(); if (e.getValue() < threshold) { ScanResult result = mScanResultCache.get(e.getKey()); - if (DBG) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")"); + if (DBG()) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")"); mScanResultCache.remove(e.getKey()); it.remove(); } } - if (DBG) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----"); + if (DBG()) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----"); } return mScanResultCache.values(); @@ -609,7 +607,7 @@ public class WifiTracker { Collections.sort(accessPoints); // Log accesspoints that were deleted - if (DBG) { + if (DBG()) { Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------"); for (AccessPoint prevAccessPoint : mInternalAccessPoints) { if (prevAccessPoint.getSsid() == null) @@ -1064,7 +1062,7 @@ public class WifiTracker { oldAccessPoints.put(accessPoint.mId, accessPoint); } - if (DBG) { + if (DBG()) { Log.d(TAG, "Starting to copy AP items on the MainHandler"); } synchronized (mLock) { diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 988b9865c7ec..a8b184c3f204 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -1060,7 +1060,6 @@ public class BugreportProgressService extends Service { } return new Notification.Builder(context, NOTIFICATION_CHANNEL_ID) .addExtras(sNotificationBundle) - .setCategory(Notification.CATEGORY_SYSTEM) .setSmallIcon( isTv(context) ? R.drawable.ic_bug_report_black_24dp : com.android.internal.R.drawable.stat_sys_adb) diff --git a/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml b/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml index fd385fcc71fa..fffa0bd621e5 100644 --- a/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml +++ b/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml @@ -19,6 +19,6 @@ Copyright (C) 2017 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="?attr/bgProtectSecondaryTextColor" + android:fillColor="@android:color/white" android:pathData="M21.35,6.49c-0.35,0.42 -0.98,0.47 -1.4,0.12l-3.07,-2.57a1,1 0,1 1,1.29 -1.53l3.07,2.57c0.42,0.35 0.47,0.98 0.11,1.41zM7.24,2.63a1,1 0,0 0,-1.41 -0.13L2.77,5.07A0.996,0.996 0,1 0,4.05 6.6l3.06,-2.57c0.43,-0.35 0.48,-0.98 0.13,-1.4zM11.75,8c-0.41,0 -0.75,0.34 -0.75,0.75v4.68c0,0.35 0.18,0.68 0.49,0.86l3.65,2.19c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.37,-2v-4.5c0,-0.41 -0.34,-0.75 -0.75,-0.75zM12,5.9c-3.91,0 -7.1,3.18 -7.1,7.1s3.19,7.1 7.1,7.1 7.1,-3.18 7.1,-7.1 -3.19,-7.1 -7.1,-7.1M12,4a9,9 0,1 1,-0.001 18.001A9,9 0,0 1,12 4z" /> </vector> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml index a0850f492531..7d12504604c8 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml @@ -39,6 +39,8 @@ android:layout_height="wrap_content" android:drawablePadding="6dp" android:drawableStart="@drawable/ic_access_alarms_big" + android:drawableTint="?attr/bgProtectSecondaryTextColor" + android:drawableTintMode="src_in" android:textColor="?attr/bgProtectSecondaryTextColor" android:letterSpacing="0.15" style="@style/widget_label" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 451c2f702305..337b68fed758 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -97,7 +97,7 @@ <string name="phone_label" msgid="2320074140205331708">"otvori telefon"</string> <string name="voice_assist_label" msgid="3956854378310019854">"otvori glasovnu pomoć"</string> <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> - <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberite novi raspored zadataka"</string> + <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Uvećani prikaz manjeg ekrana na većem ekranu."</string> @@ -355,7 +355,7 @@ <string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string> <string name="description_direction_up" msgid="7169032478259485180">"Povucite gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Povucite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> - <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste izabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> + <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string> <string name="zen_alarms_introduction" msgid="4934328096749380201">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što izaberete za reprodukciju, uključujući muziku, videozapise i igre."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string> <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 0e32df5df0ea..ed5756400fb2 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -314,7 +314,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Weitere Einstellungen"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Fertig"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Verbunden"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 99cbb9346fee..c206d8693bec 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -310,7 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Περισσότερες ρυθμίσεις"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Τέλος"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Συνδέθηκε"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Σύνδεση, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 5575ddaf3a1c..c479cfe15841 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -155,7 +155,7 @@ <string name="accessibility_cell_data" msgid="5326139158682385073">"Datos móviles"</string> <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Datos móviles activados"</string> <string name="accessibility_cell_data_off" msgid="443267573897409704">"Datos móviles desactivados"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir por Bluetooth"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir conexión por Bluetooth"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string> <string name="accessibility_vpn_on" msgid="5993385083262856059">"La red VPN está activada."</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"No hay tarjeta SIM."</string> @@ -314,7 +314,7 @@ <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> - <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir Internet"</string> + <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir conexión"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string> @@ -407,7 +407,7 @@ <string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y todos los datos de este usuario."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> - <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el envío de datos en segundo plano"</string> + <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar ahorro de batería"</string> <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string> @@ -589,7 +589,7 @@ <string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string> <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ahorro de batería no disponible mientras se carga el dispositivo"</string> <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ahorro de batería"</string> - <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y las conexiones automáticas"</string> + <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Inicio"</string> <string name="keyboard_key_back" msgid="2337450286042721351">"Atrás"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 122bacad44c3..820fdb366226 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -312,8 +312,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Ezarpen gehiago"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Eginda"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Konektatuta"</string> - <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> - <skip /> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Konektatzen…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Konexioa partekatzea"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Sare publikoa"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 51d356e2d60a..12ff89de7212 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -310,7 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"Setelan lainnya"</string> <string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Tersambung"</string> - <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, daya baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 22a1464ac4cb..ba5816beb127 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -534,7 +534,7 @@ <string name="tuner_warning" msgid="8730648121973575701">"System UI Tuner מספק לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string> <string name="got_it" msgid="2239653834387972602">"הבנתי"</string> - <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! System UI Tuner נוסף ל\'הגדרות\'"</string> + <string name="tuner_toast" msgid="603429811084428439">"מזל טוב! ה-System UI Tuner נוסף ל\'הגדרות\'"</string> <string name="remove_from_settings" msgid="8389591916603406378">"הסר מההגדרות"</string> <string name="remove_from_settings_prompt" msgid="6069085993355887748">"האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string> <string name="activity_not_found" msgid="348423244327799974">"האפליקציה אינה מותקנת במכשיר"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 4065ff687b11..b8588d9fd823 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -310,8 +310,7 @@ <string name="quick_settings_more_settings" msgid="326112621462813682">"更多设置"</string> <string name="quick_settings_done" msgid="3402999958839153376">"完成"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"已连接"</string> - <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> - <skip /> + <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 02a2e8fc5313..38b2969265cb 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -267,6 +267,12 @@ <!-- Doze: alpha to apply to small icons when dozing --> <integer name="doze_small_icon_alpha">222</integer><!-- 87% of 0xff --> + <!-- Doze: the brightness value to use for the lower brightness AOD mode --> + <integer name="config_doze_aod_brightness_low">6</integer> + + <!-- Doze: the brightness value to use for the higher brightness AOD mode --> + <integer name="config_doze_aod_brightness_high">27</integer> + <!-- Doze: whether the double tap sensor reports 2D touch coordinates --> <bool name="doze_double_tap_reports_touch_coordinates">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b02f189681bb..f060c69f1d35 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -831,6 +831,9 @@ burn-in on AOD --> <dimen name="burn_in_prevention_offset_y">50dp</dimen> + <!-- padding between the notification stack and the keyguard status view when dozing --> + <dimen name="dozing_stack_padding">10dp</dimen> + <dimen name="corner_size">16dp</dimen> <dimen name="top_padding">0dp</dimen> <dimen name="bottom_padding">48dp</dimen> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index 2262869603cd..5005f9dd7db2 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -19,9 +19,11 @@ package com.android.keyguard; import android.app.ActivityManager; import android.app.AlarmManager; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; +import android.graphics.PorterDuff; import android.os.UserHandle; import android.support.v4.graphics.ColorUtils; import android.text.TextUtils; @@ -56,11 +58,14 @@ public class KeyguardStatusView extends GridLayout { private TextView mOwnerInfo; private ViewGroup mClockContainer; private ChargingView mBatteryDoze; + private View mKeyguardStatusArea; private View[] mVisibleInDoze; private boolean mPulsing; - private float mDarkAmount; + private float mDarkAmount = 0; private int mTextColor; + private int mDateTextColor; + private int mAlarmTextColor; private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @@ -126,8 +131,11 @@ public class KeyguardStatusView extends GridLayout { mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext)); mOwnerInfo = findViewById(R.id.owner_info); mBatteryDoze = findViewById(R.id.battery_doze); - mVisibleInDoze = new View[]{mBatteryDoze, mClockView}; + mKeyguardStatusArea = findViewById(R.id.keyguard_status_area); + mVisibleInDoze = new View[]{mBatteryDoze, mClockView, mKeyguardStatusArea}; mTextColor = mClockView.getCurrentTextColor(); + mDateTextColor = mDateView.getCurrentTextColor(); + mAlarmTextColor = mAlarmStatusView.getCurrentTextColor(); boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive(); setEnableMarquee(shouldMarquee); @@ -186,8 +194,7 @@ public class KeyguardStatusView extends GridLayout { } public int getClockBottom() { - return mClockView.getBottom() + - ((MarginLayoutParams) mClockView.getLayoutParams()).bottomMargin; + return mKeyguardStatusArea.getBottom(); } public float getClockTextSize() { @@ -304,6 +311,10 @@ public class KeyguardStatusView extends GridLayout { updateDozeVisibleViews(); mBatteryDoze.setDark(dark); mClockView.setTextColor(ColorUtils.blendARGB(mTextColor, Color.WHITE, darkAmount)); + mDateView.setTextColor(ColorUtils.blendARGB(mDateTextColor, Color.WHITE, darkAmount)); + int blendedAlarmColor = ColorUtils.blendARGB(mAlarmTextColor, Color.WHITE, darkAmount); + mAlarmStatusView.setTextColor(blendedAlarmColor); + mAlarmStatusView.setCompoundDrawableTintList(ColorStateList.valueOf(blendedAlarmColor)); } public void setPulsing(boolean pulsing) { diff --git a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java index c38288299597..6296297a81c2 100644 --- a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java +++ b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java @@ -14,56 +14,74 @@ package com.android.systemui; +import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.IDockedStackListener; import android.view.WindowManagerGlobal; +import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.function.Consumer; /** * Utility wrapper to listen for whether or not a docked stack exists, to be * used for things like the different overview icon in that mode. */ -public class DockedStackExistsListener extends IDockedStackListener.Stub { +public class DockedStackExistsListener { private static final String TAG = "DockedStackExistsListener"; - private final Consumer<Boolean> mCallback; + private static ArrayList<WeakReference<Consumer<Boolean>>> sCallbacks = new ArrayList<>(); - private DockedStackExistsListener(Consumer<Boolean> callback) { - mCallback = callback; - } + static { + try { + WindowManagerGlobal.getWindowManagerService().registerDockedStackListener( + new IDockedStackListener.Stub() { + @Override + public void onDividerVisibilityChanged(boolean b) throws RemoteException { - @Override - public void onDividerVisibilityChanged(boolean visible) throws RemoteException { - } + } - @Override - public void onDockedStackExistsChanged(final boolean exists) throws RemoteException { - mCallback.accept(exists); - } + @Override + public void onDockedStackExistsChanged(boolean exists) + throws RemoteException { + DockedStackExistsListener.onDockedStackExistsChanged(exists); + } - @Override - public void onDockedStackMinimizedChanged(boolean minimized, long animDuration, - boolean isHomeStackResizable) throws RemoteException { - } + @Override + public void onDockedStackMinimizedChanged(boolean b, long l, boolean b1) + throws RemoteException { + + } + + @Override + public void onAdjustedForImeChanged(boolean b, long l) + throws RemoteException { + + } + + @Override + public void onDockSideChanged(int i) throws RemoteException { - @Override - public void onAdjustedForImeChanged(boolean adjustedForIme, long animDuration) - throws RemoteException { + } + }); + } catch (RemoteException e) { + Log.e(TAG, "Failed registering docked stack exists listener", e); + } } - @Override - public void onDockSideChanged(int newDockSide) throws RemoteException { + + private static void onDockedStackExistsChanged(boolean exists) { + synchronized (sCallbacks) { + sCallbacks.removeIf(wf -> wf.get() == null); + sCallbacks.forEach(wf -> wf.get().accept(exists)); + } } public static void register(Consumer<Boolean> callback) { - try { - WindowManagerGlobal.getWindowManagerService().registerDockedStackListener( - new DockedStackExistsListener(callback)); - } catch (RemoteException e) { - Log.e(TAG, "Failed registering docked stack exists listener", e); + synchronized (sCallbacks) { + sCallbacks.add(new WeakReference<>(callback)); } } } diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 6571294cdb92..907a79e723ac 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -199,7 +199,7 @@ public class ImageWallpaper extends WallpaperService { // Load background image dimensions, if we haven't saved them yet if (mBackgroundWidth <= 0 || mBackgroundHeight <= 0) { // Need to load the image to get dimensions - loadWallpaper(forDraw, true /* needsReset */); + loadWallpaper(forDraw, false /* needsReset */); if (DEBUG) { Log.d(TAG, "Reloading, redoing updateSurfaceSize later."); } diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 3c895abd5e88..44cf003b3dcb 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -42,7 +42,7 @@ public class SysuiColorExtractor extends ColorExtractor { private final GradientColors mWpHiddenColors; public SysuiColorExtractor(Context context) { - this(context, new Tonal(), true); + this(context, new Tonal(context), true); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index e461986da5e0..28a45aae6892 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -23,6 +23,9 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Handler; +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.R; + /** * Controls the screen brightness when dozing. */ @@ -34,6 +37,9 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen private final Sensor mLightSensor; private boolean mRegistered; + private final int mHighBrightness; + private final int mLowBrightness; + public DozeScreenBrightness(Context context, DozeMachine.Service service, SensorManager sensorManager, Sensor lightSensor, Handler handler) { mContext = context; @@ -41,6 +47,11 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen mSensorManager = sensorManager; mLightSensor = lightSensor; mHandler = handler; + + mLowBrightness = context.getResources().getInteger( + R.integer.config_doze_aod_brightness_low); + mHighBrightness = context.getResources().getInteger( + R.integer.config_doze_aod_brightness_high); } @Override @@ -67,7 +78,17 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen @Override public void onSensorChanged(SensorEvent event) { if (mRegistered) { - mDozeService.setDozeScreenBrightness(Math.max(1, (int) event.values[0])); + mDozeService.setDozeScreenBrightness(computeBrightness((int) event.values[0])); + } + } + + private int computeBrightness(int sensorValue) { + // The sensor reports 0 for off, 1 for low brightness and 2 for high brightness. + // We currently use DozeScreenState for screen off, so we treat off as low brightness. + if (sensorValue >= 2) { + return mHighBrightness; + } else { + return mLowBrightness; } } diff --git a/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java index 4ff10e975b1a..18fb423b87a5 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java @@ -45,6 +45,7 @@ public class ExtensionFragmentListener<T extends FragmentBase> implements Consum mFragmentHostManager.getFragmentManager().beginTransaction() .replace(id, (Fragment) mExtension.get(), mTag) .commit(); + mExtension.clearItem(false); } @Override @@ -57,6 +58,7 @@ public class ExtensionFragmentListener<T extends FragmentBase> implements Consum } catch (ClassCastException e) { Log.e(TAG, extension.getClass().getName() + " must be a Fragment", e); } + mExtension.clearItem(true); } public static <T> void attachExtensonToFragment(View view, String tag, int id, diff --git a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java index 5b3ec08ce752..3d8f9ffe79d7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java @@ -16,12 +16,14 @@ package com.android.systemui.qs; import android.content.Context; import android.graphics.drawable.Drawable; +import android.service.quicksettings.Tile; import android.widget.ImageView; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.plugins.qs.QSTile.Icon; import com.android.systemui.plugins.qs.QSTile.State; +import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.phone.SignalDrawable; import java.util.Objects; @@ -35,7 +37,8 @@ public class CellTileView extends SignalTileView { public CellTileView(Context context) { super(context); mSignalDrawable = new SignalDrawable(mContext); - mSignalDrawable.setDarkIntensity(isDark(mContext)); + mSignalDrawable.setColors(QSTileImpl.getColorForState(context, Tile.STATE_UNAVAILABLE), + QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE)); mSignalDrawable.setIntrinsicSize(context.getResources().getDimensionPixelSize( R.dimen.qs_tile_icon_size)); } @@ -48,10 +51,6 @@ public class CellTileView extends SignalTileView { } } - private static int isDark(Context context) { - return Utils.getColorAttr(context, android.R.attr.colorForeground) == 0xff000000 ? 1 : 0; - } - public static class SignalIcon extends Icon { private final int mState; @@ -68,7 +67,8 @@ public class CellTileView extends SignalTileView { public Drawable getDrawable(Context context) { //TODO: Not the optimal solution to create this drawable SignalDrawable d = new SignalDrawable(context); - d.setDarkIntensity(isDark(context)); + d.setColors(QSTileImpl.getColorForState(context, Tile.STATE_UNAVAILABLE), + QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE)); d.setLevel(getState()); return d; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java index b8535a3f5a40..c35614893098 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java @@ -33,11 +33,12 @@ import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; -import android.util.Log; import android.util.FloatProperty; public class SlashDrawable extends Drawable { + public static final float CORNER_RADIUS = 1f; + private final Path mPath = new Path(); private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -141,8 +142,8 @@ public class SlashDrawable extends Drawable { Matrix m = new Matrix(); final int width = getBounds().width(); final int height = getBounds().height(); - final float radiusX = scale(1f, width); - final float radiusY = scale(1f, height); + final float radiusX = scale(CORNER_RADIUS, width); + final float radiusY = scale(CORNER_RADIUS, height); updateRect( scale(LEFT, width), scale(TOP, height), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 652288d57fe3..e65bab6b4032 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -78,6 +78,7 @@ public class KeyguardClockPositionAlgorithm { private AccelerateInterpolator mAccelerateInterpolator = new AccelerateInterpolator(); private int mClockBottom; private float mDarkAmount; + private int mDozingStackPadding; /** * Refreshes the dimension values. @@ -97,6 +98,7 @@ public class KeyguardClockPositionAlgorithm { R.dimen.burn_in_prevention_offset_x); mBurnInPreventionOffsetY = res.getDimensionPixelSize( R.dimen.burn_in_prevention_offset_y); + mDozingStackPadding = res.getDimensionPixelSize(R.dimen.dozing_stack_padding); } public void setup(int maxKeyguardNotifications, int maxPanelHeight, float expandedHeight, @@ -135,7 +137,7 @@ public class KeyguardClockPositionAlgorithm { result.stackScrollerPadding = (int) interpolate( result.stackScrollerPadding, - mClockBottom + y, + mClockBottom + y + mDozingStackPadding, mDarkAmount); result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java index d537cda00b10..15ef742af02e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java @@ -36,6 +36,7 @@ import android.util.LayoutDirection; import com.android.settingslib.R; import com.android.settingslib.Utils; +import com.android.systemui.qs.SlashDrawable; public class SignalDrawable extends Drawable { @@ -198,6 +199,11 @@ public class SignalDrawable extends Drawable { return true; } + public void setColors(int background, int foreground) { + mPaint.setColor(background); + mForegroundPaint.setColor(foreground); + } + public void setDarkIntensity(float darkIntensity) { if (darkIntensity == mOldDarkIntensity) { return; @@ -333,10 +339,9 @@ public class SignalDrawable extends Drawable { mForegroundPath.reset(); mFullPath.op(mCutPath, Path.Op.DIFFERENCE); } else if (mState == STATE_AIRPLANE) { - // Airplane mode is slashed, full-signal - mForegroundPath.set(mFullPath); - mFullPath.reset(); - mSlash.draw((int) height, (int) width, canvas, mForegroundPaint); + // Airplane mode is slashed, fully drawn background + mForegroundPath.reset(); + mSlash.draw((int) height, (int) width, canvas, mPaint); } else if (mState != STATE_CARRIER_CHANGE) { mForegroundPath.reset(); int sigWidth = Math.round(calcFit(mLevel / (mNumLevels - 1)) * (width - 2 * padding)); @@ -473,6 +478,7 @@ public class SignalDrawable extends Drawable { void draw(int height, int width, @NonNull Canvas canvas, Paint paint) { Matrix m = new Matrix(); + final float radius = scale(SlashDrawable.CORNER_RADIUS, width); updateRect( scale(LEFT, width), scale(TOP, height), @@ -481,7 +487,7 @@ public class SignalDrawable extends Drawable { mPath.reset(); // Draw the slash vertically - mPath.addRect(mSlashRect, Direction.CW); + mPath.addRoundRect(mSlashRect, radius, radius, Direction.CW); m.setRotate(ROTATION, width / 2, height / 2); mPath.transform(m); canvas.drawPath(mPath, paint); @@ -491,7 +497,7 @@ public class SignalDrawable extends Drawable { mPath.transform(m); m.setTranslate(mSlashRect.width(), 0); mPath.transform(m); - mPath.addRect(mSlashRect, Direction.CW); + mPath.addRoundRect(mSlashRect, radius, radius, Direction.CW); m.setRotate(ROTATION, width / 2, height / 2); mPath.transform(m); canvas.clipOutPath(mPath); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java index 40e3806ee3fb..ede8411f3c9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java @@ -38,6 +38,13 @@ public interface ExtensionController { * (like configuration) may have changed. */ T reload(); + + /** + * Null out the cached item for the purpose of memory saving, should only be done + * when any other references are already gotten. + * @param isDestroyed + */ + void clearItem(boolean isDestroyed); } interface ExtensionBuilder<T> { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java index b79137ea68ff..cc10775a8385 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java @@ -26,6 +26,7 @@ import com.android.systemui.plugins.PluginManager; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; +import com.android.systemui.util.leak.LeakDetector; import java.util.ArrayList; import java.util.Collections; @@ -146,7 +147,18 @@ public class ExtensionControllerImpl implements ExtensionController { return get(); } + @Override + public void clearItem(boolean isDestroyed) { + if (isDestroyed && mItem != null) { + Dependency.get(LeakDetector.class).trackGarbage(mItem); + } + mItem = null; + } + private void notifyChanged() { + if (mItem != null) { + Dependency.get(LeakDetector.class).trackGarbage(mItem); + } mItem = null; for (int i = 0; i < mProducers.size(); i++) { final T item = mProducers.get(i).get(); @@ -169,7 +181,7 @@ public class ExtensionControllerImpl implements ExtensionController { } public void addTunerFactory(TunerFactory<T> factory, String[] keys) { - mProducers.add(new TunerItem(factory, factory.keys())); + mProducers.add(new TunerItem(factory, keys)); } public void addUiMode(int uiMode, Supplier<T> mode) { diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java index ba9e60a9c927..021f9c4f438b 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java @@ -21,6 +21,7 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.SystemProperties; +import android.provider.Settings; import android.support.annotation.VisibleForTesting; import com.android.systemui.Dependency; @@ -84,12 +85,15 @@ public class GarbageMonitor { // TODO(b/35345376): Turn this back on for debuggable builds after known leak fixed. private static final boolean ENABLED = Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.enable_leak_reporting", false); + private static final String FORCE_ENABLE = "sysui_force_garbage_monitor"; private GarbageMonitor mGarbageMonitor; @Override public void start() { - if (!ENABLED) { + boolean forceEnable = Settings.Secure.getInt(mContext.getContentResolver(), + FORCE_ENABLE, 0) != 0; + if (!ENABLED && !forceEnable) { return; } mGarbageMonitor = Dependency.get(GarbageMonitor.class); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 2527c6becc5e..22fb7104267c 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -178,7 +178,13 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable { @Override public void destroy() { + mAccessibility.destroy(); mController.removeCallback(mControllerCallbackH); + if (mZenFooter != null) { + mZenFooter.cleanup(); + } + Dependency.get(TunerService.class).removeTunable(this); + mHandler.removeCallbacksAndMessages(null); } private void initDialog() { @@ -1240,16 +1246,14 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable { } }); mDialogView.setAccessibilityDelegate(this); - mAccessibilityMgr.addAccessibilityStateChangeListener( - new AccessibilityStateChangeListener() { - @Override - public void onAccessibilityStateChanged(boolean enabled) { - updateFeedbackEnabled(); - } - }); + mAccessibilityMgr.addAccessibilityStateChangeListener(mListener); updateFeedbackEnabled(); } + public void destroy() { + mAccessibilityMgr.removeAccessibilityStateChangeListener(mListener); + } + @Override public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) { @@ -1272,6 +1276,9 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable { } return false; } + + private final AccessibilityStateChangeListener mListener = + enabled -> updateFeedbackEnabled(); } private static class VolumeRow { diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index 690186e91f55..d0f0bfd88883 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -48,7 +48,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { @Test public void getColors_usesGreyIfWallpaperNotVisible() { - SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), new Tonal(), false); + SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), + new Tonal(getContext()), false); simulateEvent(extractor); extractor.setWallpaperVisible(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java index 514dc8b94de5..fe3221af418c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java @@ -38,11 +38,13 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.utils.hardware.FakeSensorManager; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest +@Ignore public class DozeScreenBrightnessTest extends SysuiTestCase { DozeServiceFake mServiceFake; diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java index daf75476b3ea..586a424cb816 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java @@ -100,6 +100,11 @@ public class FakeExtensionController implements ExtensionController { } @Override + public void clearItem(boolean isDestroyed) { + + } + + @Override public Context getContext() { return null; } diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto index 76c54185a774..885896f24283 100644 --- a/proto/src/ipconnectivity.proto +++ b/proto/src/ipconnectivity.proto @@ -23,7 +23,7 @@ message NetworkId { // It is not intended to map one to one to the TRANSPORT_* constants defined in // android.net.NetworkCapabilities. Instead it is intended to be used as // a dimension field for metrics events and aggregated metrics. -// Next tag: 7 +// Next tag: 10 enum LinkLayer { // An unknown link layer technology. UNKNOWN = 0; @@ -32,6 +32,9 @@ enum LinkLayer { CELLULAR = 2; ETHERNET = 3; WIFI = 4; + WIFI_P2P = 7; + WIFI_NAN = 8; // Also known as WiFi Aware + LOWPAN = 9; // Indicates that the link layer dimension is not relevant for the metrics or // event considered. @@ -47,16 +50,18 @@ message Pair { optional int32 value = 2; }; -// Logs changes in the system default network. Changes can be 1) acquiring a -// default network with no previous default, 2) a switch of the system default -// network to a new default network, 3) a loss of the system default network. -// This message is associated to android.net.metrics.DefaultNetworkEvent. +// An event record when the system default network disconnects or the system +// switches to a new default network. +// Next tag: 10. message DefaultNetworkEvent { - // A value of 0 means this is a loss of the system default network. - optional NetworkId network_id = 1; - // A value of 0 means there was no previous default network. - optional NetworkId previous_network_id = 2; + // Reason why this network stopped being the default. + enum LostReason { + UNKNOWN = 0; + OUTSCORED = 1; + INVALIDATION = 2; + DISCONNECT = 3; + }; // Whether the network supports IPv4, IPv6, or both. enum IPSupport { @@ -66,17 +71,52 @@ message DefaultNetworkEvent { DUAL = 3; }; + // Duration in milliseconds when this network was the default. + // Since version 4 + optional int64 default_network_duration_ms = 5; + + // Duration in milliseconds without a default network before this network + // became the default. + // Since version 4 + optional int64 no_default_network_duration_ms = 6; + + // Network score of this network when it became the default network. + // Since version 4 + optional int64 initial_score = 7; + + // Network score of this network when it stopped being the default network. + // Since version 4 + optional int64 final_score = 8; + + // Best available information about IP support of this default network. + // Since version 4 + optional IPSupport ip_support = 9; + + + // Deprecated fields + + // A value of 0 means this is a loss of the system default network. + // Deprecated since version 3. Replaced by top level network_id. + optional NetworkId network_id = 1 [deprecated = true]; + + // A value of 0 means there was no previous default network. + // Deprecated since version 3. Replaced by previous_default_network_id. + optional NetworkId previous_network_id = 2 [deprecated = true]; + // Best available information about IP support of the previous network when // disconnecting or switching to a new default network. - optional IPSupport previous_network_ip_support = 3; + // Deprecated since version 3. Replaced by ip_support field. + optional IPSupport previous_network_ip_support = 3 [deprecated = true]; // The transport types of the new default network, represented by // TRANSPORT_* constants as defined in NetworkCapabilities. - repeated int32 transport_types = 4; + // Deprecated since version 3. Replaced by top-level transports field. + repeated int32 transport_types = 4 [deprecated = true]; }; // Logs IpReachabilityMonitor probe events and NUD_FAILED events. // This message is associated to android.net.metrics.IpReachabilityEvent. +// Next tag: 3. message IpReachabilityEvent { // The interface name (wlan, rmnet, lo, ...) on which the probe was sent. // Deprecated since version 2, to be replaced by link_layer field. @@ -91,6 +131,7 @@ message IpReachabilityEvent { // Logs NetworkMonitor and ConnectivityService events related to the state of // a network: connection, evaluation, validation, lingering, and disconnection. // This message is associated to android.net.metrics.NetworkEvent. +// Next tag: 4. message NetworkEvent { // The id of the network on which this event happened. // Deprecated since version 3. @@ -108,6 +149,7 @@ message NetworkEvent { // Logs individual captive portal probing events that are performed when // evaluating or reevaluating networks for Internet connectivity. // This message is associated to android.net.metrics.ValidationProbeEvent. +// Next tag: 5. message ValidationProbeEvent { // The id of the network for which the probe was sent. // Deprecated since version 3. @@ -124,26 +166,64 @@ message ValidationProbeEvent { optional int32 probe_result = 4; } -// Logs DNS lookup latencies. Repeated fields must have the same length. +// Logs DNS lookup latencies. // This message is associated to android.net.metrics.DnsEvent. -// Deprecated since version 2. +// Next tag: 11 message DNSLookupBatch { + + // The time it took for successful DNS lookups to complete. + // The number of repeated values can be less than getaddrinfo_query_count + // + gethostbyname_query_count in case of event rate-limiting. + repeated int32 latencies_ms = 4; + + // The total number of getaddrinfo queries. + // Since version 4. + optional int64 getaddrinfo_query_count = 5; + + // The total number of gethostbyname queries. + // Since version 4. + optional int64 gethostbyname_query_count = 6; + + // The total number of getaddrinfo errors. + // Since version 4. + optional int64 getaddrinfo_error_count = 7; + + // The total number of gethostbyname errors. + // Since version 4. + optional int64 gethostbyname_error_count = 8; + + // Counts of all errors returned by getaddrinfo. + // The Pair key field is the getaddrinfo error value. + // The value field is the count for that return value. + // Since version 4 + repeated Pair getaddrinfo_errors = 9; + + // Counts of all errors returned by gethostbyname. + // The Pair key field is the gethostbyname errno value. + // the Pair value field is the count for that errno code. + // Since version 4 + repeated Pair gethostbyname_errors = 10; + + + // Deprecated fields + // The id of the network on which the DNS lookups took place. - optional NetworkId network_id = 1; + // Deprecated since version 3. + optional NetworkId network_id = 1 [deprecated = true]; // The types of the DNS lookups, as defined in android.net.metrics.DnsEvent. - repeated int32 event_types = 2; + // Deprecated since version 3. + repeated int32 event_types = 2 [deprecated = true]; // The return values of the DNS resolver for each DNS lookups. - repeated int32 return_codes = 3; - - // The time it took for each DNS lookups to complete. - repeated int32 latencies_ms = 4; + // Deprecated since version 3. + repeated int32 return_codes = 3 [deprecated = true]; }; // Represents a collections of DNS lookup latencies and counters for a // particular combination of DNS query type and return code. // Since version 2. +// Next tag: 7. message DNSLatencies { // The type of the DNS lookups, as defined in android.net.metrics.DnsEvent. // Acts as a key for a set of DNS query results. @@ -203,6 +283,7 @@ message ConnectStatistics { // state transition or a response packet parsing error. // This message is associated to android.net.metrics.DhcpClientEvent and // android.net.metrics.DhcpErrorEvent. +// Next tag: 5 message DHCPEvent { // The interface name (wlan, rmnet, lo, ...) on which the event happened. // Deprecated since version 2, to be replaced by link_layer field. @@ -255,7 +336,7 @@ message ApfProgramEvent { // Represents Router Advertisement listening statistics for an interface with // Android Packet Filter enabled. // Since version 1. -// Next tag: 12 +// Next tag: 15 message ApfStatistics { // The time interval in milliseconds these stastistics cover. optional int64 duration_ms = 1; @@ -288,12 +369,28 @@ message ApfStatistics { // The total number of APF program updates triggered when disabling the // multicast filter. Since version 3. + // Since version 4. optional int32 program_updates_allowing_multicast = 11; + + // The total number of packets processed by the APF interpreter. + // Since version 4. + optional int32 total_packet_processed = 12; + + // The total number of packets dropped by the APF interpreter. + // Since version 4. + optional int32 total_packet_dropped = 13; + + // List of hardware counters collected by the APF interpreter. + // The Pair key is the counter id, defined in android.net.metrics.ApfStats. + // The Pair value is the counter value. + // Since version 4. + repeated Pair hardware_counters = 14; } // Represents the reception of a Router Advertisement packet for an interface // with Android Packet Filter enabled. // Since version 1. +// Next tag: 7. message RaEvent { // All lifetime values are expressed in seconds. The default value for an // option lifetime that was not present in the RA option list is -1. @@ -322,6 +419,7 @@ message RaEvent { // Represents an IP provisioning event in IpManager and how long the // provisioning action took. // This message is associated to android.net.metrics.IpManagerEvent. +// Next tag: 4. message IpProvisioningEvent { // The interface name (wlan, rmnet, lo, ...) on which the probe was sent. // Deprecated since version 2, to be replaced by link_layer field. @@ -335,8 +433,48 @@ message IpProvisioningEvent { optional int32 latency_ms = 3; } +// Represents statistics from a single android Network. +// Since version 4. Replace NetworkEvent. +// Next tag: 9. +message NetworkStats { + + // Duration of this Network lifecycle in milliseconds. + optional int64 duration_ms = 1; + + // Information about IP support of this network. + optional DefaultNetworkEvent.IPSupport ip_support = 2; + + // True if the network was validated at least once. + optional bool ever_validated = 3; + + // True if a captive portal was found at least once on this network. + optional bool portal_found = 4; + + // Total number of times no connectivity was reported for this network. + optional int32 no_connectivity_reports = 5; + + // Total number of validation attempts. + optional int32 validation_attempts = 6; + + // Results from all validation attempts. + // The Pair key is the result: + // 0 -> unvalidated + // 1 -> validated + // 2 -> captive portal + // The Pair value is the duration of the validation attempts in milliseconds. + repeated Pair validation_events = 7; + + // Time series of validation states in time order. + // The Pair key is the state: + // 0 -> unvalidated + // 1 -> validated + // 2 -> captive portal, + // The Pair value is the duration of that state in milliseconds. + repeated Pair validation_states = 8; +} + // Represents one of the IP connectivity event defined in this file. -// Next tag: 19 +// Next tag: 20 message IpConnectivityEvent { // Time in ms when the event was recorded. optional int64 time_ms = 1; @@ -370,14 +508,13 @@ message IpConnectivityEvent { oneof event { // An event about the system default network. - // The link_layer field is not relevant for this event and set to NONE. DefaultNetworkEvent default_network_event = 2; // An IP reachability probe event. IpReachabilityEvent ip_reachability_event = 3; // A network lifecycle event. - NetworkEvent network_event = 4; + NetworkEvent network_event = 4 [deprecated = true]; // A batch of DNS lookups. // Deprecated in the nyc-mr2 release since version 2,and replaced by @@ -407,10 +544,14 @@ message IpConnectivityEvent { // An RA packet reception event. RaEvent ra_event = 11; + + // Network statistics. + NetworkStats network_stats = 19; }; }; // The information about IP connectivity events. +// Next tag: 4. message IpConnectivityLog { // An array of IP connectivity events. repeated IpConnectivityEvent events = 1; @@ -424,5 +565,6 @@ message IpConnectivityLog { // nyc-mr1: not populated, implicitly 1. // nyc-mr2: 2. // oc: 3. + // oc-dr1: 4. (sailfish, marlin, walleye, taimen) optional int32 version = 3; }; diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 829217868f84..53190869513b 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -138,6 +138,18 @@ message MetricsEvent { REASON_TIMEOUT = 19; } + // Subtypes of camera events for ACTION_CAMERA_EVENT + enum CameraEvent { + // A back-facing camera was used + CAMERA_BACK_USED = 0; + + // A front-facing camera was used + CAMERA_FRONT_USED = 1; + + // An external camera was used + CAMERA_EXTERNAL_USED = 2; + } + // Known visual elements: views or controls. enum View { // Unknown view @@ -4196,6 +4208,12 @@ message MetricsEvent { // OS: O DR DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET = 1031; + // An event from the camera service + // CATEGORY: OTHER + // SUBTYPE: CameraEvent + // OS: O DR + ACTION_CAMERA_EVENT = 1032; + // ---- End O-DR1 Constants, all O-DR1 constants go above this line ---- // ACTION: Settings > Network & Internet > Mobile network > Mobile data diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java index 8b15d506dab7..67ee1858f583 100644 --- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java +++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java @@ -163,7 +163,8 @@ public final class AutoFillUI { @Nullable String filterText, @NonNull String packageName, @NonNull AutoFillUiCallback callback) { if (sDebug) { - Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + filterText); + final int size = filterText == null ? 0 : filterText.length(); + Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + size + " chars"); } final LogMaker log = (new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_FILL_UI)) .setPackageName(packageName) diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index 51a239f62be5..24f3b339b761 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -204,7 +204,10 @@ final class FillUi { return; } if (count <= 0) { - if (sDebug) Slog.d(TAG, "No dataset matches filter: " + mFilterText); + if (sDebug) { + final int size = mFilterText == null ? 0 : mFilterText.length(); + Slog.d(TAG, "No dataset matches filter with " + size + " chars"); + } mCallback.requestHideFillUi(); } else { if (updateContentSize()) { diff --git a/services/backup/java/com/android/server/backup/BackupPasswordManager.java b/services/backup/java/com/android/server/backup/BackupPasswordManager.java new file mode 100644 index 000000000000..ee7651b0a087 --- /dev/null +++ b/services/backup/java/com/android/server/backup/BackupPasswordManager.java @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup; + +import android.content.Context; +import android.util.Slog; + +import com.android.server.backup.utils.DataStreamFileCodec; +import com.android.server.backup.utils.DataStreamCodec; +import com.android.server.backup.utils.PasswordUtils; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.security.SecureRandom; + +/** + * Manages persisting and verifying backup passwords. + * + * <p>Does not persist the password itself, but persists a PBKDF2 hash with a randomly chosen (also + * persisted) salt. Validation is performed by running the challenge text through the same + * PBKDF2 cycle with the persisted salt, and checking the hashes match. + * + * @see PasswordUtils for the hashing algorithm. + */ +public final class BackupPasswordManager { + private static final String TAG = "BackupPasswordManager"; + private static final boolean DEBUG = false; + + private static final int BACKUP_PW_FILE_VERSION = 2; + private static final int DEFAULT_PW_FILE_VERSION = 1; + + private static final String PASSWORD_VERSION_FILE_NAME = "pwversion"; + private static final String PASSWORD_HASH_FILE_NAME = "pwhash"; + + // See https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html + public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1"; + public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit"; + + private final SecureRandom mRng; + private final Context mContext; + private final File mBaseStateDir; + + private String mPasswordHash; + private int mPasswordVersion; + private byte[] mPasswordSalt; + + /** + * Creates an instance enforcing permissions using the {@code context} and persisting password + * data within the {@code baseStateDir}. + * + * @param context The context, for enforcing permissions around setting the password. + * @param baseStateDir A directory within which to persist password data. + * @param secureRandom Random number generator with which to generate password salts. + */ + BackupPasswordManager(Context context, File baseStateDir, SecureRandom secureRandom) { + mContext = context; + mRng = secureRandom; + mBaseStateDir = baseStateDir; + loadStateFromFilesystem(); + } + + /** + * Returns {@code true} if a password for backup is set. + * + * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP} + * permission. + */ + boolean hasBackupPassword() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "hasBackupPassword"); + return mPasswordHash != null && mPasswordHash.length() > 0; + } + + /** + * Returns {@code true} if {@code password} matches the persisted password. + * + * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP} + * permission. + */ + boolean backupPasswordMatches(String password) { + if (hasBackupPassword() && !passwordMatchesSaved(password)) { + if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting"); + return false; + } + return true; + } + + /** + * Sets the new password, given a correct current password. + * + * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP} + * permission. + * @return {@code true} if has permission to set the password, {@code currentPassword} + * matches the currently persisted password, and is able to persist {@code newPassword}. + */ + boolean setBackupPassword(String currentPassword, String newPassword) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "setBackupPassword"); + + if (!passwordMatchesSaved(currentPassword)) { + return false; + } + + // Snap up to latest password file version. + try { + getPasswordVersionFileCodec().serialize(BACKUP_PW_FILE_VERSION); + mPasswordVersion = BACKUP_PW_FILE_VERSION; + } catch (IOException e) { + Slog.e(TAG, "Unable to write backup pw version; password not changed"); + return false; + } + + if (newPassword == null || newPassword.isEmpty()) { + return clearPassword(); + } + + try { + byte[] salt = randomSalt(); + String newPwHash = PasswordUtils.buildPasswordHash( + PBKDF_CURRENT, newPassword, salt, PasswordUtils.PBKDF2_HASH_ROUNDS); + + getPasswordHashFileCodec().serialize(new BackupPasswordHash(newPwHash, salt)); + mPasswordHash = newPwHash; + mPasswordSalt = salt; + return true; + } catch (IOException e) { + Slog.e(TAG, "Unable to set backup password"); + } + return false; + } + + /** + * Returns {@code true} if should try salting using the older PBKDF algorithm. + * + * <p>This is {@code true} for v1 files. + */ + private boolean usePbkdf2Fallback() { + return mPasswordVersion < BACKUP_PW_FILE_VERSION; + } + + /** + * Deletes the current backup password. + * + * @return {@code true} if successful. + */ + private boolean clearPassword() { + File passwordHashFile = getPasswordHashFile(); + if (passwordHashFile.exists() && !passwordHashFile.delete()) { + Slog.e(TAG, "Unable to clear backup password"); + return false; + } + + mPasswordHash = null; + mPasswordSalt = null; + return true; + } + + /** + * Sets the password hash, salt, and version in the object from what has been persisted to the + * filesystem. + */ + private void loadStateFromFilesystem() { + try { + mPasswordVersion = getPasswordVersionFileCodec().deserialize(); + } catch (IOException e) { + Slog.e(TAG, "Unable to read backup pw version"); + mPasswordVersion = DEFAULT_PW_FILE_VERSION; + } + + try { + BackupPasswordHash hash = getPasswordHashFileCodec().deserialize(); + mPasswordHash = hash.hash; + mPasswordSalt = hash.salt; + } catch (IOException e) { + Slog.e(TAG, "Unable to read saved backup pw hash"); + } + } + + /** + * Whether the candidate password matches the current password. If the persisted password is an + * older version, attempts hashing using the older algorithm. + * + * @param candidatePassword The password to try. + * @return {@code true} if the passwords match. + */ + private boolean passwordMatchesSaved(String candidatePassword) { + return passwordMatchesSaved(PBKDF_CURRENT, candidatePassword) + || (usePbkdf2Fallback() && passwordMatchesSaved(PBKDF_FALLBACK, candidatePassword)); + } + + /** + * Returns {@code true} if the candidate password is correct. + * + * @param algorithm The algorithm used to hash passwords. + * @param candidatePassword The candidate password to compare to the current password. + * @return {@code true} if the candidate password matched the saved password. + */ + private boolean passwordMatchesSaved(String algorithm, String candidatePassword) { + if (mPasswordHash == null) { + return candidatePassword == null || candidatePassword.equals(""); + } else if (candidatePassword == null || candidatePassword.length() == 0) { + // The current password is not zero-length, but the candidate password is. + return false; + } else { + String candidatePasswordHash = PasswordUtils.buildPasswordHash( + algorithm, candidatePassword, mPasswordSalt, PasswordUtils.PBKDF2_HASH_ROUNDS); + return mPasswordHash.equalsIgnoreCase(candidatePasswordHash); + } + } + + private byte[] randomSalt() { + int bitsPerByte = 8; + byte[] array = new byte[PasswordUtils.PBKDF2_SALT_SIZE / bitsPerByte]; + mRng.nextBytes(array); + return array; + } + + private DataStreamFileCodec<Integer> getPasswordVersionFileCodec() { + return new DataStreamFileCodec<>( + new File(mBaseStateDir, PASSWORD_VERSION_FILE_NAME), + new PasswordVersionFileCodec()); + } + + private DataStreamFileCodec<BackupPasswordHash> getPasswordHashFileCodec() { + return new DataStreamFileCodec<>(getPasswordHashFile(), new PasswordHashFileCodec()); + } + + private File getPasswordHashFile() { + return new File(mBaseStateDir, PASSWORD_HASH_FILE_NAME); + } + + /** + * Container class for a PBKDF hash and the salt used to create the hash. + */ + private static final class BackupPasswordHash { + public String hash; + public byte[] salt; + + BackupPasswordHash(String hash, byte[] salt) { + this.hash = hash; + this.salt = salt; + } + } + + /** + * The password version file contains a single 32-bit integer. + */ + private static final class PasswordVersionFileCodec implements + DataStreamCodec<Integer> { + @Override + public void serialize(Integer integer, DataOutputStream dataOutputStream) + throws IOException { + dataOutputStream.write(integer); + } + + @Override + public Integer deserialize(DataInputStream dataInputStream) throws IOException { + return dataInputStream.readInt(); + } + } + + /** + * The passwords hash file contains + * + * <ul> + * <li>A 32-bit integer representing the number of bytes in the salt; + * <li>The salt bytes; + * <li>A UTF-8 string of the hash. + * </ul> + */ + private static final class PasswordHashFileCodec implements + DataStreamCodec<BackupPasswordHash> { + @Override + public void serialize(BackupPasswordHash backupPasswordHash, + DataOutputStream dataOutputStream) throws IOException { + dataOutputStream.writeInt(backupPasswordHash.salt.length); + dataOutputStream.write(backupPasswordHash.salt); + dataOutputStream.writeUTF(backupPasswordHash.hash); + } + + @Override + public BackupPasswordHash deserialize( + DataInputStream dataInputStream) throws IOException { + int saltLen = dataInputStream.readInt(); + byte[] salt = new byte[saltLen]; + dataInputStream.readFully(salt); + String hash = dataInputStream.readUTF(); + return new BackupPasswordHash(hash, salt); + } + } +} diff --git a/services/backup/java/com/android/server/backup/DataChangedJournal.java b/services/backup/java/com/android/server/backup/DataChangedJournal.java new file mode 100644 index 000000000000..9360c85aed33 --- /dev/null +++ b/services/backup/java/com/android/server/backup/DataChangedJournal.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup; + +import android.annotation.Nullable; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; + +/** + * A journal of packages that have indicated that their data has changed (and therefore should be + * backed up in the next scheduled K/V backup pass). + * + * <p>This information is persisted to the filesystem so that it is not lost in the event of a + * reboot. + */ +public final class DataChangedJournal { + private static final String FILE_NAME_PREFIX = "journal"; + + /** + * Journals tend to be on the order of a few kilobytes, hence setting the buffer size to 8kb. + */ + private static final int BUFFER_SIZE_BYTES = 8 * 1024; + + private final File mFile; + + /** + * Constructs an instance that reads from and writes to the given file. + */ + DataChangedJournal(File file) { + mFile = file; + } + + /** + * Adds the given package to the journal. + * + * @param packageName The name of the package whose data has changed. + * @throws IOException if there is an IO error writing to the journal file. + */ + public void addPackage(String packageName) throws IOException { + try (RandomAccessFile out = new RandomAccessFile(mFile, "rws")) { + out.seek(out.length()); + out.writeUTF(packageName); + } + } + + /** + * Invokes {@link Consumer#accept(String)} with every package name in the journal file. + * + * @param consumer The callback. + * @throws IOException If there is an IO error reading from the file. + */ + public void forEach(Consumer consumer) throws IOException { + try ( + BufferedInputStream bufferedInputStream = new BufferedInputStream( + new FileInputStream(mFile), BUFFER_SIZE_BYTES); + DataInputStream dataInputStream = new DataInputStream(bufferedInputStream) + ) { + while (dataInputStream.available() > 0) { + String packageName = dataInputStream.readUTF(); + consumer.accept(packageName); + } + } + } + + /** + * Deletes the journal from the filesystem. + * + * @return {@code true} if successfully deleted journal. + */ + public boolean delete() { + return mFile.delete(); + } + + @Override + public boolean equals(@Nullable Object object) { + if (object instanceof DataChangedJournal) { + DataChangedJournal that = (DataChangedJournal) object; + try { + return this.mFile.getCanonicalPath().equals(that.mFile.getCanonicalPath()); + } catch (IOException exception) { + return false; + } + } + return false; + } + + @Override + public String toString() { + return mFile.toString(); + } + + /** + * Consumer for iterating over package names in the journal. + */ + @FunctionalInterface + public interface Consumer { + void accept(String packageName); + } + + /** + * Creates a new journal with a random file name in the given journal directory. + * + * @param journalDirectory The directory where journals are kept. + * @return The journal. + * @throws IOException if there is an IO error creating the file. + */ + static DataChangedJournal newJournal(File journalDirectory) throws IOException { + return new DataChangedJournal( + File.createTempFile(FILE_NAME_PREFIX, null, journalDirectory)); + } + + /** + * Returns a list of journals in the given journal directory. + */ + static ArrayList<DataChangedJournal> listJournals(File journalDirectory) { + ArrayList<DataChangedJournal> journals = new ArrayList<>(); + for (File file : journalDirectory.listFiles()) { + journals.add(new DataChangedJournal(file)); + } + return journals; + } +} diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java index 7e28f610e565..c760806aa717 100644 --- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java @@ -32,6 +32,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_RUN_CLEAR; import static com.android.server.backup.internal.BackupHandler.MSG_RUN_RESTORE; import static com.android.server.backup.internal.BackupHandler.MSG_SCHEDULE_BACKUP_PACKAGE; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.AppGlobals; @@ -118,12 +119,14 @@ import com.android.server.backup.utils.AppBackupUtils; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupObserverUtils; import com.android.server.backup.utils.PasswordUtils; +import com.android.server.backup.utils.SparseArrayUtils; import com.android.server.power.BatterySaverPolicy.ServiceType; import libcore.io.IoUtils; +import com.google.android.collect.Sets; + import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -135,7 +138,6 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.security.SecureRandom; @@ -169,10 +171,6 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter // with U+FF00 or higher for system use). public static final String KEY_WIDGET_STATE = "\uffed\uffedwidget"; - // Historical and current algorithm names - public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1"; - public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit"; - // Name and current contents version of the full-backup manifest file // // Manifest version history: @@ -190,7 +188,6 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter // 5 : added support for key-value packages public static final int BACKUP_FILE_VERSION = 5; public static final String BACKUP_FILE_HEADER_MAGIC = "ANDROID BACKUP\n"; - private static final int BACKUP_PW_FILE_VERSION = 2; public static final String BACKUP_METADATA_FILENAME = "_meta"; public static final int BACKUP_METADATA_VERSION = 1; public static final int BACKUP_WIDGET_METADATA_TOKEN = 0x01FFED01; @@ -283,6 +280,8 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter private final Object mClearDataLock = new Object(); private volatile boolean mClearingData; + private final BackupPasswordManager mBackupPasswordManager; + @GuardedBy("mPendingRestores") private boolean mIsRestoreInProgress; @GuardedBy("mPendingRestores") @@ -482,11 +481,11 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter mDataDir = dataDir; } - public File getJournal() { + public DataChangedJournal getJournal() { return mJournal; } - public void setJournal(File journal) { + public void setJournal(@Nullable DataChangedJournal journal) { mJournal = journal; } @@ -630,20 +629,9 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter private File mBaseStateDir; private File mDataDir; private File mJournalDir; - private File mJournal; - - // Backup password, if any, and the file where it's saved. What is stored is not the - // password text itself; it's the result of a PBKDF2 hash with a randomly chosen (but - // persisted) salt. Validation is performed by running the challenge text through the - // same PBKDF2 cycle with the persisted salt; if the resulting derived key string matches - // the saved hash string, then the challenge text matches the originally supplied - // password text. + @Nullable private DataChangedJournal mJournal; + private final SecureRandom mRng = new SecureRandom(); - private String mPasswordHash; - private File mPasswordHashFile; - private int mPasswordVersion; - private File mPasswordVersionFile; - private byte[] mPasswordSalt; // Keep a log of all the apps we've ever backed up, and what the // dataset tokens are for both the current backup dataset and @@ -745,52 +733,7 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter // This dir on /cache is managed directly in init.rc mDataDir = new File(Environment.getDownloadCacheDirectory(), "backup_stage"); - mPasswordVersion = 1; // unless we hear otherwise - mPasswordVersionFile = new File(mBaseStateDir, "pwversion"); - if (mPasswordVersionFile.exists()) { - FileInputStream fin = null; - DataInputStream in = null; - try { - fin = new FileInputStream(mPasswordVersionFile); - in = new DataInputStream(fin); - mPasswordVersion = in.readInt(); - } catch (IOException e) { - Slog.e(TAG, "Unable to read backup pw version"); - } finally { - try { - if (in != null) in.close(); - if (fin != null) fin.close(); - } catch (IOException e) { - Slog.w(TAG, "Error closing pw version files"); - } - } - } - - mPasswordHashFile = new File(mBaseStateDir, "pwhash"); - if (mPasswordHashFile.exists()) { - FileInputStream fin = null; - DataInputStream in = null; - try { - fin = new FileInputStream(mPasswordHashFile); - in = new DataInputStream(new BufferedInputStream(fin)); - // integer length of the salt array, followed by the salt, - // then the hex pw hash string - int saltLen = in.readInt(); - byte[] salt = new byte[saltLen]; - in.readFully(salt); - mPasswordHash = in.readUTF(); - mPasswordSalt = salt; - } catch (IOException e) { - Slog.e(TAG, "Unable to read saved backup pw hash"); - } finally { - try { - if (in != null) in.close(); - if (fin != null) fin.close(); - } catch (IOException e) { - Slog.w(TAG, "Unable to close streams"); - } - } - } + mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng); // Alarm receivers for scheduled backups & initialization operations mRunBackupReceiver = new RunBackupReceiver(this); @@ -1105,35 +1048,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter } private void parseLeftoverJournals() { - for (File f : mJournalDir.listFiles()) { - if (mJournal == null || f.compareTo(mJournal) != 0) { - // This isn't the current journal, so it must be a leftover. Read - // out the package names mentioned there and schedule them for - // backup. - DataInputStream in = null; + ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(mJournalDir); + for (DataChangedJournal journal : journals) { + if (!journal.equals(mJournal)) { try { - Slog.i(TAG, "Found stale backup journal, scheduling"); - // Journals will tend to be on the order of a few kilobytes(around 4k), hence, - // setting the buffer size to 8192. - InputStream bufferedInputStream = new BufferedInputStream( - new FileInputStream(f), 8192); - in = new DataInputStream(bufferedInputStream); - while (true) { - String packageName = in.readUTF(); + journal.forEach(packageName -> { + Slog.i(TAG, "Found stale backup journal, scheduling"); if (MORE_DEBUG) Slog.i(TAG, " " + packageName); dataChangedImpl(packageName); - } - } catch (EOFException e) { - // no more data; we're done - } catch (Exception e) { - Slog.e(TAG, "Can't read " + f, e); - } finally { - // close/delete the file - try { - if (in != null) in.close(); - } catch (IOException e) { - } - f.delete(); + }); + } catch (IOException e) { + Slog.e(TAG, "Can't read " + journal, e); } } } @@ -1146,128 +1071,18 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter return array; } - private boolean passwordMatchesSaved(String algorithm, String candidatePw, int rounds) { - if (mPasswordHash == null) { - // no current password case -- require that 'currentPw' be null or empty - if (candidatePw == null || "".equals(candidatePw)) { - return true; - } // else the non-empty candidate does not match the empty stored pw - } else { - // hash the stated current pw and compare to the stored one - if (candidatePw != null && candidatePw.length() > 0) { - String currentPwHash = PasswordUtils.buildPasswordHash(algorithm, candidatePw, - mPasswordSalt, - rounds); - if (mPasswordHash.equalsIgnoreCase(currentPwHash)) { - // candidate hash matches the stored hash -- the password matches - return true; - } - } // else the stored pw is nonempty but the candidate is empty; no match - } - return false; - } - @Override public boolean setBackupPassword(String currentPw, String newPw) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, - "setBackupPassword"); - - // When processing v1 passwords we may need to try two different PBKDF2 checksum regimes - final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION); - - // If the supplied pw doesn't hash to the the saved one, fail. The password - // might be caught in the legacy crypto mismatch; verify that too. - if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS) - && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK, - currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) { - return false; - } - - // Snap up to current on the pw file version - mPasswordVersion = BACKUP_PW_FILE_VERSION; - FileOutputStream pwFout = null; - DataOutputStream pwOut = null; - try { - pwFout = new FileOutputStream(mPasswordVersionFile); - pwOut = new DataOutputStream(pwFout); - pwOut.writeInt(mPasswordVersion); - } catch (IOException e) { - Slog.e(TAG, "Unable to write backup pw version; password not changed"); - return false; - } finally { - try { - if (pwOut != null) pwOut.close(); - if (pwFout != null) pwFout.close(); - } catch (IOException e) { - Slog.w(TAG, "Unable to close pw version record"); - } - } - - // Clearing the password is okay - if (newPw == null || newPw.isEmpty()) { - if (mPasswordHashFile.exists()) { - if (!mPasswordHashFile.delete()) { - // Unable to delete the old pw file, so fail - Slog.e(TAG, "Unable to clear backup password"); - return false; - } - } - mPasswordHash = null; - mPasswordSalt = null; - return true; - } - - try { - // Okay, build the hash of the new backup password - byte[] salt = randomBytes(PasswordUtils.PBKDF2_SALT_SIZE); - String newPwHash = PasswordUtils.buildPasswordHash(PBKDF_CURRENT, newPw, salt, - PasswordUtils.PBKDF2_HASH_ROUNDS); - - OutputStream pwf = null, buffer = null; - DataOutputStream out = null; - try { - pwf = new FileOutputStream(mPasswordHashFile); - buffer = new BufferedOutputStream(pwf); - out = new DataOutputStream(buffer); - // integer length of the salt array, followed by the salt, - // then the hex pw hash string - out.writeInt(salt.length); - out.write(salt); - out.writeUTF(newPwHash); - out.flush(); - mPasswordHash = newPwHash; - mPasswordSalt = salt; - return true; - } finally { - if (out != null) out.close(); - if (buffer != null) buffer.close(); - if (pwf != null) pwf.close(); - } - } catch (IOException e) { - Slog.e(TAG, "Unable to set backup password"); - } - return false; + return mBackupPasswordManager.setBackupPassword(currentPw, newPw); } @Override public boolean hasBackupPassword() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, - "hasBackupPassword"); - - return mPasswordHash != null && mPasswordHash.length() > 0; + return mBackupPasswordManager.hasBackupPassword(); } public boolean backupPasswordMatches(String currentPw) { - if (hasBackupPassword()) { - final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION); - if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS) - && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK, - currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) { - if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting"); - return false; - } - } - return true; + return mBackupPasswordManager.backupPasswordMatches(currentPw); } // Maintain persistent state around whether need to do an initialize operation. @@ -2489,38 +2304,22 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter } // a caller with full permission can ask to back up any participating app - HashSet<String> targets = new HashSet<>(); if (PACKAGE_MANAGER_SENTINEL.equals(packageName)) { - targets.add(PACKAGE_MANAGER_SENTINEL); + return Sets.newHashSet(PACKAGE_MANAGER_SENTINEL); } else { synchronized (mBackupParticipants) { - int N = mBackupParticipants.size(); - for (int i = 0; i < N; i++) { - HashSet<String> s = mBackupParticipants.valueAt(i); - if (s != null) { - targets.addAll(s); - } - } + return SparseArrayUtils.union(mBackupParticipants); } } - return targets; } private void writeToJournalLocked(String str) { - RandomAccessFile out = null; try { - if (mJournal == null) mJournal = File.createTempFile("journal", null, mJournalDir); - out = new RandomAccessFile(mJournal, "rws"); - out.seek(out.length()); - out.writeUTF(str); + if (mJournal == null) mJournal = DataChangedJournal.newJournal(mJournalDir); + mJournal.addPackage(str); } catch (IOException e) { Slog.e(TAG, "Can't write " + str + " to backup journal", e); mJournal = null; - } finally { - try { - if (out != null) out.close(); - } catch (IOException e) { - } } } @@ -2595,14 +2394,7 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter // a caller with full permission can ask to back up any participating app // !!! TODO: allow data-clear of ANY app? if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps"); - apps = new HashSet<>(); - int N = mBackupParticipants.size(); - for (int i = 0; i < N; i++) { - HashSet<String> s = mBackupParticipants.valueAt(i); - if (s != null) { - apps.addAll(s); - } - } + apps = SparseArrayUtils.union(mBackupParticipants); } // Is the given app an available participant? diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java index 007d9309c188..804e92c88eb7 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java @@ -16,11 +16,11 @@ package com.android.server.backup.fullbackup; +import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT; import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC; import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION; import static com.android.server.backup.RefactoredBackupManagerService.DEBUG; import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG; -import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT; import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE; import static com.android.server.backup.RefactoredBackupManagerService.TAG; diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index edd389403f02..8f823004d993 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -36,6 +36,7 @@ import android.util.Slog; import com.android.internal.backup.IBackupTransport; import com.android.server.EventLogTags; import com.android.server.backup.BackupRestoreTask; +import com.android.server.backup.DataChangedJournal; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.fullbackup.PerformAdbBackupTask; import com.android.server.backup.fullbackup.PerformFullTransportBackupTask; @@ -107,7 +108,7 @@ public class BackupHandler extends Handler { // snapshot the pending-backup set and work on that ArrayList<BackupRequest> queue = new ArrayList<>(); - File oldJournal = backupManagerService.getJournal(); + DataChangedJournal oldJournal = backupManagerService.getJournal(); synchronized (backupManagerService.getQueueLock()) { // Do we have any work to do? Construct the work queue // then release the synchronization lock to actually run diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java index a996e2d96492..5d4fcf4c16d9 100644 --- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java +++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java @@ -28,6 +28,7 @@ import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_B import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT; import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP; +import android.annotation.Nullable; import android.app.ApplicationThreadConstants; import android.app.IBackupAgent; import android.app.backup.BackupDataInput; @@ -57,6 +58,7 @@ import com.android.internal.backup.IBackupTransport; import com.android.server.AppWidgetBackupBridge; import com.android.server.EventLogTags; import com.android.server.backup.BackupRestoreTask; +import com.android.server.backup.DataChangedJournal; import com.android.server.backup.KeyValueBackupJob; import com.android.server.backup.PackageManagerBackupAgent; import com.android.server.backup.RefactoredBackupManagerService; @@ -114,7 +116,7 @@ public class PerformBackupTask implements BackupRestoreTask { ArrayList<BackupRequest> mQueue; ArrayList<BackupRequest> mOriginalQueue; File mStateDir; - File mJournal; + @Nullable DataChangedJournal mJournal; BackupState mCurrentState; List<String> mPendingFullBackups; IBackupObserver mObserver; @@ -142,9 +144,9 @@ public class PerformBackupTask implements BackupRestoreTask { public PerformBackupTask(RefactoredBackupManagerService backupManagerService, IBackupTransport transport, String dirName, - ArrayList<BackupRequest> queue, File journal, IBackupObserver observer, - IBackupManagerMonitor monitor, List<String> pendingFullBackups, - boolean userInitiated, boolean nonIncremental) { + ArrayList<BackupRequest> queue, @Nullable DataChangedJournal journal, + IBackupObserver observer, IBackupManagerMonitor monitor, + List<String> pendingFullBackups, boolean userInitiated, boolean nonIncremental) { this.backupManagerService = backupManagerService; mTransport = transport; mOriginalQueue = queue; diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java index b1d6afcbd63c..62ae065be1ac 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java @@ -16,6 +16,8 @@ package com.android.server.backup.restore; +import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT; +import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK; import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC; import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION; import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_MANIFEST_FILENAME; @@ -23,8 +25,6 @@ import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_ME import static com.android.server.backup.RefactoredBackupManagerService.DEBUG; import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG; import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_RESTORE_WAIT; -import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT; -import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_FALLBACK; import static com.android.server.backup.RefactoredBackupManagerService.SETTINGS_PACKAGE; import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE; import static com.android.server.backup.RefactoredBackupManagerService.TAG; diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java new file mode 100644 index 000000000000..b1e226d5999c --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup.utils; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Implements how to serialize a {@code T} to a {@link DataOutputStream} and how to deserialize a + * {@code T} from a {@link DataInputStream}. + * + * @param <T> Type of object to be serialized / deserialized. + */ +public interface DataStreamCodec<T> { + /** + * Serializes {@code t} to {@code dataOutputStream}. + */ + void serialize(T t, DataOutputStream dataOutputStream) throws IOException; + + /** + * Deserializes {@code t} from {@code dataInputStream}. + */ + T deserialize(DataInputStream dataInputStream) throws IOException; +} + diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java new file mode 100644 index 000000000000..7753b0370279 --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup.utils; + +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Provides an interface for serializing an object to a file and deserializing it back again. + * + * <p>Serialization logic is implemented as a {@link DataStreamCodec}. + * + * @param <T> The type of object to serialize / deserialize. + */ +public final class DataStreamFileCodec<T> { + private final File mFile; + private final DataStreamCodec<T> mCodec; + + /** + * Constructs an instance to serialize to or deserialize from the given file, with the given + * serialization / deserialization strategy. + */ + public DataStreamFileCodec(File file, DataStreamCodec<T> codec) { + mFile = file; + mCodec = codec; + } + + /** + * Deserializes a {@code T} from the file, automatically closing input streams. + * + * @return The deserialized object. + * @throws IOException if an IO error occurred. + */ + public T deserialize() throws IOException { + try ( + FileInputStream fileInputStream = new FileInputStream(mFile); + DataInputStream dataInputStream = new DataInputStream(fileInputStream) + ) { + return mCodec.deserialize(dataInputStream); + } + } + + /** + * Serializes {@code t} to the file, automatically flushing and closing output streams. + * + * @param t The object to serialize. + * @throws IOException if an IO error occurs. + */ + public void serialize(T t) throws IOException { + try ( + FileOutputStream fileOutputStream = new FileOutputStream(mFile); + BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); + DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream) + ) { + mCodec.serialize(t, dataOutputStream); + dataOutputStream.flush(); + } + } +} diff --git a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java index 12fc927315c2..9c5e28393a53 100644 --- a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java +++ b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java @@ -123,8 +123,7 @@ public class PasswordUtils { int rounds) { try { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); - KeySpec - ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE); + KeySpec ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE); return keyFactory.generateSecret(ks); } catch (InvalidKeySpecException e) { Slog.e(TAG, "Invalid key spec for PBKDF2!"); diff --git a/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java new file mode 100644 index 000000000000..954d714f6d60 --- /dev/null +++ b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup.utils; + +import android.util.SparseArray; + +import java.util.HashSet; + +/** + * Helper functions for manipulating instances of {@link SparseArray}. + */ +public final class SparseArrayUtils { + // Statics only + private SparseArrayUtils() {} + + /** + * Given a {@link SparseArray<HashSet>}, returns a new {@link HashSet} containing every element + * from every set in the array. + * + * @param sets The array of sets from which to take the union. + * @param <V> The type of element contained in the set. + * @return The complete set. + */ + public static<V> HashSet<V> union(SparseArray<HashSet<V>> sets) { + HashSet<V> unionSet = new HashSet<>(); + int n = sets.size(); + for (int i = 0; i < n; i++) { + HashSet<V> ithSet = sets.valueAt(i); + if (ithSet != null) { + unionSet.addAll(ithSet); + } + } + return unionSet; + } +} diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index f47b0d3c6e73..f2f01cfa19b0 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -57,6 +57,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.provider.SettingsStringUtil.ComponentNameSet; import android.text.BidiFormatter; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.ExceptionUtils; import android.util.Log; @@ -83,6 +84,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; @@ -247,9 +249,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind throws RemoteException { checkCallerIsSystemOr(callingPackage, userId); checkUsesFeature(callingPackage, getCallingUserId()); - return CollectionUtils.map( + return new ArrayList<>(CollectionUtils.map( readAllAssociations(userId, callingPackage), - a -> a.deviceAddress); + a -> a.deviceAddress)); } //TODO also revoke notification access @@ -495,20 +497,20 @@ public class CompanionDeviceManagerService extends SystemService implements Bind new Association(userId, deviceAddress, priviledgedPackage))); } - private void updateAssociations(Function<List<Association>, List<Association>> update) { + private void updateAssociations(Function<Set<Association>, Set<Association>> update) { updateAssociations(update, getCallingUserId()); } - private void updateAssociations(Function<List<Association>, List<Association>> update, + private void updateAssociations(Function<Set<Association>, Set<Association>> update, int userId) { final AtomicFile file = getStorageFileForUser(userId); synchronized (file) { - List<Association> associations = readAllAssociations(userId); - final List<Association> old = CollectionUtils.copyOf(associations); + Set<Association> associations = readAllAssociations(userId); + final Set<Association> old = CollectionUtils.copyOf(associations); associations = update.apply(associations); if (size(old) == size(associations)) return; - List<Association> finalAssociations = associations; + Set<Association> finalAssociations = associations; file.write((out) -> { XmlSerializer xml = Xml.newSerializer(); try { @@ -517,13 +519,12 @@ public class CompanionDeviceManagerService extends SystemService implements Bind xml.startDocument(null, true); xml.startTag(null, XML_TAG_ASSOCIATIONS); - for (int i = 0; i < size(finalAssociations); i++) { - Association association = finalAssociations.get(i); + CollectionUtils.forEach(finalAssociations, association -> { xml.startTag(null, XML_TAG_ASSOCIATION) - .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage) - .attribute(null, XML_ATTR_DEVICE, association.deviceAddress) - .endTag(null, XML_TAG_ASSOCIATION); - } + .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage) + .attribute(null, XML_ATTR_DEVICE, association.deviceAddress) + .endTag(null, XML_TAG_ASSOCIATION); + }); xml.endTag(null, XML_TAG_ASSOCIATIONS); xml.endDocument(); @@ -545,17 +546,17 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } @Nullable - private ArrayList<Association> readAllAssociations(int userId) { + private Set<Association> readAllAssociations(int userId) { return readAllAssociations(userId, null); } @Nullable - private ArrayList<Association> readAllAssociations(int userId, @Nullable String packageFilter) { + private Set<Association> readAllAssociations(int userId, @Nullable String packageFilter) { final AtomicFile file = getStorageFileForUser(userId); if (!file.getBaseFile().exists()) return null; - ArrayList<Association> result = null; + ArraySet<Association> result = null; final XmlPullParser parser = Xml.newPullParser(); synchronized (file) { try (FileInputStream in = file.openRead()) { @@ -627,12 +628,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind public int onCommand(String cmd) { switch (cmd) { case "list": { - ArrayList<Association> associations = readAllAssociations(getNextArgInt()); - for (int i = 0; i < size(associations); i++) { - Association a = associations.get(i); - getOutPrintWriter() - .println(a.companionAppPackage + " " + a.deviceAddress); - } + CollectionUtils.forEach( + readAllAssociations(getNextArgInt()), + a -> getOutPrintWriter() + .println(a.companionAppPackage + " " + a.deviceAddress)); } break; case "associate": { diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index 8ea334dbfb17..7959e392d500 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -18,6 +18,7 @@ package com.android.server; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.DUMP; +import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.SHUTDOWN; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; @@ -55,6 +56,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; import android.net.INetworkManagementEventObserver; +import android.net.ITetheringStatsProvider; import android.net.InterfaceConfiguration; import android.net.IpPrefix; import android.net.LinkAddress; @@ -225,6 +227,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory(); + @GuardedBy("mTetheringStatsProviders") + private final HashMap<ITetheringStatsProvider, String> + mTetheringStatsProviders = Maps.newHashMap(); + /** * If both locks need to be held, then they should be obtained in the order: * first {@link #mQuotaLock} and then {@link #mRulesLock}. @@ -331,6 +337,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub Watchdog.getInstance().addMonitor(this); LocalServices.addService(NetworkManagementInternal.class, new LocalService()); + + synchronized (mTetheringStatsProviders) { + mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd"); + } } @VisibleForTesting @@ -520,6 +530,23 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + @Override + public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) { + mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); + Preconditions.checkNotNull(provider); + synchronized(mTetheringStatsProviders) { + mTetheringStatsProviders.put(provider, name); + } + } + + @Override + public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) { + mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); + synchronized(mTetheringStatsProviders) { + mTetheringStatsProviders.remove(provider); + } + } + // Sync the state of the given chain with the native daemon. private void syncFirewallChainLocked(int chain, String name) { SparseIntArray rules; @@ -1789,14 +1816,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } - @Override - public NetworkStats getNetworkStatsTethering() { - mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - - final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); - try { - final NativeDaemonEvent[] events = mConnector.executeForList( - "bandwidth", "gettetherstats"); + private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub { + @Override + public NetworkStats getTetherStats() { + final NativeDaemonEvent[] events; + try { + events = mConnector.executeForList("bandwidth", "gettetherstats"); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); for (NativeDaemonEvent event : events) { if (event.getCode() != TetheringStatsListResult) continue; @@ -1822,8 +1851,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub throw new IllegalStateException("problem parsing tethering stats: " + event); } } - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + return stats; + } + } + + @Override + public NetworkStats getNetworkStatsTethering() { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); + synchronized (mTetheringStatsProviders) { + for (ITetheringStatsProvider provider: mTetheringStatsProviders.keySet()) { + try { + stats.combineAllValues(provider.getTetherStats()); + } catch (RemoteException e) { + Log.e(TAG, "Problem reading tethering stats from " + + mTetheringStatsProviders.get(provider) + ": " + e); + } + } } return stats; } diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 72ff6068cd68..581914db4bfa 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -18,6 +18,7 @@ package com.android.server; import android.annotation.NonNull; import android.content.Context; +import android.os.SystemClock; import android.os.Trace; import android.util.Slog; @@ -118,14 +119,14 @@ public class SystemServiceManager { // Register it. mServices.add(service); // Start it. - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onStart(); } catch (RuntimeException ex) { throw new RuntimeException("Failed to start service " + service.getClass().getName() + ": onStart threw an exception", ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onStart"); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart"); } /** @@ -146,7 +147,7 @@ public class SystemServiceManager { final int serviceLen = mServices.size(); for (int i = 0; i < serviceLen; i++) { final SystemService service = mServices.get(i); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, service.getClass().getName()); try { service.onBootPhase(mCurrentPhase); @@ -156,7 +157,7 @@ public class SystemServiceManager { + ": onBootPhase threw an exception during phase " + mCurrentPhase, ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onBootPhase"); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onBootPhase"); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } finally { @@ -178,14 +179,14 @@ public class SystemServiceManager { final SystemService service = mServices.get(i); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStartUser " + service.getClass().getName()); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onStartUser(userHandle); } catch (Exception ex) { Slog.wtf(TAG, "Failure reporting start of user " + userHandle + " to service " + service.getClass().getName(), ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onStartUser "); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStartUser "); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } @@ -197,14 +198,14 @@ public class SystemServiceManager { final SystemService service = mServices.get(i); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onUnlockUser " + service.getClass().getName()); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onUnlockUser(userHandle); } catch (Exception ex) { Slog.wtf(TAG, "Failure reporting unlock of user " + userHandle + " to service " + service.getClass().getName(), ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onUnlockUser "); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onUnlockUser "); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } @@ -216,14 +217,14 @@ public class SystemServiceManager { final SystemService service = mServices.get(i); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onSwitchUser " + service.getClass().getName()); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onSwitchUser(userHandle); } catch (Exception ex) { Slog.wtf(TAG, "Failure reporting switch of user " + userHandle + " to service " + service.getClass().getName(), ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onSwitchUser"); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onSwitchUser"); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } @@ -235,14 +236,14 @@ public class SystemServiceManager { final SystemService service = mServices.get(i); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStopUser " + service.getClass().getName()); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onStopUser(userHandle); } catch (Exception ex) { Slog.wtf(TAG, "Failure reporting stop of user " + userHandle + " to service " + service.getClass().getName(), ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onStopUser"); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStopUser"); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } @@ -254,14 +255,14 @@ public class SystemServiceManager { final SystemService service = mServices.get(i); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onCleanupUser " + service.getClass().getName()); - long time = System.currentTimeMillis(); + long time = SystemClock.elapsedRealtime(); try { service.onCleanupUser(userHandle); } catch (Exception ex) { Slog.wtf(TAG, "Failure reporting cleanup of user " + userHandle + " to service " + service.getClass().getName(), ex); } - warnIfTooLong(System.currentTimeMillis() - time, service, "onCleanupUser"); + warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onCleanupUser"); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 6d9d874d0899..80d39f585c12 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -857,7 +857,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { Slog.e(TAG, "Remove the spell checker bind unexpectedly."); synchronized (mLock) { final int size = mListeners.getRegisteredCallbackCount(); - for (int i = 0; i < size; ++i) { + for (int i = size - 1; i >= 0; --i) { mListeners.unregister(mListeners.getRegisteredCallbackItem(i)); } mPendingSessionRequests.clear(); diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index b18fa322bd2b..aceedf1ab805 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -85,8 +85,9 @@ public class Watchdog extends Thread { "android.hardware.bluetooth@1.0::IBluetoothHci", "android.hardware.camera.provider@2.4::ICameraProvider", "android.hardware.graphics.composer@2.1::IComposer", - "android.hardware.vr@1.0::IVr", - "android.hardware.media.omx@1.0::IOmx" + "android.hardware.media.omx@1.0::IOmx", + "android.hardware.sensors@1.0::ISensors", + "android.hardware.vr@1.0::IVr" ); static Watchdog sWatchdog; diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index a54fe727f57e..c6f2fc082bac 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -5180,6 +5180,28 @@ public class AccountManagerService fout.println(); mAuthenticatorCache.dump(fd, fout, args, userAccounts.userId); + + boolean isUserUnlocked; + synchronized (mUsers) { + isUserUnlocked = isLocalUnlockedUser(userAccounts.userId); + } + // Following logs are printed only when user is unlocked. + if (!isUserUnlocked) { + return; + } + fout.println(); + synchronized (userAccounts.dbLock) { + Map<Account, Map<String, Integer>> allVisibilityValues = + userAccounts.accountsDb.findAllVisibilityValues(); + fout.println("Account visibility:"); + for (Account account : allVisibilityValues.keySet()) { + fout.println(" " + account.name); + Map<String, Integer> visibilities = allVisibilityValues.get(account); + for (Entry<String, Integer> entry : visibilities.entrySet()) { + fout.println(" " + entry.getKey() + ", " + entry.getValue()); + } + } + } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 03adcc417898..ff387a7ae9a2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17368,23 +17368,41 @@ public class ActivityManagerService extends IActivityManager.Stub ArrayList<MemItem> catMems = new ArrayList<MemItem>(); catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1)); - final MemItem dalvikItem = - new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, -2); - if (dalvikSubitemPss.length > 0) { - dalvikItem.subitems = new ArrayList<MemItem>(); - for (int j=0; j<dalvikSubitemPss.length; j++) { - final String name = Debug.MemoryInfo.getOtherLabel( - Debug.MemoryInfo.NUM_OTHER_STATS + j); - dalvikItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j], - dalvikSubitemSwapPss[j], j)); - } - } - catMems.add(dalvikItem); + final int dalvikId = -2; + catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId)); catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3)); for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) { String label = Debug.MemoryInfo.getOtherLabel(j); catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j)); } + if (dalvikSubitemPss.length > 0) { + // Add dalvik subitems. + for (MemItem memItem : catMems) { + int memItemStart = 0, memItemEnd = 0; + if (memItem.id == dalvikId) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DALVIK_OTHER) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DEX) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_ART) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_ART_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_ART_END; + } else { + continue; // No subitems, continue. + } + memItem.subitems = new ArrayList<MemItem>(); + for (int j=memItemStart; j<=memItemEnd; j++) { + final String name = Debug.MemoryInfo.getOtherLabel( + Debug.MemoryInfo.NUM_OTHER_STATS + j); + memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j], + dalvikSubitemSwapPss[j], j)); + } + } + } ArrayList<MemItem> oomMems = new ArrayList<MemItem>(); for (int j=0; j<oomPss.length; j++) { diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index 82b25665160f..3133a51a5fb5 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.hardware.ICameraService; import android.hardware.ICameraServiceProxy; +import android.metrics.LogMaker; import android.nfc.INfcAdapter; import android.os.Binder; import android.os.Handler; @@ -28,15 +29,23 @@ import android.os.IBinder; import android.os.Message; import android.os.Process; import android.os.RemoteException; +import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserManager; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.server.LocalServices; import com.android.server.ServiceThread; import com.android.server.SystemService; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Set; /** @@ -65,6 +74,9 @@ public class CameraServiceProxy extends SystemService private static final int RETRY_DELAY_TIME = 20; //ms + // Maximum entries to keep in usage history before dumping out + private static final int MAX_USAGE_HISTORY = 100; + private final Context mContext; private final ServiceThread mHandlerThread; private final Handler mHandler; @@ -76,14 +88,52 @@ public class CameraServiceProxy extends SystemService private ICameraService mCameraServiceRaw; - private final ArraySet<String> mActiveCameraIds = new ArraySet<>(); - + private final ArrayMap<String, CameraUsageEvent> mActiveCameraUsage = new ArrayMap<>(); + private final List<CameraUsageEvent> mCameraUsageHistory = new ArrayList<>(); + private final MetricsLogger mLogger = new MetricsLogger(); private static final String NFC_NOTIFICATION_PROP = "ro.camera.notify_nfc"; private static final String NFC_SERVICE_BINDER_NAME = "nfc"; private static final IBinder nfcInterfaceToken = new Binder(); private final boolean mNotifyNfc; - private int mActiveCameraCount = 0; + + /** + * Structure to track camera usage + */ + private static class CameraUsageEvent { + public final int mCameraFacing; + public final String mClientName; + + private boolean mCompleted; + private long mDurationOrStartTimeMs; // Either start time, or duration once completed + + public CameraUsageEvent(int facing, String clientName) { + mCameraFacing = facing; + mClientName = clientName; + mDurationOrStartTimeMs = SystemClock.elapsedRealtime(); + mCompleted = false; + } + + public void markCompleted() { + if (mCompleted) { + return; + } + mCompleted = true; + mDurationOrStartTimeMs = SystemClock.elapsedRealtime() - mDurationOrStartTimeMs; + if (CameraServiceProxy.DEBUG) { + Slog.v(TAG, "A camera facing " + cameraFacingToString(mCameraFacing) + + " was in use by " + mClientName + " for " + + mDurationOrStartTimeMs + " ms"); + } + } + + /** + * Return duration of camera usage event, or 0 if the event is not done + */ + public long getDuration() { + return mCompleted ? mDurationOrStartTimeMs : 0; + } + } private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @@ -120,10 +170,11 @@ public class CameraServiceProxy extends SystemService public void notifyCameraState(String cameraId, int newCameraState, int facing, String clientName) { String state = cameraStateToString(newCameraState); - if (DEBUG) Slog.v(TAG, "Camera " + cameraId + " facing " + facing + " state now " + + String facingStr = cameraFacingToString(facing); + if (DEBUG) Slog.v(TAG, "Camera " + cameraId + " facing " + facingStr + " state now " + state + " for client " + clientName); - updateActivityCount(cameraId, newCameraState); + updateActivityCount(cameraId, newCameraState, facing, clientName); } }; @@ -169,6 +220,9 @@ public class CameraServiceProxy extends SystemService mContext.registerReceiver(mIntentReceiver, filter); publishBinderService(CAMERA_SERVICE_PROXY_BINDER_NAME, mCameraServiceProxy); + publishLocalService(CameraServiceProxy.class, this); + + CameraStatsJobService.schedule(mContext); } @Override @@ -198,8 +252,8 @@ public class CameraServiceProxy extends SystemService mCameraServiceRaw = null; // All cameras reset to idle on camera service death - boolean wasEmpty = mActiveCameraIds.isEmpty(); - mActiveCameraIds.clear(); + boolean wasEmpty = mActiveCameraUsage.isEmpty(); + mActiveCameraUsage.clear(); if ( mNotifyNfc && !wasEmpty ) { notifyNfcService(/*enablePolling*/ true); @@ -207,6 +261,46 @@ public class CameraServiceProxy extends SystemService } } + /** + * Dump camera usage events to log. + * Package-private + */ + void dumpUsageEvents() { + synchronized(mLock) { + // Randomize order of events so that it's not meaningful + Collections.shuffle(mCameraUsageHistory); + for (CameraUsageEvent e : mCameraUsageHistory) { + if (DEBUG) { + Slog.v(TAG, "Camera: " + e.mClientName + " used a camera facing " + + cameraFacingToString(e.mCameraFacing) + " for " + + e.getDuration() + " ms"); + } + int subtype = 0; + switch(e.mCameraFacing) { + case ICameraServiceProxy.CAMERA_FACING_BACK: + subtype = MetricsEvent.CAMERA_BACK_USED; + break; + case ICameraServiceProxy.CAMERA_FACING_FRONT: + subtype = MetricsEvent.CAMERA_FRONT_USED; + break; + case ICameraServiceProxy.CAMERA_FACING_EXTERNAL: + subtype = MetricsEvent.CAMERA_EXTERNAL_USED; + break; + default: + continue; + } + LogMaker l = new LogMaker(MetricsEvent.ACTION_CAMERA_EVENT) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(subtype) + .setLatency(e.getDuration()) + .setPackageName(e.mClientName); + mLogger.write(l); + } + mCameraUsageHistory.clear(); + } + CameraStatsJobService.schedule(mContext); + } + private void switchUserLocked(int userHandle) { Set<Integer> currentUserHandles = getEnabledUserHandles(userHandle); mLastUser = userHandle; @@ -274,21 +368,35 @@ public class CameraServiceProxy extends SystemService return true; } - private void updateActivityCount(String cameraId, int newCameraState) { + private void updateActivityCount(String cameraId, int newCameraState, int facing, String clientName) { synchronized(mLock) { - boolean wasEmpty = mActiveCameraIds.isEmpty(); + // Update active camera list and notify NFC if necessary + boolean wasEmpty = mActiveCameraUsage.isEmpty(); switch (newCameraState) { case ICameraServiceProxy.CAMERA_STATE_OPEN: break; case ICameraServiceProxy.CAMERA_STATE_ACTIVE: - mActiveCameraIds.add(cameraId); + CameraUsageEvent newEvent = new CameraUsageEvent(facing, clientName); + CameraUsageEvent oldEvent = mActiveCameraUsage.put(cameraId, newEvent); + if (oldEvent != null) { + Slog.w(TAG, "Camera " + cameraId + " was already marked as active"); + oldEvent.markCompleted(); + mCameraUsageHistory.add(oldEvent); + } break; case ICameraServiceProxy.CAMERA_STATE_IDLE: case ICameraServiceProxy.CAMERA_STATE_CLOSED: - mActiveCameraIds.remove(cameraId); + CameraUsageEvent doneEvent = mActiveCameraUsage.remove(cameraId); + if (doneEvent != null) { + doneEvent.markCompleted(); + mCameraUsageHistory.add(doneEvent); + if (mCameraUsageHistory.size() > MAX_USAGE_HISTORY) { + dumpUsageEvents(); + } + } break; } - boolean isEmpty = mActiveCameraIds.isEmpty(); + boolean isEmpty = mActiveCameraUsage.isEmpty(); if ( mNotifyNfc && (wasEmpty != isEmpty) ) { notifyNfcService(isEmpty); } @@ -332,4 +440,15 @@ public class CameraServiceProxy extends SystemService } return "CAMERA_STATE_UNKNOWN"; } + + private static String cameraFacingToString(int cameraFacing) { + switch (cameraFacing) { + case ICameraServiceProxy.CAMERA_FACING_BACK: return "CAMERA_FACING_BACK"; + case ICameraServiceProxy.CAMERA_FACING_FRONT: return "CAMERA_FACING_FRONT"; + case ICameraServiceProxy.CAMERA_FACING_EXTERNAL: return "CAMERA_FACING_EXTERNAL"; + default: break; + } + return "CAMERA_FACING_UNKNOWN"; + } + } diff --git a/services/core/java/com/android/server/camera/CameraStatsJobService.java b/services/core/java/com/android/server/camera/CameraStatsJobService.java new file mode 100644 index 000000000000..b8a6846ced76 --- /dev/null +++ b/services/core/java/com/android/server/camera/CameraStatsJobService.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.server.camera; + +import android.app.job.JobInfo; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.util.Slog; + +import java.util.concurrent.TimeUnit; + +import com.android.server.LocalServices; + +/** + * A JobService to periodically collect camera usage stats. + */ +public class CameraStatsJobService extends JobService { + private static final String TAG = "CameraStatsJobService"; + + // Must be unique within UID (system service) + private static final int CAMERA_REPORTING_JOB_ID = 0xCA3E7A; + + private static ComponentName sCameraStatsJobServiceName = new ComponentName( + "android", + CameraStatsJobService.class.getName()); + + @Override + public boolean onStartJob(JobParameters params) { + CameraServiceProxy serviceProxy = LocalServices.getService(CameraServiceProxy.class); + if (serviceProxy == null) { + Slog.w(TAG, "Can't collect camera usage stats - no camera service proxy found"); + return false; + } + + serviceProxy.dumpUsageEvents(); + return false; + } + + @Override + public boolean onStopJob(JobParameters params) { + // All work is done in onStartJob, so nothing to stop here + return false; + } + + public static void schedule(Context context) { + + JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + if (js == null) { + Slog.e(TAG, "Can't collect camera usage stats - no Job Scheduler"); + return; + } + js.schedule(new JobInfo.Builder(CAMERA_REPORTING_JOB_ID, sCameraStatsJobServiceName) + .setMinimumLatency(TimeUnit.DAYS.toMillis(1)) + .setRequiresDeviceIdle(true) + .build()); + + } + +} diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 1fb944fda7c9..b0be8f7b9635 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -214,7 +214,7 @@ public class Tethering extends BaseNetworkObserver { final Handler smHandler = mTetherMasterSM.getHandler(); mOffloadController = new OffloadController(smHandler, deps.getOffloadHardwareInterface(smHandler, mLog), - mContext.getContentResolver(), + mContext.getContentResolver(), mNMService, mLog); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, mLog, TetherMasterSM.EVENT_UPSTREAM_CALLBACK); @@ -1759,6 +1759,11 @@ public class Tethering extends BaseNetworkObserver { pw.decreaseIndent(); } + pw.println("Hardware offload:"); + pw.increaseIndent(); + mOffloadController.dump(pw); + pw.decreaseIndent(); + pw.println("Log:"); pw.increaseIndent(); if (argsContain(args, SHORT_ARG)) { diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java index b47386705a36..1a5ff778010c 100644 --- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java +++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java @@ -16,24 +16,38 @@ package com.android.server.connectivity.tethering; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.TAG_NONE; +import static android.net.TrafficStats.UID_TETHERING; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; import android.content.ContentResolver; +import android.net.ITetheringStatsProvider; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; +import android.net.NetworkStats; import android.net.RouteInfo; import android.net.util.SharedLog; import android.os.Handler; +import android.os.INetworkManagementService; +import android.os.RemoteException; +import android.os.SystemClock; import android.provider.Settings; +import android.text.TextUtils; + +import com.android.internal.util.IndentingPrintWriter; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * A class to encapsulate the business logic of programming the tethering @@ -44,6 +58,8 @@ import java.util.Set; public class OffloadController { private static final String TAG = OffloadController.class.getSimpleName(); + private static final int STATS_FETCH_TIMEOUT_MS = 1000; + private final Handler mHandler; private final OffloadHardwareInterface mHwInterface; private final ContentResolver mContentResolver; @@ -59,14 +75,25 @@ public class OffloadController { // prefixes representing only the locally-assigned IP addresses. private Set<String> mLastLocalPrefixStrs; + // Maps upstream interface names to offloaded traffic statistics. + private HashMap<String, OffloadHardwareInterface.ForwardedStats> + mForwardedStats = new HashMap<>(); + public OffloadController(Handler h, OffloadHardwareInterface hwi, - ContentResolver contentResolver, SharedLog log) { + ContentResolver contentResolver, INetworkManagementService nms, SharedLog log) { mHandler = h; mHwInterface = hwi; mContentResolver = contentResolver; mLog = log.forSubComponent(TAG); mExemptPrefixes = new HashSet<>(); mLastLocalPrefixStrs = new HashSet<>(); + + try { + nms.registerTetheringStatsProvider( + new OffloadTetheringStatsProvider(), getClass().getSimpleName()); + } catch (RemoteException e) { + mLog.e("Cannot register offload stats provider: " + e); + } } public void start() { @@ -138,6 +165,7 @@ public class OffloadController { public void stop() { final boolean wasStarted = started(); + updateStatsForCurrentUpstream(); mUpstreamLinkProperties = null; mHwInterface.stopOffloadControl(); mControlInitialized = false; @@ -145,16 +173,76 @@ public class OffloadController { if (wasStarted) mLog.log("tethering offload stopped"); } + private class OffloadTetheringStatsProvider extends ITetheringStatsProvider.Stub { + @Override + public NetworkStats getTetherStats() { + NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); + CountDownLatch latch = new CountDownLatch(1); + + mHandler.post(() -> { + try { + NetworkStats.Entry entry = new NetworkStats.Entry(); + entry.set = SET_DEFAULT; + entry.tag = TAG_NONE; + entry.uid = UID_TETHERING; + + updateStatsForCurrentUpstream(); + + for (String iface : mForwardedStats.keySet()) { + entry.iface = iface; + entry.rxBytes = mForwardedStats.get(iface).rxBytes; + entry.txBytes = mForwardedStats.get(iface).txBytes; + stats.addValues(entry); + } + } finally { + latch.countDown(); + } + }); + + try { + latch.await(STATS_FETCH_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + mLog.e("Tethering stats fetch timed out after " + STATS_FETCH_TIMEOUT_MS + "ms"); + } + + return stats; + } + } + + private void maybeUpdateStats(String iface) { + if (TextUtils.isEmpty(iface)) { + return; + } + + if (!mForwardedStats.containsKey(iface)) { + mForwardedStats.put(iface, new OffloadHardwareInterface.ForwardedStats()); + } + mForwardedStats.get(iface).add(mHwInterface.getForwardedStats(iface)); + } + + private void updateStatsForCurrentUpstream() { + if (mUpstreamLinkProperties != null) { + maybeUpdateStats(mUpstreamLinkProperties.getInterfaceName()); + } + } + public void setUpstreamLinkProperties(LinkProperties lp) { if (!started() || Objects.equals(mUpstreamLinkProperties, lp)) return; + String prevUpstream = (mUpstreamLinkProperties != null) ? + mUpstreamLinkProperties.getInterfaceName() : null; + mUpstreamLinkProperties = (lp != null) ? new LinkProperties(lp) : null; + // TODO: examine return code and decide what to do if programming // upstream parameters fails (probably just wait for a subsequent // onOffloadEvent() callback to tell us offload is available again and // then reapply all state). computeAndPushLocalPrefixes(); pushUpstreamParameters(); + + // Update stats after we've told the hardware to change routing so we don't miss packets. + maybeUpdateStats(prevUpstream); } public void setLocalPrefixes(Set<IpPrefix> localPrefixes) { @@ -262,4 +350,16 @@ public class OffloadController { for (IpPrefix pfx : prefixSet) localPrefixStrs.add(pfx.toString()); return localPrefixStrs; } + + public void dump(IndentingPrintWriter pw) { + if (isOffloadDisabled()) { + pw.println("Offload disabled"); + return; + } + pw.println("Offload HALs " + (started() ? "started" : "not started")); + LinkProperties lp = mUpstreamLinkProperties; + String upstream = (lp != null) ? lp.getInterfaceName() : null; + pw.println("Current upstream: " + upstream); + pw.println("Exempt prefixes: " + mLastLocalPrefixStrs); + } } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index e82724db27f7..d4abc08ffc0d 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -16,6 +16,7 @@ package com.android.server.display; +import android.app.ActivityManager; import com.android.internal.app.IBatteryStats; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; @@ -161,6 +162,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // True if should use light sensor to automatically determine doze screen brightness. private final boolean mAllowAutoBrightnessWhileDozingConfig; + // Whether or not the color fade on screen on / off is enabled. + private final boolean mColorFadeEnabled; + // True if we should fade the screen while turning it off, false if we should play // a stylish color fade animation instead. private boolean mColorFadeFadesConfig; @@ -407,6 +411,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mScreenBrightnessRangeMinimum = screenBrightnessRangeMinimum; + + mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic(); mColorFadeFadesConfig = resources.getBoolean( com.android.internal.R.bool.config_animateScreenLights); @@ -497,17 +503,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Initialize the power state object for the default display. // In the future, we might manage multiple displays independently. mPowerState = new DisplayPowerState(mBlanker, - new ColorFade(Display.DEFAULT_DISPLAY)); + mColorFadeEnabled ? new ColorFade(Display.DEFAULT_DISPLAY) : null); - mColorFadeOnAnimator = ObjectAnimator.ofFloat( - mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f); - mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS); - mColorFadeOnAnimator.addListener(mAnimatorListener); + if (mColorFadeEnabled) { + mColorFadeOnAnimator = ObjectAnimator.ofFloat( + mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f); + mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS); + mColorFadeOnAnimator.addListener(mAnimatorListener); - mColorFadeOffAnimator = ObjectAnimator.ofFloat( - mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f); - mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS); - mColorFadeOffAnimator.addListener(mAnimatorListener); + mColorFadeOffAnimator = ObjectAnimator.ofFloat( + mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f); + mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS); + mColorFadeOffAnimator.addListener(mAnimatorListener); + } mScreenBrightnessRampAnimator = new RampAnimator<DisplayPowerState>( mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS); @@ -784,9 +792,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Note that we do not wait for the brightness ramp animation to complete before // reporting the display is ready because we only need to ensure the screen is in the // right power state even as it continues to converge on the desired brightness. - final boolean ready = mPendingScreenOnUnblocker == null - && !mColorFadeOnAnimator.isStarted() - && !mColorFadeOffAnimator.isStarted() + final boolean ready = mPendingScreenOnUnblocker == null && + (!mColorFadeEnabled || + (!mColorFadeOnAnimator.isStarted() && !mColorFadeOffAnimator.isStarted())) && mPowerState.waitUntilClean(mCleanListener); final boolean finished = ready && !mScreenBrightnessRampAnimator.isAnimating(); @@ -959,8 +967,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private void animateScreenStateChange(int target, boolean performScreenOffTransition) { // If there is already an animation in progress, don't interfere with it. - if (mColorFadeOnAnimator.isStarted() - || mColorFadeOffAnimator.isStarted()) { + if (mColorFadeEnabled && + (mColorFadeOnAnimator.isStarted() || mColorFadeOffAnimator.isStarted())) { if (target != Display.STATE_ON) { return; } @@ -984,7 +992,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (!setScreenState(Display.STATE_ON)) { return; // screen on blocked } - if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) { + if (USE_COLOR_FADE_ON_ANIMATION && mColorFadeEnabled && mPowerRequest.isBrightOrDim()) { // Perform screen on animation. if (mPowerState.getColorFadeLevel() == 1.0f) { mPowerState.dismissColorFade(); @@ -1060,6 +1068,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } else { // Want screen off. mPendingScreenOff = true; + if (!mColorFadeEnabled) { + mPowerState.setColorFadeLevel(0.0f); + } + if (mPowerState.getColorFadeLevel() == 0.0f) { // Turn the screen off. // A black surface is already hiding the contents of the screen. diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java index e2fd0acd3887..d0c15801a232 100644 --- a/services/core/java/com/android/server/display/DisplayPowerState.java +++ b/services/core/java/com/android/server/display/DisplayPowerState.java @@ -174,7 +174,7 @@ final class DisplayPowerState { * @return True if the electron beam was prepared. */ public boolean prepareColorFade(Context context, int mode) { - if (!mColorFade.prepare(context, mode)) { + if (mColorFade == null || !mColorFade.prepare(context, mode)) { mColorFadePrepared = false; mColorFadeReady = true; return false; @@ -190,7 +190,7 @@ final class DisplayPowerState { * Dismisses the color fade surface. */ public void dismissColorFade() { - mColorFade.dismiss(); + if (mColorFade != null) mColorFade.dismiss(); mColorFadePrepared = false; mColorFadeReady = true; } @@ -199,7 +199,7 @@ final class DisplayPowerState { * Dismisses the color fade resources. */ public void dismissColorFadeResources() { - mColorFade.dismissResources(); + if (mColorFade != null) mColorFade.dismissResources(); } /** @@ -269,7 +269,7 @@ final class DisplayPowerState { pw.println(" mColorFadeDrawPending=" + mColorFadeDrawPending); mPhotonicModulator.dump(pw); - mColorFade.dump(pw); + if (mColorFade != null) mColorFade.dump(pw); } private void scheduleScreenUpdate() { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 98a247975959..c0f9e0d90edb 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5746,6 +5746,9 @@ public class NotificationManagerService extends SystemService { @Override public int onCommand(String cmd) { + if (cmd == null) { + return handleDefaultCommands(cmd); + } final PrintWriter pw = getOutPrintWriter(); try { switch (cmd) { diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java index cbaad460b888..a7a2743dfc7f 100644 --- a/services/core/java/com/android/server/notification/ZenModeFiltering.java +++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java @@ -104,9 +104,6 @@ public class ZenModeFiltering { } public boolean shouldIntercept(int zen, ZenModeConfig config, NotificationRecord record) { - if (isSystem(record)) { - return false; - } switch (zen) { case Global.ZEN_MODE_NO_INTERRUPTIONS: // #notevenalarms @@ -177,10 +174,6 @@ public class ZenModeFiltering { return false; } - private static boolean isSystem(NotificationRecord record) { - return record.isCategory(Notification.CATEGORY_SYSTEM); - } - private static boolean isAlarm(NotificationRecord record) { return record.isCategory(Notification.CATEGORY_ALARM) || record.isAudioStream(AudioManager.STREAM_ALARM) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 700d3c2ef805..c3a40bf1443e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2699,7 +2699,16 @@ public class PackageManagerService extends IPackageManager.Stub // Remove any shared userIDs that have no associated packages mSettings.pruneSharedUsersLPw(); - + final long systemScanTime = SystemClock.uptimeMillis() - startTime; + final int systemPackagesCount = mPackages.size(); + Slog.i(TAG, "Finished scanning system apps. Time: " + systemScanTime + + " ms, packageCount: " + systemPackagesCount + + " ms, timePerPackage: " + + (systemPackagesCount == 0 ? 0 : systemScanTime / systemPackagesCount)); + if (mIsUpgrade && systemPackagesCount > 0) { + MetricsLogger.histogram(null, "ota_package_manager_system_app_avg_scan_time", + ((int) systemScanTime) / systemPackagesCount); + } if (!mOnlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, SystemClock.uptimeMillis()); @@ -2780,6 +2789,16 @@ public class PackageManagerService extends IPackageManager.Stub } } } + final long dataScanTime = SystemClock.uptimeMillis() - systemScanTime - startTime; + final int dataPackagesCount = mPackages.size() - systemPackagesCount; + Slog.i(TAG, "Finished scanning non-system apps. Time: " + dataScanTime + + " ms, packageCount: " + dataPackagesCount + + " ms, timePerPackage: " + + (dataPackagesCount == 0 ? 0 : dataScanTime / dataPackagesCount)); + if (mIsUpgrade && dataPackagesCount > 0) { + MetricsLogger.histogram(null, "ota_package_manager_data_app_avg_scan_time", + ((int) dataScanTime) / dataPackagesCount); + } } mExpectingBetter.clear(); @@ -3009,6 +3028,10 @@ public class PackageManagerService extends IPackageManager.Stub userPackages.put(userId, getInstalledPackages(/*flags*/ 0, userId).getList()); } mDexManager.load(userPackages); + if (mIsUpgrade) { + MetricsLogger.histogram(null, "ota_package_manager_init_time", + (int) (SystemClock.uptimeMillis() - startTime)); + } } // synchronized (mPackages) } // synchronized (mInstallLock) diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index cb8416b36be5..45e9cc785bf8 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -73,11 +73,13 @@ Return<R> halCall(Return<R> (I::* fn)(Args0...), Args1&&... args1) { ret = (sHal == nullptr) ? NullptrStatus<R>() : (*sHal.*fn)(std::forward<Args1>(args1)...); - if (!ret.isOk()) { - ALOGE("Failed to issue command to vibrator HAL. Retrying."); - // Restoring connection to the HAL. - sHal = I::tryGetService(); + if (ret.isOk()) { + break; } + + ALOGE("Failed to issue command to vibrator HAL. Retrying."); + // Restoring connection to the HAL. + sHal = I::tryGetService(); } return ret; } diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp index 37ae78254ce2..2dfd8b9fa163 100644 --- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp +++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp @@ -59,7 +59,7 @@ namespace android static bool wakeup_init = false; static sem_t wakeup_sem; -extern sp<IPower> gPowerHal; +extern sp<android::hardware::power::V1_0::IPower> gPowerHalV1_0; extern std::mutex gPowerHalMutex; extern bool getPowerHal(); @@ -203,7 +203,7 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o return -1; } - Return<void> ret = gPowerHal->getPlatformLowPowerStats( + Return<void> ret = gPowerHalV1_0->getPlatformLowPowerStats( [&offset, &remaining, &total_added](hidl_vec<PowerStatePlatformSleepState> states, Status status) { if (status != Status::SUCCESS) @@ -257,7 +257,7 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o if (!ret.isOk()) { ALOGE("getPlatformLowPowerStats() failed: power HAL service not available"); - gPowerHal = nullptr; + gPowerHalV1_0 = nullptr; return -1; } } @@ -288,7 +288,7 @@ static jint getSubsystemLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject } //Trying to cast to 1.1, this will succeed only for devices supporting 1.1 - gPowerHal_1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHal); + gPowerHal_1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0); if (gPowerHal_1_1 == nullptr) { //This device does not support IPower@1.1, exiting gracefully return 0; @@ -351,7 +351,7 @@ static jint getSubsystemLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject if (!ret.isOk()) { ALOGE("getSubsystemLowPowerStats() failed: power HAL service not available"); - gPowerHal = nullptr; + gPowerHalV1_0 = nullptr; return -1; } } diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp index 29924dd60dcf..070b8082e22b 100644 --- a/services/core/jni/com_android_server_power_PowerManagerService.cpp +++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp @@ -18,7 +18,7 @@ //#define LOG_NDEBUG 0 -#include <android/hardware/power/1.0/IPower.h> +#include <android/hardware/power/1.1/IPower.h> #include "JNIHelp.h" #include "jni.h" @@ -41,7 +41,7 @@ using android::hardware::Return; using android::hardware::Void; -using android::hardware::power::V1_0::IPower; +using android::hardware::power::V1_1::IPower; using android::hardware::power::V1_0::PowerHint; using android::hardware::power::V1_0::Feature; using android::String8; @@ -57,7 +57,8 @@ static struct { // ---------------------------------------------------------------------------- static jobject gPowerManagerServiceObj; -sp<IPower> gPowerHal = nullptr; +sp<android::hardware::power::V1_0::IPower> gPowerHalV1_0 = nullptr; +sp<android::hardware::power::V1_1::IPower> gPowerHalV1_1 = nullptr; bool gPowerHalExists = true; std::mutex gPowerHalMutex; static nsecs_t gLastEventTime[USER_ACTIVITY_EVENT_LAST + 1]; @@ -80,16 +81,17 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa // Check validity of current handle to the power HAL service, and call getService() if necessary. // The caller must be holding gPowerHalMutex. bool getPowerHal() { - if (gPowerHalExists && gPowerHal == nullptr) { - gPowerHal = IPower::getService(); - if (gPowerHal != nullptr) { + if (gPowerHalExists && gPowerHalV1_0 == nullptr) { + gPowerHalV1_0 = android::hardware::power::V1_0::IPower::getService(); + if (gPowerHalV1_0 != nullptr) { + gPowerHalV1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0); ALOGI("Loaded power HAL service"); } else { ALOGI("Couldn't load power HAL service"); gPowerHalExists = false; } } - return gPowerHal != nullptr; + return gPowerHalV1_0 != nullptr; } // Check if a call to a power HAL function failed; if so, log the failure and invalidate the @@ -97,7 +99,7 @@ bool getPowerHal() { static void processReturn(const Return<void> &ret, const char* functionName) { if (!ret.isOk()) { ALOGE("%s() failed: power HAL service not available.", functionName); - gPowerHal = nullptr; + gPowerHalV1_0 = nullptr; } } @@ -105,7 +107,12 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t // Tell the power HAL when user activity occurs. gPowerHalMutex.lock(); if (getPowerHal()) { - Return<void> ret = gPowerHal->powerHint(PowerHint::INTERACTION, 0); + Return<void> ret; + if (gPowerHalV1_1 != nullptr) { + ret = gPowerHalV1_1->powerHintAsync(PowerHint::INTERACTION, 0); + } else { + ret = gPowerHalV1_0->powerHint(PowerHint::INTERACTION, 0); + } processReturn(ret, "powerHint"); } gPowerHalMutex.unlock(); @@ -159,7 +166,7 @@ static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean std::lock_guard<std::mutex> lock(gPowerHalMutex); if (getPowerHal()) { android::base::Timer t; - Return<void> ret = gPowerHal->setInteractive(enable); + Return<void> ret = gPowerHalV1_0->setInteractive(enable); processReturn(ret, "setInteractive"); if (t.duration() > 20ms) { ALOGD("Excessive delay in setInteractive(%s) while turning screen %s", @@ -187,7 +194,12 @@ static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint data) { std::lock_guard<std::mutex> lock(gPowerHalMutex); if (getPowerHal()) { - Return<void> ret = gPowerHal->powerHint((PowerHint)hintId, data); + Return<void> ret; + if (gPowerHalV1_1 != nullptr) { + ret = gPowerHalV1_1->powerHintAsync((PowerHint)hintId, data); + } else { + ret = gPowerHalV1_0->powerHint((PowerHint)hintId, data); + } processReturn(ret, "powerHint"); } } @@ -195,7 +207,7 @@ static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint dat static void nativeSetFeature(JNIEnv *env, jclass clazz, jint featureId, jint data) { std::lock_guard<std::mutex> lock(gPowerHalMutex); if (getPowerHal()) { - Return<void> ret = gPowerHal->setFeature((Feature)featureId, static_cast<bool>(data)); + Return<void> ret = gPowerHalV1_0->setFeature((Feature)featureId, static_cast<bool>(data)); processReturn(ret, "setFeature"); } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index c2a5b6cff814..d10cc029f5ee 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -763,13 +763,6 @@ public final class SystemServer { mContentResolver = context.getContentResolver(); - if (!disableCameraService) { - Slog.i(TAG, "Camera Service Proxy"); - traceBeginAndSlog("StartCameraServiceProxy"); - mSystemServiceManager.startService(CameraServiceProxy.class); - traceEnd(); - } - // The AccountManager must come before the ContentService traceBeginAndSlog("StartAccountManagerService"); mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS); @@ -1516,6 +1509,12 @@ public final class SystemServer { } } + if (!disableCameraService) { + traceBeginAndSlog("StartCameraServiceProxy"); + mSystemServiceManager.startService(CameraServiceProxy.class); + traceEnd(); + } + // Before things start rolling, be sure we have decided whether // we are in safe mode. final boolean safeMode = wm.detectSafeMode(); diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java index 3007cb1755e2..f457f6a550c1 100644 --- a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java +++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java @@ -25,8 +25,14 @@ import android.os.Parcel; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; +import com.android.internal.util.FastXmlSerializer; + import org.junit.Test; import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlSerializer; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; @SmallTest @RunWith(AndroidJUnit4.class) @@ -50,4 +56,15 @@ public class NotificationChannelTest extends NotificationTestCase { channel.setBlockableSystem(true); assertEquals(true, channel.isBlockableSystem()); } + + @Test + public void testEmptyVibration_noException() throws Exception { + NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT); + channel.setVibrationPattern(new long[0]); + + XmlSerializer serializer = new FastXmlSerializer(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); + channel.writeXml(serializer); + } } diff --git a/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java new file mode 100644 index 000000000000..04c02510cb3d --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup; + +import static com.android.server.testutis.TestUtils.assertExpectException; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; + +import android.content.Context; +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.server.backup.utils.PasswordUtils; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.security.SecureRandom; + +@SmallTest +@Presubmit +@RunWith(AndroidJUnit4.class) +public class BackupPasswordManagerTest { + private static final String PASSWORD_VERSION_FILE_NAME = "pwversion"; + private static final String PASSWORD_HASH_FILE_NAME = "pwhash"; + private static final String V1_HASH_ALGORITHM = "PBKDF2WithHmacSHA1And8bit"; + + @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + + @Mock private Context mContext; + + private File mStateFolder; + private BackupPasswordManager mPasswordManager; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mStateFolder = mTemporaryFolder.newFolder(); + mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom()); + } + + @Test + public void hasBackupPassword_isFalseIfFileDoesNotExist() { + assertThat(mPasswordManager.hasBackupPassword()).isFalse(); + } + + @Test + public void hasBackupPassword_isTrueIfFileExists() throws Exception { + mPasswordManager.setBackupPassword(null, "password1234"); + assertThat(mPasswordManager.hasBackupPassword()).isTrue(); + } + + @Test + public void hasBackupPassword_throwsSecurityExceptionIfLacksPermission() { + setDoesNotHavePermission(); + + assertExpectException( + SecurityException.class, + /* expectedExceptionMessageRegex */ null, + () -> mPasswordManager.hasBackupPassword()); + } + + @Test + public void backupPasswordMatches_isTrueIfNoPassword() { + assertThat(mPasswordManager.backupPasswordMatches("anything")).isTrue(); + } + + @Test + public void backupPasswordMatches_isTrueForSamePassword() { + String password = "password1234"; + mPasswordManager.setBackupPassword(null, password); + assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue(); + } + + @Test + public void backupPasswordMatches_isFalseForDifferentPassword() { + mPasswordManager.setBackupPassword(null, "shiba"); + assertThat(mPasswordManager.backupPasswordMatches("corgi")).isFalse(); + } + + @Test + public void backupPasswordMatches_worksForV1HashIfVersionIsV1() throws Exception { + String password = "corgi\uFFFF"; + writePasswordVersionToFile(1); + writeV1HashToFile(password, saltFixture()); + + // Reconstruct so it reloads from filesystem + mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom()); + + assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue(); + } + + @Test + public void backupPasswordMatches_failsForV1HashIfVersionIsV2() throws Exception { + // The algorithms produce identical hashes except if the password contains higher-order + // unicode. See + // https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html + String password = "corgi\uFFFF"; + writePasswordVersionToFile(2); + writeV1HashToFile(password, saltFixture()); + + // Reconstruct so it reloads from filesystem + mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom()); + + assertThat(mPasswordManager.backupPasswordMatches(password)).isFalse(); + } + + @Test + public void backupPasswordMatches_throwsSecurityExceptionIfLacksPermission() { + setDoesNotHavePermission(); + + assertExpectException( + SecurityException.class, + /* expectedExceptionMessageRegex */ null, + () -> mPasswordManager.backupPasswordMatches("password123")); + } + + @Test + public void setBackupPassword_persistsPasswordToFile() { + String password = "shiba"; + + mPasswordManager.setBackupPassword(null, password); + + BackupPasswordManager newManager = new BackupPasswordManager( + mContext, mStateFolder, new SecureRandom()); + assertThat(newManager.backupPasswordMatches(password)).isTrue(); + } + + @Test + public void setBackupPassword_failsIfCurrentPasswordIsWrong() { + String secondPassword = "second password"; + mPasswordManager.setBackupPassword(null, "first password"); + + boolean result = mPasswordManager.setBackupPassword( + "incorrect pass", secondPassword); + + BackupPasswordManager newManager = new BackupPasswordManager( + mContext, mStateFolder, new SecureRandom()); + assertThat(result).isFalse(); + assertThat(newManager.backupPasswordMatches(secondPassword)).isFalse(); + } + + @Test + public void setBackupPassword_throwsSecurityExceptionIfLacksPermission() { + setDoesNotHavePermission(); + + assertExpectException( + SecurityException.class, + /* expectedExceptionMessageRegex */ null, + () -> mPasswordManager.setBackupPassword( + "password123", "password111")); + } + + private byte[] saltFixture() { + byte[] bytes = new byte[64]; + for (int i = 0; i < 64; i++) { + bytes[i] = (byte) i; + } + return bytes; + } + + private void setDoesNotHavePermission() { + doThrow(new SecurityException()).when(mContext) + .enforceCallingOrSelfPermission(anyString(), anyString()); + } + + private void writeV1HashToFile(String password, byte[] salt) throws Exception { + String hash = PasswordUtils.buildPasswordHash( + V1_HASH_ALGORITHM, password, salt, PasswordUtils.PBKDF2_HASH_ROUNDS); + writeHashAndSaltToFile(hash, salt); + } + + private void writeHashAndSaltToFile(String hash, byte[] salt) throws Exception { + FileOutputStream fos = null; + DataOutputStream dos = null; + + try { + File passwordHash = new File(mStateFolder, PASSWORD_HASH_FILE_NAME); + fos = new FileOutputStream(passwordHash); + dos = new DataOutputStream(fos); + dos.writeInt(salt.length); + dos.write(salt); + dos.writeUTF(hash); + dos.flush(); + } finally { + if (dos != null) dos.close(); + if (fos != null) fos.close(); + } + } + + private void writePasswordVersionToFile(int version) throws Exception { + FileOutputStream fos = null; + DataOutputStream dos = null; + + try { + File passwordVersion = new File(mStateFolder, PASSWORD_VERSION_FILE_NAME); + fos = new FileOutputStream(passwordVersion); + dos = new DataOutputStream(fos); + dos.writeInt(version); + dos.flush(); + } finally { + if (dos != null) dos.close(); + if (fos != null) fos.close(); + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java new file mode 100644 index 000000000000..c27fd079bb89 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; + +@SmallTest +@Presubmit +@RunWith(AndroidJUnit4.class) +public class DataChangedJournalTest { + private static final String GMAIL = "com.google.gmail"; + private static final String DOCS = "com.google.docs"; + private static final String GOOGLE_PLUS = "com.google.plus"; + + @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + + @Mock private DataChangedJournal.Consumer mConsumer; + + private File mFile; + private DataChangedJournal mJournal; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mFile = mTemporaryFolder.newFile(); + mJournal = new DataChangedJournal(mFile); + } + + @Test + public void addPackage_addsPackagesToEndOfFile() throws Exception { + mJournal.addPackage(GMAIL); + mJournal.addPackage(DOCS); + mJournal.addPackage(GOOGLE_PLUS); + + FileInputStream fos = new FileInputStream(mFile); + DataInputStream dos = new DataInputStream(fos); + assertThat(dos.readUTF()).isEqualTo(GMAIL); + assertThat(dos.readUTF()).isEqualTo(DOCS); + assertThat(dos.readUTF()).isEqualTo(GOOGLE_PLUS); + assertThat(dos.available()).isEqualTo(0); + } + + @Test + public void delete_deletesTheFile() throws Exception { + mJournal.addPackage(GMAIL); + + mJournal.delete(); + + assertThat(mFile.exists()).isFalse(); + } + + @Test + public void equals_isTrueForTheSameFile() throws Exception { + assertThat(mJournal.equals(new DataChangedJournal(mFile))).isTrue(); + } + + @Test + public void equals_isFalseForDifferentFiles() throws Exception { + assertThat(mJournal.equals(new DataChangedJournal(mTemporaryFolder.newFile()))).isFalse(); + } + + @Test + public void forEach_iteratesThroughPackagesInFileInOrder() throws Exception { + mJournal.addPackage(GMAIL); + mJournal.addPackage(DOCS); + + mJournal.forEach(mConsumer); + + InOrder inOrder = Mockito.inOrder(mConsumer); + inOrder.verify(mConsumer).accept(GMAIL); + inOrder.verify(mConsumer).accept(DOCS); + inOrder.verifyNoMoreInteractions(); + } + + @Test + public void listJournals_returnsJournalsForEveryFileInDirectory() throws Exception { + File folder = mTemporaryFolder.newFolder(); + DataChangedJournal.newJournal(folder); + DataChangedJournal.newJournal(folder); + + ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(folder); + + assertThat(journals).hasSize(2); + } + + @Test + public void newJournal_createsANewTemporaryFile() throws Exception { + File folder = mTemporaryFolder.newFolder(); + + DataChangedJournal.newJournal(folder); + + assertThat(folder.listFiles()).hasLength(1); + } + + @Test + public void toString_isSameAsFileToString() throws Exception { + assertThat(mJournal.toString()).isEqualTo(mFile.toString()); + } +} diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java new file mode 100644 index 000000000000..bfb95c1a3eda --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup.utils; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; + +@SmallTest +@Presubmit +@RunWith(AndroidJUnit4.class) +public final class DataStreamFileCodecTest { + @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + + @Test + public void serialize_writesToTheFile() throws Exception { + File unicornFile = mTemporaryFolder.newFile(); + + DataStreamFileCodec<MythicalCreature> mythicalCreatureCodec = new DataStreamFileCodec<>( + unicornFile, new MythicalCreatureDataStreamCodec()); + MythicalCreature unicorn = new MythicalCreature( + 10000, "Unicorn"); + mythicalCreatureCodec.serialize(unicorn); + + DataStreamFileCodec<MythicalCreature> newCodecWithSameFile = new DataStreamFileCodec<>( + unicornFile, new MythicalCreatureDataStreamCodec()); + MythicalCreature deserializedUnicorn = newCodecWithSameFile.deserialize(); + + assertThat(deserializedUnicorn.averageLifespanInYears) + .isEqualTo(unicorn.averageLifespanInYears); + assertThat(deserializedUnicorn.name).isEqualTo(unicorn.name); + } + + private static class MythicalCreature { + int averageLifespanInYears; + String name; + + MythicalCreature(int averageLifespanInYears, String name) { + this.averageLifespanInYears = averageLifespanInYears; + this.name = name; + } + } + + private static class MythicalCreatureDataStreamCodec implements + DataStreamCodec<MythicalCreature> { + @Override + public void serialize(MythicalCreature mythicalCreature, + DataOutputStream dataOutputStream) throws IOException { + dataOutputStream.writeInt(mythicalCreature.averageLifespanInYears); + dataOutputStream.writeUTF(mythicalCreature.name); + } + + @Override + public MythicalCreature deserialize(DataInputStream dataInputStream) + throws IOException { + int years = dataInputStream.readInt(); + String name = dataInputStream.readUTF(); + return new MythicalCreature(years, name); + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java new file mode 100644 index 000000000000..db55120dc023 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.backup.utils; + +import static com.google.common.truth.Truth.assertThat; + +import android.platform.test.annotations.Presubmit; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.SparseArray; + +import com.google.android.collect.Sets; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.HashSet; + +@SmallTest +@Presubmit +@RunWith(AndroidJUnit4.class) +public class SparseArrayUtilsTest { + @Test + public void union_mergesSets() { + SparseArray<HashSet<String>> sparseArray = new SparseArray<>(); + sparseArray.append(12, Sets.newHashSet("a", "b", "c")); + sparseArray.append(45, Sets.newHashSet("d", "e")); + sparseArray.append(46, Sets.newHashSet()); + sparseArray.append(66, Sets.newHashSet("a", "e", "f")); + + assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo( + Sets.newHashSet("a", "b", "c", "d", "e", "f")); + } + + @Test + public void union_returnsEmptySetForEmptyList() { + SparseArray<HashSet<String>> sparseArray = new SparseArray<>(); + + assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo(Sets.newHashSet()); + } +} diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 9c712f4c4ca2..50fab5dd784e 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1495,6 +1495,17 @@ public class CarrierConfigManager { public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT = "imsi_key_expiration_days_time_int"; + /** + * Key identifying if the CDMA Caller ID presentation and suppression MMI codes + * should be converted to 3GPP CLIR codes when a multimode (CDMA+UMTS+LTE) device is roaming + * on a 3GPP network. Specifically *67<number> will be converted to #31#<number> and + * *82<number> will be converted to *31#<number> before dialing a call when this key is + * set TRUE and device is roaming on a 3GPP network. + * @hide + */ + public static final String KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL = + "convert_cdma_caller_id_mmi_codes_while_roaming_on_3gpp_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -1745,10 +1756,10 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_DISABLE_VOICE_BARRING_NOTIFICATION_BOOL, false); sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED); sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null); + sDefaults.putBoolean(KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL, + false); sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null); sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null); - sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED); - sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null); } /** diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java index 5fa6a952d709..4eeabb078a64 100644 --- a/telephony/java/android/telephony/MbmsDownloadManager.java +++ b/telephony/java/android/telephony/MbmsDownloadManager.java @@ -288,13 +288,11 @@ public class MbmsDownloadManager { * * This may throw an {@link MbmsException} containing one of the following errors: * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND} - * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} - * {@link MbmsException#ERROR_SERVICE_LOST} + * {@link MbmsException#ERROR_MIDDLEWARE_LOST} * * Asynchronous error codes via the {@link MbmsDownloadManagerCallback#error(int, String)} * callback can include any of the errors except: - * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE} - * {@link MbmsException#ERROR_END_OF_SESSION} + * {@link MbmsException.StreamingErrors#ERROR_UNABLE_TO_START_SERVICE} * * @param classList A list of service classes which the app wishes to receive * {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)} callbacks @@ -315,7 +313,7 @@ public class MbmsDownloadManager { } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } @@ -334,7 +332,7 @@ public class MbmsDownloadManager { * Before calling this method, the app must cancel all of its pending * {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done, * an {@link MbmsException} will be thrown with code - * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} + * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} * * The {@link File} supplied as a root temp file directory must already exist. If not, an * {@link IllegalArgumentException} will be thrown. @@ -366,7 +364,7 @@ public class MbmsDownloadManager { } } catch (RemoteException e) { mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } SharedPreferences prefs = mContext.getSharedPreferences( @@ -417,29 +415,36 @@ public class MbmsDownloadManager { downloadService.download(request, callback); } catch (RemoteException e) { mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } /** - * Returns a list DownloadRequests that originated from this application (UID). - * - * May throw a RemoteException. - * - * Asynchronous errors through the listener include any of the errors except - * <li>ERROR_UNABLED_TO_START_SERVICE</li> - * <li>ERROR_MSDC_INVALID_SERVICE_ID</li> - * <li>ERROR_MSDC_END_OF_SESSION</li> + * Returns a list of pending {@link DownloadRequest}s that originated from this application. + * A pending request is one that was issued via + * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through + * {@link #cancelDownload(DownloadRequest)}. + * @return A list, possibly empty, of {@link DownloadRequest}s */ - public List<DownloadRequest> listPendingDownloads() { - return null; + public @NonNull List<DownloadRequest> listPendingDownloads() throws MbmsException { + IMbmsDownloadService downloadService = mService.get(); + if (downloadService == null) { + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND); + } + + try { + return downloadService.listPendingDownloads(mSubscriptionId); + } catch (RemoteException e) { + mService.set(null); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); + } } /** * Attempts to cancel the specified {@link DownloadRequest}. * * If the middleware is not aware of the specified download request, an MbmsException will be - * thrown with error code {@link MbmsException#ERROR_UNKNOWN_DOWNLOAD_REQUEST}. + * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}. * * If this method returns without throwing an exception, you may assume that cancellation * was successful. @@ -458,7 +463,7 @@ public class MbmsDownloadManager { } } catch (RemoteException e) { mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } deleteDownloadRequestToken(downloadRequest); } @@ -486,27 +491,43 @@ public class MbmsDownloadManager { return downloadService.getDownloadStatus(downloadRequest, fileInfo); } catch (RemoteException e) { mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } /** - * Resets middleware knowledge regarding this download request. + * Resets the middleware's knowledge of previously-downloaded files in this download request. * - * This state consists of knowledge of what files have already been downloaded. - * Normally the middleware won't download files who's hash matches previously downloaded - * content, even if that content has since been deleted. If this function is called - * repeated content will be downloaded again when available. This does not interrupt - * in-progress downloads. + * Normally, the middleware keeps track of the hashes of downloaded files and won't re-download + * files whose server-reported hash matches one of the already-downloaded files. This means + * that if the file is accidentally deleted by the user or by the app, the middleware will + * not try to download it again. + * This method will reset the middleware's cache of hashes for the provided + * {@link DownloadRequest}, so that previously downloaded content will be downloaded again + * when available. + * This will not interrupt in-progress downloads. * - * May throw an IllegalArgumentException or RemoteException. + * If the middleware is not aware of the specified download request, an MbmsException will be + * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}. * - * <li>SUCCESS</li> - * <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li> - * <li>ERROR_MSDC_UNKNOWN_REQUEST</li> + * May throw a {@link MbmsException} with error code + * @param downloadRequest The request to re-download files for. */ - public int resetDownloadKnowledge(DownloadRequest downloadRequest) { - return 0; + public void resetDownloadKnowledge(DownloadRequest downloadRequest) throws MbmsException { + IMbmsDownloadService downloadService = mService.get(); + if (downloadService == null) { + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND); + } + + try { + int result = downloadService.resetDownloadKnowledge(downloadRequest); + if (result != MbmsException.SUCCESS) { + throw new MbmsException(result); + } + } catch (RemoteException e) { + mService.set(null); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); + } } public void dispose() { diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java index 8cc447e4db7a..5b3503a1b163 100644 --- a/telephony/java/android/telephony/MbmsStreamingManager.java +++ b/telephony/java/android/telephony/MbmsStreamingManager.java @@ -35,7 +35,10 @@ import java.util.concurrent.atomic.AtomicReference; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; -/** @hide */ +/** + * This class provides functionality for streaming media over MBMS. + * @hide + */ public class MbmsStreamingManager { private static final String LOG_TAG = "MbmsStreamingManager"; public static final String MBMS_STREAMING_SERVICE_ACTION = @@ -88,6 +91,8 @@ public class MbmsStreamingManager { /** * Terminates this instance, ending calls to the registered listener. Also terminates * any streaming services spawned from this instance. + * + * May throw an {@link IllegalStateException} */ public void dispose() { IMbmsStreamingService streamingService = mService.get(); @@ -111,15 +116,15 @@ public class MbmsStreamingManager { * * Multiple calls replace the list of serviceClasses of interest. * - * This may throw an {@link MbmsException} containing one of the following errors: - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND} - * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} - * {@link MbmsException#ERROR_SERVICE_LOST} + * This may throw an {@link MbmsException} containing any error in + * {@link android.telephony.mbms.MbmsException.GeneralErrors}, + * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or + * {@link MbmsException#ERROR_MIDDLEWARE_LOST}. * - * Asynchronous error codes via the {@link MbmsStreamingManagerCallback#error(int, String)} - * callback can include any of the errors except: - * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE} - * {@link MbmsException#ERROR_END_OF_SESSION} + * May also throw an unchecked {@link IllegalArgumentException} or an + * {@link IllegalStateException} + * + * @param classList A list of streaming service classes that the app would like updates on. */ public void getStreamingServices(List<String> classList) throws MbmsException { IMbmsStreamingService streamingService = mService.get(); @@ -134,7 +139,7 @@ public class MbmsStreamingManager { } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } @@ -145,14 +150,21 @@ public class MbmsStreamingManager { * reported via * {@link android.telephony.mbms.StreamingServiceCallback#streamStateUpdated(int, int)} * - * May throw an {@link MbmsException} containing any of the following error codes: - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND} - * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} - * {@link MbmsException#ERROR_SERVICE_LOST} + * May throw an + * {@link MbmsException} containing any of the error codes in + * {@link android.telephony.mbms.MbmsException.GeneralErrors}, + * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or + * {@link MbmsException#ERROR_MIDDLEWARE_LOST}. * * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException} * - * Asynchronous errors through the listener include any of the errors + * Asynchronous errors through the listener include any of the errors in + * {@link android.telephony.mbms.MbmsException.GeneralErrors} or + * {@link android.telephony.mbms.MbmsException.StreamingErrors}. + * + * @param serviceInfo The information about the service to stream. + * @param listener A listener that'll be called when something about the stream changes. + * @return An instance of {@link StreamingService} through which the stream can be controlled. */ public StreamingService startStreaming(StreamingServiceInfo serviceInfo, StreamingServiceCallback listener) throws MbmsException { @@ -170,7 +182,7 @@ public class MbmsStreamingManager { } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); mService.set(null); - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } return new StreamingService(mSubscriptionId, streamingService, serviceInfo, listener); diff --git a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl index 8116a7f0b7c4..007aee7cf3f2 100755 --- a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl +++ b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl @@ -30,7 +30,5 @@ oneway interface IMbmsStreamingManagerCallback void streamingServicesUpdated(in List<StreamingServiceInfo> services); - void activeStreamingServicesUpdated(in List<StreamingServiceInfo> services); - void middlewareReady(); } diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java index 5b22199bea1c..ba25f663ffb4 100644 --- a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java +++ b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java @@ -55,7 +55,7 @@ public class MbmsDownloadManagerCallback extends IMbmsDownloadManagerCallback.St * Before this method is called, calling any method on an instance of * {@link android.telephony.MbmsDownloadManager} will result in an {@link MbmsException} * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND} - * or {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY} + * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} */ @Override public void middlewareReady() { diff --git a/telephony/java/android/telephony/mbms/MbmsException.java b/telephony/java/android/telephony/mbms/MbmsException.java index e190623f5529..8888119f90e6 100644 --- a/telephony/java/android/telephony/mbms/MbmsException.java +++ b/telephony/java/android/telephony/mbms/MbmsException.java @@ -18,27 +18,112 @@ package android.telephony.mbms; /** @hide */ public class MbmsException extends Exception { + /** Indicates that the operation was successful. */ public static final int SUCCESS = 0; - public static final int ERROR_NO_SERVICE_INSTALLED = 1; - public static final int ERROR_MULTIPLE_SERVICES_INSTALLED = 2; - public static final int ERROR_BIND_TIMEOUT_OR_FAILURE = 3; - public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 4; - public static final int ERROR_ALREADY_INITIALIZED = 5; - public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 6; - public static final int ERROR_MIDDLEWARE_NOT_BOUND = 7; - public static final int ERROR_UNABLE_TO_START_SERVICE = 8; - public static final int ERROR_STREAM_ALREADY_STARTED = 9; - public static final int ERROR_END_OF_SESSION = 10; - public static final int ERROR_SERVICE_LOST = 11; - public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 12; - public static final int ERROR_IN_E911 = 13; - public static final int ERROR_OUT_OF_MEMORY = 14; - public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 15; - public static final int ERROR_UNABLE_TO_READ_SIM = 16; - public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 17; - public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 18; - public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 19; - public static final int ERROR_UNABLE_TO_INITIALIZE = 20; + + // Following errors are generated in the manager and should not be returned from the + // middleware + /** + * Indicates that either no MBMS middleware app is installed on the device or multiple + * middleware apps are installed on the device. + */ + public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1; + + /** + * Indicates that the app attempted to perform an operation on an instance of + * {@link android.telephony.MbmsDownloadManager} or + * {@link android.telephony.MbmsStreamingManager} without being bound to the middleware. + */ + public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2; + + /** Indicates that the middleware has died and the requested operation was not completed.*/ + public static final int ERROR_MIDDLEWARE_LOST = 3; + + /** + * Indicates errors that may be generated during initialization by the + * middleware. They are applicable to both streaming and file-download use-cases. + */ + public static class InitializationErrors { + /** + * Indicates that the app tried to create more than one instance each of + * {@link android.telephony.MbmsStreamingManager} or + * {@link android.telephony.MbmsDownloadManager}. + */ + public static final int ERROR_DUPLICATE_INITIALIZE = 101; + /** Indicates that the app is not authorized to access media via MBMS.*/ + public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102; + /** Indicates that the middleware was unable to initialize for this app. */ + public static final int ERROR_UNABLE_TO_INITIALIZE = 103; + } + + /** + * Indicates the errors that may occur at any point and are applicable to both + * streaming and file-download. + */ + public static class GeneralErrors { + /** + * Indicates that the app attempted to perform an operation before receiving notification + * that the middleware is ready via {@link MbmsStreamingManagerCallback#middlewareReady()} + * or {@link MbmsDownloadManagerCallback#middlewareReady()}. + */ + public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201; + /** + * Indicates that the middleware ran out of memory and was unable to complete the requested + * operation. + */ + public static final int ERROR_OUT_OF_MEMORY = 202; + /** + * Indicates that the requested operation failed due to the middleware being unavailable due + * to a transient condition. The app may retry the operation at a later time. + */ + public static final int ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE = 203; + /** + * Indicates that the requested operation was not performed due to being in emergency + * callback mode. + */ + public static final int ERROR_IN_E911 = 204; + /** Indicates that MBMS is not available due to the device being in roaming. */ + public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 205; + /** Indicates that MBMS is not available due to a SIM read error. */ + public static final int ERROR_UNABLE_TO_READ_SIM = 206; + /** + * Indicates that MBMS is not available due to the inserted SIM being from an unsupported + * carrier. + */ + public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207; + } + + /** + * Indicates the errors that are applicable only to the streaming use-case + */ + public static class StreamingErrors { + /** Indicates that the middleware cannot start a stream due to too many ongoing streams */ + public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301; + + /** Indicates that the middleware was unable to start the streaming service */ + public static final int ERROR_UNABLE_TO_START_SERVICE = 302; + + /** + * Indicates that the app called + * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)} + * more than once for the same {@link StreamingServiceInfo}. + */ + public static final int ERROR_DUPLICATE_START_STREAM = 303; + } + + /** + * Indicates the errors that are applicable only to the file-download use-case + */ + public static class DownloadErrors { + /** + * Indicates that the app is not allowed to change the temp file root at this time due to + * outstanding download requests. + */ + public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401; + + /** Indicates that the middleware has no record of the supplied {@link DownloadRequest}. */ + public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; + } private final int mErrorCode; diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java index 27d9878a1966..2e91be9acaf7 100644 --- a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java +++ b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java @@ -50,25 +50,12 @@ public class MbmsStreamingManagerCallback extends IMbmsStreamingManagerCallback. } /** - * Called to indicate the active Streaming Services have changed. - * - * This will be caused whenever a new service starts streaming or whenever - * MbmsStreamServiceManager.getActiveStreamingServices is called. - * - * @param services a list of StreamingServiceInfos. May be empty if - * there are no active StreamingServices - */ - public void activeStreamingServicesUpdated(List<StreamingServiceInfo> services) { - // default implementation empty - } - - /** * Called to indicate that the middleware has been initialized and is ready. * * Before this method is called, calling any method on an instance of * {@link android.telephony.MbmsStreamingManager} will result in an {@link MbmsException} * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND} - * or {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY} + * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} */ @Override public void middlewareReady() { diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java index 1e03fb9584b4..4b913f825231 100644 --- a/telephony/java/android/telephony/mbms/MbmsUtils.java +++ b/telephony/java/android/telephony/mbms/MbmsUtils.java @@ -22,14 +22,11 @@ import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.*; import android.content.pm.ServiceInfo; -import android.telephony.MbmsDownloadManager; import android.util.Log; import java.io.File; import java.io.IOException; import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; /** * @hide @@ -78,7 +75,7 @@ public class MbmsUtils { MbmsUtils.getMiddlewareServiceInfo(context, serviceAction); if (mbmsServiceInfo == null) { - throw new MbmsException(MbmsException.ERROR_NO_SERVICE_INSTALLED); + throw new MbmsException(MbmsException.ERROR_NO_UNIQUE_MIDDLEWARE); } bindIntent.setComponent(MbmsUtils.toComponentName(mbmsServiceInfo)); diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java index 475c93aa0eb5..1a6418969a90 100644 --- a/telephony/java/android/telephony/mbms/StreamingService.java +++ b/telephony/java/android/telephony/mbms/StreamingService.java @@ -18,7 +18,6 @@ package android.telephony.mbms; import android.annotation.IntDef; import android.net.Uri; -import android.os.DeadObjectException; import android.os.RemoteException; import android.telephony.mbms.vendor.IMbmsStreamingService; import android.util.Log; @@ -50,15 +49,42 @@ public class StreamingService { */ @Retention(RetentionPolicy.SOURCE) @IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT, - REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE}) + REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE, + REASON_LEFT_MBMS_BROADCAST_AREA}) public @interface StreamingStateChangeReason {} + + /** + * State changed due to a call to {@link #stopStreaming()} or + * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)} + */ public static final int REASON_BY_USER_REQUEST = 1; + + /** + * State changed due to the streaming session ending at the carrier. + */ public static final int REASON_END_OF_SESSION = 2; + + /** + * State changed due to a frequency conflict with another requested stream. + */ public static final int REASON_FREQUENCY_CONFLICT = 3; + + /** + * State changed due to the middleware running out of memory + */ public static final int REASON_OUT_OF_MEMORY = 4; + + /** + * State changed due to the device leaving the home carrier's LTE network. + */ public static final int REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE = 5; /** + * State changed due to the device leaving the where this stream is being broadcast. + */ + public static final int REASON_LEFT_MBMS_BROADCAST_AREA = 5; + + /** * The method of transmission currently used for a stream, * reported via {@link StreamingServiceCallback#streamMethodUpdated} */ @@ -87,7 +113,9 @@ public class StreamingService { * Retreive the Uri used to play this stream. * * This may throw a {@link MbmsException} with the error code - * {@link MbmsException#ERROR_SERVICE_LOST} + * {@link MbmsException#ERROR_MIDDLEWARE_LOST} + * + * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException} * * @return The {@link Uri} to pass to the streaming client. */ @@ -101,7 +129,7 @@ public class StreamingService { } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); mService = null; - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } @@ -115,7 +143,9 @@ public class StreamingService { /** * Stop streaming this service. * This may throw a {@link MbmsException} with the error code - * {@link MbmsException#ERROR_SERVICE_LOST} + * {@link MbmsException#ERROR_MIDDLEWARE_LOST} + * + * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException} */ public void stopStreaming() throws MbmsException { if (mService == null) { @@ -127,10 +157,18 @@ public class StreamingService { } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); mService = null; - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); } } + /** + * Disposes of this stream. Further operations on this object will fail with an + * {@link IllegalStateException}. + * + * This may throw a {@link MbmsException} with the error code + * {@link MbmsException#ERROR_MIDDLEWARE_LOST} + * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException} + */ public void dispose() throws MbmsException { if (mService == null) { throw new IllegalStateException("No streaming service attached"); @@ -140,8 +178,9 @@ public class StreamingService { mService.disposeStream(mSubscriptionId, mServiceInfo.getServiceId()); } catch (RemoteException e) { Log.w(LOG_TAG, "Remote process died"); + throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST); + } finally { mService = null; - throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); } } } diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl index 06be8a011203..725d11c880b2 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl @@ -24,7 +24,6 @@ import android.telephony.mbms.IMbmsDownloadManagerCallback; import android.telephony.mbms.IDownloadCallback; /** - * The interface the opaque MbmsStreamingService will satisfy. * @hide */ interface IMbmsDownloadService @@ -43,12 +42,7 @@ interface IMbmsDownloadService int getDownloadStatus(in DownloadRequest downloadRequest, in FileInfo fileInfo); - /* - * named this for 2 reasons: - * 1 don't want 'State' here as it conflicts with 'Status' of the previous function - * 2 want to perfect typing 'Knowledge' - */ - void resetDownloadKnowledge(in DownloadRequest downloadRequest); + int resetDownloadKnowledge(in DownloadRequest downloadRequest); void dispose(int subId); } diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl index 1370b83857ec..04a53cbe0d00 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl @@ -22,12 +22,11 @@ import android.telephony.mbms.IStreamingServiceCallback; import android.telephony.mbms.StreamingServiceInfo; /** - * The interface the opaque MbmsStreamingService will satisfy. * @hide */ interface IMbmsStreamingService { - int initialize(IMbmsStreamingManagerCallback listener, int subId); + void initialize(IMbmsStreamingManagerCallback listener, int subId); int getStreamingServices(int subId, in List<String> serviceClasses); diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index 305d38780ffc..8fbd4481cfc2 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -16,6 +16,7 @@ package android.telephony.mbms.vendor; +import android.annotation.NonNull; import android.os.RemoteException; import android.telephony.mbms.DownloadRequest; import android.telephony.mbms.FileInfo; @@ -35,7 +36,9 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { /** * Initialize the download service for this app and subId, registering the listener. * - * May throw an {@link IllegalArgumentException} or a {@link SecurityException} + * Exceptions should not be thrown through this method -- this method is called from within a + * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of + * catching them. Call {@link IMbmsDownloadManagerCallback#error(int, String)} instead. * * @param listener The callback to use to communicate with the app. * @param subscriptionId The subscription ID to use. @@ -59,9 +62,8 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { * @param serviceClasses The service classes that the app wishes to get info on. The strings * may contain arbitrary data as negotiated between the app and the * carrier. - * @return One of {@link MbmsException#SUCCESS}, - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}, - * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} + * @return One of {@link MbmsException#SUCCESS} or + * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}, */ @Override public int getFileServices(int subscriptionId, List<String> serviceClasses) @@ -76,14 +78,13 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { * * If the calling app (as identified by the calling UID) currently has any pending download * requests that have not been canceled, the middleware must return - * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here. + * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here. * * @param subscriptionId The subscription id the download is operating under. * @param rootDirectoryPath The path to the app's temp file root directory. * @return {@link MbmsException#SUCCESS}, - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}, - * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}, - * or {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} + * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} or + * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} */ @Override public int setTempFileRootDirectory(int subscriptionId, @@ -109,8 +110,18 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { return 0; } + + /** + * Returns a list of pending {@link DownloadRequest}s that originated from the calling + * application, identified by its uid. A pending request is one that was issued via + * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through + * {@link #cancelDownload(DownloadRequest)}. + * The middleware must return a non-null result synchronously or throw an exception + * inheriting from {@link RuntimeException}. + * @return A list, possibly empty, of {@link DownloadRequest}s + */ @Override - public List<DownloadRequest> listPendingDownloads(int subscriptionId) + public @NonNull List<DownloadRequest> listPendingDownloads(int subscriptionId) throws RemoteException { return null; } @@ -124,23 +135,47 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { * {@link DownloadRequest}. * @param downloadRequest The request to cancel * @return {@link MbmsException#SUCCESS}, - * {@link MbmsException#ERROR_UNKNOWN_DOWNLOAD_REQUEST}, - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY} + * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}, + * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} */ @Override public int cancelDownload(DownloadRequest downloadRequest) throws RemoteException { return 0; } + /** + * Gets information about the status of a file pending download. + * + * If the middleware has not yet been properly initialized or if it has no records of the + * file indicated by {@code fileInfo} being associated with {@code downloadRequest}, + * {@link android.telephony.MbmsDownloadManager#STATUS_UNKNOWN} must be returned. + * + * @param downloadRequest The download request to query. + * @param fileInfo The particular file within the request to get information on. + * @return The status of the download. + */ @Override public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo) throws RemoteException { return 0; } + /** + * Resets the middleware's knowledge of previously-downloaded files in this download request. + * + * When this method is called, the middleware must attempt to re-download all the files + * specified by the {@link DownloadRequest}, even if the files have not changed on the server. + * In addition, current in-progress downloads must not be interrupted. + * + * If the middleware is not aware of the specified download request, return + * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}. + * + * @param downloadRequest The request to re-download files for. + */ @Override - public void resetDownloadKnowledge(DownloadRequest downloadRequest) + public int resetDownloadKnowledge(DownloadRequest downloadRequest) throws RemoteException { + return 0; } /** diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java index c97e754d1dd5..f072c46171d6 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java @@ -33,16 +33,17 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { /** * Initialize streaming service for this app and subId, registering the listener. * - * May throw an {@link IllegalArgumentException} or a {@link SecurityException} + * Exceptions should not be thrown through this method -- this method is called from within a + * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of + * catching them. Call {@link IMbmsStreamingManagerCallback#error(int, String)} instead. * * @param listener The callback to use to communicate with the app. * @param subscriptionId The subscription ID to use. - * @return {@link MbmsException#SUCCESS} or {@link MbmsException#ERROR_ALREADY_INITIALIZED} */ @Override - public int initialize(IMbmsStreamingManagerCallback listener, int subscriptionId) + public void initialize(IMbmsStreamingManagerCallback listener, int subscriptionId) throws RemoteException { - return 0; + return; } /** @@ -59,9 +60,8 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { * @param serviceClasses The service classes that the app wishes to get info on. The strings * may contain arbitrary data as negotiated between the app and the * carrier. - * @return One of {@link MbmsException#SUCCESS}, - * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}, - * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} + * @return {@link MbmsException#SUCCESS} or any of the errors in + * {@link android.telephony.mbms.MbmsException.GeneralErrors} */ @Override public int getStreamingServices(int subscriptionId, @@ -79,8 +79,7 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { * @param subscriptionId The subscription id to use. * @param serviceId The ID of the streaming service that the app has requested. * @param listener The listener object on which the app wishes to receive updates. - * @return {@link MbmsException#SUCCESS}, {@link MbmsException#ERROR_STREAM_ALREADY_STARTED}, - * or {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}. + * @return Any error in {@link android.telephony.mbms.MbmsException.GeneralErrors} */ @Override public int startStreaming(int subscriptionId, String serviceId, diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java index d408b84109bc..6dc9ba7b621f 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertTrue; import android.app.WallpaperColors; import android.graphics.Color; +import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.util.Range; @@ -42,7 +43,7 @@ public class TonalTest { @Test public void extractInto_usesFallback() { GradientColors normal = new GradientColors(); - Tonal tonal = new Tonal(); + Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); tonal.extractInto(null, normal, new GradientColors(), new GradientColors()); assertFalse("Should use fallback color if WallpaperColors is null.", @@ -52,13 +53,14 @@ public class TonalTest { @Test public void extractInto_usesFallbackWhenTooLightOrDark() { GradientColors normal = new GradientColors(); - Tonal tonal = new Tonal(); + Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); tonal.extractInto(new WallpaperColors(Color.valueOf(0xff000000), null, null, 0), normal, new GradientColors(), new GradientColors()); assertTrue("Should use fallback color if WallpaperColors is too dark.", normal.getMainColor() == Tonal.MAIN_COLOR_DARK); - tonal.extractInto(new WallpaperColors(Color.valueOf(0xffffffff), null, null, 0), + tonal.extractInto(new WallpaperColors(Color.valueOf(0xffffffff), null, null, + WallpaperColors.HINT_SUPPORTS_DARK_TEXT), normal, new GradientColors(), new GradientColors()); assertTrue("Should use fallback color if WallpaperColors is too light.", normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT); @@ -89,18 +91,28 @@ public class TonalTest { } @Test - public void colorRange_excludeBlacklistedColor() { - // Creating a WallpaperColors object that contains *only* blacklisted colors - float[] hsl = Tonal.BLACKLISTED_COLORS[0].getCenter(); + public void configParser_dataSanity() { + Tonal.ConfigParser config = new Tonal.ConfigParser(InstrumentationRegistry.getContext()); + // 1 to avoid regression where only first item would be parsed. + assertTrue("Tonal palettes are empty", config.getTonalPalettes().size() > 1); + assertTrue("Blacklisted colors are empty", config.getBlacklistedColors().size() > 1); + } + + @Test + public void tonal_excludeBlacklistedColor() { + // Make sure that palette generation will fail. + Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); + + // Creating a WallpaperColors object that contains *only* blacklisted colors. + float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); WallpaperColors colors = new WallpaperColors(Color.valueOf(ColorUtils.HSLToColor(hsl)), null, null, 0); // Make sure that palette generation will fail - Tonal tonal = new Tonal(); GradientColors normal = new GradientColors(); tonal.extractInto(colors, normal, new GradientColors(), new GradientColors()); - assertFalse("Cannot generate a tonal palette from blacklisted colors.", - normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT); + assertTrue("Cannot generate a tonal palette from blacklisted colors.", + normal.getMainColor() == Tonal.MAIN_COLOR_DARK); } } diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index acf9e8f71718..a115146486a4 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -178,6 +178,7 @@ public class TetheringTest { mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager, mLooper.getLooper(), mSystemProperties, mTetheringDependencies); + verify(mNMService).registerTetheringStatsProvider(any(), anyString()); } @After diff --git a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java index 0e4a36ccfc7e..dcb9723fa5e2 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java +++ b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java @@ -16,26 +16,38 @@ package com.android.server.connectivity.tethering; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.TAG_NONE; +import static android.net.TrafficStats.UID_TETHERING; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; +import static com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.net.ITetheringStatsProvider; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; +import android.net.NetworkStats; import android.net.RouteInfo; import android.net.util.SharedLog; +import android.os.Handler; +import android.os.Looper; +import android.os.INetworkManagementService; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; @@ -66,11 +78,14 @@ public class OffloadControllerTest { @Mock private OffloadHardwareInterface mHardware; @Mock private ApplicationInfo mApplicationInfo; @Mock private Context mContext; + @Mock private INetworkManagementService mNMService; private final ArgumentCaptor<ArrayList> mStringArrayCaptor = ArgumentCaptor.forClass(ArrayList.class); + private final ArgumentCaptor<ITetheringStatsProvider.Stub> mTetherStatsProviderCaptor = + ArgumentCaptor.forClass(ITetheringStatsProvider.Stub.class); private MockContentResolver mContentResolver; - @Before public void setUp() throws Exception { + @Before public void setUp() { MockitoAnnotations.initMocks(this); when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo); when(mContext.getPackageName()).thenReturn("OffloadControllerTest"); @@ -88,14 +103,23 @@ public class OffloadControllerTest { when(mHardware.initOffloadConfig()).thenReturn(true); when(mHardware.initOffloadControl(any(OffloadHardwareInterface.ControlCallback.class))) .thenReturn(true); + when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats()); } private void enableOffload() { Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); } + private OffloadController makeOffloadController() throws Exception { + OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()), + mHardware, mContentResolver, mNMService, new SharedLog("test")); + verify(mNMService).registerTetheringStatsProvider( + mTetherStatsProviderCaptor.capture(), anyString()); + return offload; + } + @Test - public void testNoSettingsValueDefaultDisabledDoesNotStart() { + public void testNoSettingsValueDefaultDisabledDoesNotStart() throws Exception { setupFunctioningHardwareInterface(); when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1); try { @@ -103,8 +127,7 @@ public class OffloadControllerTest { fail(); } catch (SettingNotFoundException expected) {} - final OffloadController offload = - new OffloadController(null, mHardware, mContentResolver, new SharedLog("test")); + final OffloadController offload = makeOffloadController(); offload.start(); final InOrder inOrder = inOrder(mHardware); @@ -116,7 +139,7 @@ public class OffloadControllerTest { } @Test - public void testNoSettingsValueDefaultEnabledDoesStart() { + public void testNoSettingsValueDefaultEnabledDoesStart() throws Exception { setupFunctioningHardwareInterface(); when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0); try { @@ -124,8 +147,7 @@ public class OffloadControllerTest { fail(); } catch (SettingNotFoundException expected) {} - final OffloadController offload = - new OffloadController(null, mHardware, mContentResolver, new SharedLog("test")); + final OffloadController offload = makeOffloadController(); offload.start(); final InOrder inOrder = inOrder(mHardware); @@ -137,12 +159,11 @@ public class OffloadControllerTest { } @Test - public void testSettingsAllowsStart() { + public void testSettingsAllowsStart() throws Exception { setupFunctioningHardwareInterface(); Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); - final OffloadController offload = - new OffloadController(null, mHardware, mContentResolver, new SharedLog("test")); + final OffloadController offload = makeOffloadController(); offload.start(); final InOrder inOrder = inOrder(mHardware); @@ -154,12 +175,11 @@ public class OffloadControllerTest { } @Test - public void testSettingsDisablesStart() { + public void testSettingsDisablesStart() throws Exception { setupFunctioningHardwareInterface(); Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1); - final OffloadController offload = - new OffloadController(null, mHardware, mContentResolver, new SharedLog("test")); + final OffloadController offload = makeOffloadController(); offload.start(); final InOrder inOrder = inOrder(mHardware); @@ -174,8 +194,7 @@ public class OffloadControllerTest { setupFunctioningHardwareInterface(); enableOffload(); - final OffloadController offload = - new OffloadController(null, mHardware, mContentResolver, new SharedLog("test")); + final OffloadController offload = makeOffloadController(); offload.start(); final InOrder inOrder = inOrder(mHardware); @@ -240,6 +259,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(null), eq(null)); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verifyNoMoreInteractions(); final String ipv4Gateway = "192.0.2.1"; @@ -249,6 +269,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null)); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw1 = "fe80::cafe"; @@ -258,6 +279,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); ArrayList<String> v6gws = mStringArrayCaptor.getValue(); assertEquals(1, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); @@ -270,6 +292,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); v6gws = mStringArrayCaptor.getValue(); assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); @@ -287,6 +310,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); v6gws = mStringArrayCaptor.getValue(); assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); @@ -321,6 +345,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); inOrder.verifyNoMoreInteractions(); // Completely identical LinkProperties updates are de-duped. @@ -331,4 +356,65 @@ public class OffloadControllerTest { anyObject(), anyObject(), anyObject(), anyObject()); inOrder.verifyNoMoreInteractions(); } + + private void assertNetworkStats(String iface, ForwardedStats stats, NetworkStats.Entry entry) { + assertEquals(iface, entry.iface); + assertEquals(stats.rxBytes, entry.rxBytes); + assertEquals(stats.txBytes, entry.txBytes); + assertEquals(SET_DEFAULT, entry.set); + assertEquals(TAG_NONE, entry.tag); + assertEquals(UID_TETHERING, entry.uid); + } + + @Test + public void testGetForwardedStats() throws Exception { + setupFunctioningHardwareInterface(); + enableOffload(); + + final OffloadController offload = makeOffloadController(); + offload.start(); + + final String ethernetIface = "eth1"; + final String mobileIface = "rmnet_data0"; + + ForwardedStats ethernetStats = new ForwardedStats(); + ethernetStats.rxBytes = 12345; + ethernetStats.txBytes = 54321; + + ForwardedStats mobileStats = new ForwardedStats(); + mobileStats.rxBytes = 999; + mobileStats.txBytes = 99999; + + when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(ethernetStats); + when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn(mobileStats); + + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(ethernetIface); + offload.setUpstreamLinkProperties(lp); + + lp.setInterfaceName(mobileIface); + offload.setUpstreamLinkProperties(lp); + + lp.setInterfaceName(ethernetIface); + offload.setUpstreamLinkProperties(lp); + + ethernetStats.rxBytes = 100000; + ethernetStats.txBytes = 100000; + offload.setUpstreamLinkProperties(null); + + NetworkStats stats = mTetherStatsProviderCaptor.getValue().getTetherStats(); + assertEquals(2, stats.size()); + + NetworkStats.Entry entry = null; + int ethernetPosition = ethernetIface.equals(stats.getValues(0, entry).iface) ? 0 : 1; + int mobilePosition = 1 - ethernetPosition; + + entry = stats.getValues(mobilePosition, entry); + assertNetworkStats(mobileIface, mobileStats, entry); + + ethernetStats.rxBytes = 12345 + 100000; + ethernetStats.txBytes = 54321 + 100000; + entry = stats.getValues(ethernetPosition, entry); + assertNetworkStats(ethernetIface, ethernetStats, entry); + } } |