diff options
64 files changed, 3518 insertions, 1253 deletions
diff --git a/apct-tests/perftests/utils/Android.mk b/apct-tests/perftests/utils/Android.mk index 604f0adbe23e..19f83c8f5bb0 100644 --- a/apct-tests/perftests/utils/Android.mk +++ b/apct-tests/perftests/utils/Android.mk @@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-test \ + androidx.test.rules \ androidx.annotation_annotation # Build all java files in the java subdirectory diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java b/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java index da17818bbda0..93bf541d02b4 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/BenchmarkState.java @@ -20,9 +20,10 @@ import android.app.Activity; import android.app.Instrumentation; import android.os.Bundle; import android.os.Debug; -import android.support.test.InstrumentationRegistry; import android.util.Log; +import androidx.test.InstrumentationRegistry; + import java.io.File; import java.util.ArrayList; import java.util.concurrent.TimeUnit; diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/PerfManualStatusReporter.java b/apct-tests/perftests/utils/src/android/perftests/utils/PerfManualStatusReporter.java index 0de6f1d944ff..8187c6fa63d5 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/PerfManualStatusReporter.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/PerfManualStatusReporter.java @@ -16,7 +16,7 @@ package android.perftests.utils; -import android.support.test.InstrumentationRegistry; +import androidx.test.InstrumentationRegistry; import org.junit.rules.TestRule; import org.junit.runner.Description; diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java index 4b7b98da442b..d54a85147bf3 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java @@ -16,16 +16,17 @@ package android.perftests.utils; -import android.support.test.InstrumentationRegistry; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + import android.util.Log; +import androidx.test.InstrumentationRegistry; + import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - /** * Use this rule to make sure we report the status after the test success. * diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java b/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java index 895547df0393..7b52576c1abd 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java @@ -17,14 +17,13 @@ package android.perftests.utils; import android.app.UiAutomation; import android.os.ParcelFileDescriptor; -import android.support.test.InstrumentationRegistry; import android.text.TextUtils; import android.util.AndroidRuntimeException; -import android.util.Log; - -import java.io.FileInputStream; import androidx.annotation.NonNull; +import androidx.test.InstrumentationRegistry; + +import java.io.FileInputStream; /** * Provides Shell-based utilities such as running a command. diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp index f0b751db5ae9..d610f663cd97 100644 --- a/cmds/statsd/Android.bp +++ b/cmds/statsd/Android.bp @@ -136,7 +136,7 @@ cc_defaults { "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power.stats@1.0", - "android.hardware.thermal@1.0", + "android.hardware.thermal@2.0", "libpackagelistparser", "libsysutils", "libcutils", diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index e5415430d82a..5c53a3a585f8 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -2789,13 +2789,14 @@ message BatteryLevel { * frameworks/base/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp */ message Temperature { - // The type of temperature being reported. Eg. CPU, GPU, SKIN, BATTERY. + // The type of temperature being reported. Eg. CPU, GPU, SKIN, BATTERY, BCL_. optional android.os.TemperatureTypeEnum sensor_location = 1; // The name of the temperature source. Eg. CPU0 optional string sensor_name = 2; // Temperature in tenths of a degree C. + // For BCL, it is decimillivolt, decimilliamps, and percentage * 10. optional int32 temperature_deci_celsius = 3; } diff --git a/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp index 33a17deabc5a..53709f14564d 100644 --- a/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp +++ b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp @@ -17,7 +17,7 @@ #define DEBUG false // STOPSHIP if true #include "Log.h" -#include <android/hardware/thermal/1.0/IThermal.h> +#include <android/hardware/thermal/2.0/IThermal.h> #include "external/ResourceThermalManagerPuller.h" #include "external/StatsPuller.h" @@ -31,10 +31,11 @@ using android::hardware::hidl_death_recipient; using android::hardware::hidl_vec; using android::hidl::base::V1_0::IBase; -using android::hardware::thermal::V1_0::IThermal; -using android::hardware::thermal::V1_0::Temperature; -using android::hardware::thermal::V1_0::ThermalStatus; -using android::hardware::thermal::V1_0::ThermalStatusCode; +using ::android::hardware::thermal::V2_0::IThermal; +using ::android::hardware::thermal::V2_0::Temperature; +using ::android::hardware::thermal::V2_0::TemperatureType; +using ::android::hardware::thermal::V1_0::ThermalStatus; +using ::android::hardware::thermal::V1_0::ThermalStatusCode; using android::hardware::Return; using android::hardware::Void; @@ -49,7 +50,7 @@ namespace os { namespace statsd { bool getThermalHalLocked(); -sp<android::hardware::thermal::V1_0::IThermal> gThermalHal = nullptr; +sp<android::hardware::thermal::V2_0::IThermal> gThermalHal = nullptr; std::mutex gThermalHalMutex; struct ThermalHalDeathRecipient : virtual public hidl_death_recipient { @@ -107,7 +108,7 @@ bool ResourceThermalManagerPuller::PullInternal(vector<shared_ptr<LogEvent>>* da data->clear(); bool resultSuccess = true; - Return<void> ret = gThermalHal->getTemperatures( + Return<void> ret = gThermalHal->getCurrentTemperatures(false, TemperatureType::SKIN, [&](ThermalStatus status, const hidl_vec<Temperature>& temps) { if (status.code != ThermalStatusCode::SUCCESS) { ALOGE("Failed to get temperatures from ThermalHAL. Status: %d", status.code); @@ -121,7 +122,7 @@ bool ResourceThermalManagerPuller::PullInternal(vector<shared_ptr<LogEvent>>* da ptr->write((static_cast<int>(temps[i].type))); ptr->write(temps[i].name); // Convert the temperature to an int. - int32_t temp = static_cast<int>(temps[i].currentValue * 10); + int32_t temp = static_cast<int>(temps[i].value * 10); ptr->write(temp); ptr->init(); data->push_back(ptr); diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index fdadfbe0ba78..d9793097fc3a 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -482,7 +482,7 @@ public class GraphicsEnvironment { String applicationPackageName = context.getPackageName(); String devOptInApplicationName = coreSettings.getString( - Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP); + Settings.Global.GUP_DEV_OPT_IN_APPS); boolean devOptIn = applicationPackageName.equals(devOptInApplicationName); boolean whitelisted = onWhitelist(context, driverPackageName, ai.packageName); if (!devOptIn && !whitelisted) { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 65514b6f1872..52effb3d4258 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11982,11 +11982,16 @@ public final class Settings { "angle_gl_driver_selection_values"; /** - * App that is selected to use updated graphics driver. + * Apps that are selected to use Game Update Package. * @hide */ - public static final String UPDATED_GFX_DRIVER_DEV_OPT_IN_APP = - "updated_gfx_driver_dev_opt_in_app"; + public static final String GUP_DEV_OPT_IN_APPS = "gup_dev_opt_in_apps"; + + /** + * Apps on the black list that are forbidden to useGame Update Package. + * @hide + */ + public static final String GUP_BLACK_LIST = "gup_black_list"; /** * Ordered GPU debug layer list for Vulkan diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index a006e5de283e..1a708e8e30ec 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -165,7 +165,8 @@ public class SurfaceControl implements Parcelable { private static native void nativeSetInputWindowInfo(long transactionObj, long nativeObject, InputWindowHandle handle); - + private static native void nativeTransferTouchFocus(long transactionObj, IBinder fromToken, + IBinder toToken); private final CloseGuard mCloseGuard = CloseGuard.get(); private final String mName; @@ -1541,6 +1542,21 @@ public class SurfaceControl implements Parcelable { return this; } + /** + * Transfers touch focus from one window to another. It is possible for multiple windows to + * have touch focus if they support split touch dispatch + * {@link android.view.WindowManager.LayoutParams#FLAG_SPLIT_TOUCH} but this + * method only transfers touch focus of the specified window without affecting + * other windows that may also have touch focus at the same time. + * @param fromToken The token of a window that currently has touch focus. + * @param toToken The token of the window that should receive touch focus in + * place of the first. + */ + public Transaction transferTouchFocus(IBinder fromToken, IBinder toToken) { + nativeTransferTouchFocus(mNativeObject, fromToken, toToken); + return this; + } + @UnsupportedAppUsage public Transaction setMatrix(SurfaceControl sc, float dsdx, float dtdx, float dtdy, float dsdy) { diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index 9f666a40bef3..fb6cacf44b45 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -34,6 +34,7 @@ import dalvik.system.CloseGuard; import java.io.PrintWriter; import java.util.ArrayList; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; /** * Session used to notify a system-provided Content Capture service about events associated with @@ -90,6 +91,12 @@ public abstract class ContentCaptureSession implements AutoCloseable { private final CloseGuard mCloseGuard = CloseGuard.get(); + /** + * Guard use to ignore events after it's destroyed. + */ + @NonNull + private final AtomicBoolean mDestroyed = new AtomicBoolean(); + /** @hide */ @Nullable protected final String mId = UUID.randomUUID().toString(); @@ -157,10 +164,10 @@ public abstract class ContentCaptureSession implements AutoCloseable { * <p>Once destroyed, any new notification will be dropped. */ public final void destroy() { - //TODO(b/111276913): mark it as destroyed so other methods are ignored (and test on CTS) - - //TODO(b/111276913): probably shouldn't check for it - if (!isContentCaptureEnabled()) return; + if (!mDestroyed.compareAndSet(false, true)) { + Log.e(mTag, "destroy(): already destroyed"); + return; + } mCloseGuard.close(); @@ -298,10 +305,13 @@ public abstract class ContentCaptureSession implements AutoCloseable { return new ViewNode.ViewStructureImpl(parentId, virtualId); } - abstract boolean isContentCaptureEnabled(); + boolean isContentCaptureEnabled() { + return !mDestroyed.get(); + } @CallSuper void dump(@NonNull String prefix, @NonNull PrintWriter pw) { + pw.print(prefix); pw.print("destroyed: "); pw.println(mDestroyed.get()); if (mChildren != null && !mChildren.isEmpty()) { final String prefix2 = prefix + " "; final int numberChildren = mChildren.size(); diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index 92e0187f5b0f..12c50ce3e13d 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -219,7 +219,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession { /** * Callback from {@code system_server} after call to * {@link IContentCaptureManager#startSession(int, IBinder, ComponentName, String, - * ContentCaptureContext, int, IResultReceiver)}. + * int, IResultReceiver)}. * * @param resultCode session state * @param binder handle to {@code IContentCaptureDirectManager} @@ -425,7 +425,8 @@ public final class MainContentCaptureSession extends ContentCaptureSession { @Override boolean isContentCaptureEnabled() { - return mSystemServerInterface != null && !mDisabled.get(); + return super.isContentCaptureEnabled() && mSystemServerInterface != null + && !mDisabled.get(); } // TODO(b/121033016): refactor "notifyXXXX" methods below to a common "Buffer" object that is diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java index 78d366cd2436..2995a8f43268 100644 --- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -16,14 +16,14 @@ package com.android.internal.hardware; -import com.android.internal.R; - import android.content.Context; import android.os.Build; import android.os.SystemProperties; import android.provider.Settings; import android.text.TextUtils; +import com.android.internal.R; + public class AmbientDisplayConfiguration { private final Context mContext; @@ -37,7 +37,8 @@ public class AmbientDisplayConfiguration { public boolean enabled(int user) { return pulseOnNotificationEnabled(user) || pulseOnLongPressEnabled(user) - || alwaysOnEnabled(user); + || alwaysOnEnabled(user) + || wakeLockScreenGestureEnabled(user); } public boolean pulseOnNotificationEnabled(int user) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index c745c160e143..6576587899be 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -348,6 +348,15 @@ static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactio transaction->setInputWindowInfo(ctrl, *handle->getInfo()); } +static void nativeTransferTouchFocus(JNIEnv* env, jclass clazz, jlong transactionObj, + jobject fromTokenObj, jobject toTokenObj) { + auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); + + sp<IBinder> fromToken(ibinderForJavaObject(env, fromTokenObj)); + sp<IBinder> toToken(ibinderForJavaObject(env, toTokenObj)); + transaction->transferTouchFocus(fromToken, toToken); +} + static void nativeSetColor(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jfloatArray fColor) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); @@ -1032,7 +1041,9 @@ static const JNINativeMethod sSurfaceControlMethods[] = { {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;", (void*)nativeCaptureLayers }, {"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V", - (void*)nativeSetInputWindowInfo }, + (void*)nativeSetInputWindowInfo }, + {"nativeTransferTouchFocus", "(JLandroid/os/IBinder;Landroid/os/IBinder;)V", + (void*)nativeTransferTouchFocus }, {"nativeGetDisplayedContentSamplingAttributes", "(Landroid/os/IBinder;)Landroid/hardware/display/DisplayedContentSamplingAttributes;", (void*)nativeGetDisplayedContentSamplingAttributes }, diff --git a/core/proto/android/os/enums.proto b/core/proto/android/os/enums.proto index db4a4c4d836b..c35706501c3d 100644 --- a/core/proto/android/os/enums.proto +++ b/core/proto/android/os/enums.proto @@ -57,6 +57,7 @@ enum BatteryStatusEnum { } // These constants are defined in hardware/interfaces/thermal/1.0/types.hal +// and in hardware/interfaces/thermal/2.0/types.hal // They are primarily used by android/os/HardwarePropertiesManager.java. // Any change to the types in the thermal hal should be made here as well. enum TemperatureTypeEnum { @@ -65,6 +66,16 @@ enum TemperatureTypeEnum { TEMPERATURE_TYPE_GPU = 1; TEMPERATURE_TYPE_BATTERY = 2; TEMPERATURE_TYPE_SKIN = 3; + TEMPERATURE_TYPE_USB_PORT = 4; + TEMPERATURE_TYPE_POWER_AMPLIFIER = 5; + + // Battery Charge Limit - virtual thermal sensors. + TEMPERATURE_TYPE_BCL_VOLTAGE = 6; + TEMPERATURE_TYPE_BCL_CURRENT = 7; + TEMPERATURE_TYPE_BCL_PERCENTAGE = 8; + + // Neural Processing Unit. + TEMPERATURE_TYPE_NPU = 9; } // Wakelock types, primarily used by android/os/PowerManager.java. diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index 11bd43b11977..a914369a036c 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -436,9 +436,11 @@ message GlobalSettingsProto { // Ordered GPU debug layer list for GLES // i.e. <layer1>:<layer2>:...:<layerN> optional SettingProto debug_layers_gles = 7; - // App opt in to load updated graphics driver instead of - // native graphcis driver through developer options. - optional SettingProto updated_gfx_driver_dev_opt_in_app = 8; + // Apps opt in to load graphics driver from Game Update Package + // instead of native graphcis driver through developer options. + optional SettingProto gup_dev_opt_in_apps = 8; + // Apps on the black list that are forbidden to useGame Update Package. + optional SettingProto gup_black_list = 9; } optional Gpu gpu = 59; diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index f8bd4e33ec75..ac57d20a438a 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -475,7 +475,8 @@ public class SettingsBackupTest { Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_ALL_ANGLE, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_PKGS, Settings.Global.GLOBAL_SETTINGS_ANGLE_GL_DRIVER_SELECTION_VALUES, - Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, + Settings.Global.GUP_DEV_OPT_IN_APPS, + Settings.Global.GUP_BLACK_LIST, Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, diff --git a/core/tests/featureflagtests/Android.mk b/core/tests/featureflagtests/Android.mk index 5e518b60a9ee..ce7cb181b53a 100644 --- a/core/tests/featureflagtests/Android.mk +++ b/core/tests/featureflagtests/Android.mk @@ -9,7 +9,7 @@ LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_DX_FLAGS := --core-library -LOCAL_STATIC_JAVA_LIBRARIES := android-common frameworks-core-util-lib android-support-test +LOCAL_STATIC_JAVA_LIBRARIES := android-common frameworks-core-util-lib androidx.test.rules LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base LOCAL_PACKAGE_NAME := FrameworksCoreFeatureFlagTests LOCAL_PRIVATE_PLATFORM_APIS := true diff --git a/core/tests/featureflagtests/AndroidManifest.xml b/core/tests/featureflagtests/AndroidManifest.xml index b8ffacbe5aa8..326374e47702 100644 --- a/core/tests/featureflagtests/AndroidManifest.xml +++ b/core/tests/featureflagtests/AndroidManifest.xml @@ -26,7 +26,7 @@ </application> <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" + android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="com.android.frameworks.coretests.featureflagtests" android:label="Frameworks FeatureFlagUtils Tests" /> diff --git a/core/tests/featureflagtests/src/android/util/FeatureFlagUtilsTest.java b/core/tests/featureflagtests/src/android/util/FeatureFlagUtilsTest.java index 0b1b333a1ddc..316042874201 100644 --- a/core/tests/featureflagtests/src/android/util/FeatureFlagUtilsTest.java +++ b/core/tests/featureflagtests/src/android/util/FeatureFlagUtilsTest.java @@ -24,10 +24,11 @@ import static junit.framework.Assert.assertTrue; import android.content.Context; import android.os.SystemProperties; import android.provider.Settings; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index 5c1915b724de..f0db1b4c62e3 100644 --- a/media/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl @@ -47,9 +47,9 @@ interface ISessionController { PendingIntent getLaunchPendingIntent(); long getFlags(); ParcelableVolumeInfo getVolumeAttributes(); - void adjustVolume(String packageName, in ControllerCallbackLink caller, + void adjustVolume(String packageName, String opPackageName, in ControllerCallbackLink caller, boolean asSystemService, int direction, int flags); - void setVolumeTo(String packageName, in ControllerCallbackLink caller, + void setVolumeTo(String packageName, String opPackageName, in ControllerCallbackLink caller, int value, int flags); // These commands are for the TransportControls diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index 580196736aba..f2c0e32781c2 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -35,9 +35,10 @@ interface ISessionManager { List<IBinder> getSessions(in ComponentName compName, int userId); void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent, boolean needWakeLock); - void dispatchVolumeKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent, - int stream, boolean musicOnly); - void dispatchAdjustVolume(String packageName, int suggestedStream, int delta, int flags); + void dispatchVolumeKeyEvent(String packageName, String opPackageName, boolean asSystemService, + in KeyEvent keyEvent, int stream, boolean musicOnly); + void dispatchAdjustVolume(String packageName, String opPackageName, int suggestedStream, + int delta, int flags); void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName, int userId); void removeSessionsListener(in IActiveSessionsListener listener); diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 5eb77f9b58e2..7b061fe8e546 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -154,7 +154,7 @@ public final class MediaController { return false; } try { - return mSessionBinder.sendMediaButton(mContext.getOpPackageName(), mCbStub, + return mSessionBinder.sendMediaButton(mContext.getPackageName(), mCbStub, asSystemService, keyEvent); } catch (RemoteException e) { // System is dead. =( @@ -187,8 +187,12 @@ public final class MediaController { break; } try { - mSessionBinder.adjustVolume(mContext.getOpPackageName(), mCbStub, true, - direction, AudioManager.FLAG_SHOW_UI); + // Note: Need both package name and OP package name. Package name is used for + // RemoteUserInfo, and OP package name is used for AudioService's internal + // AppOpsManager usages. + mSessionBinder.adjustVolume(mContext.getPackageName(), + mContext.getOpPackageName(), mCbStub, true, direction, + AudioManager.FLAG_SHOW_UI); } catch (RemoteException e) { Log.wtf(TAG, "Error calling adjustVolumeBy", e); } @@ -198,8 +202,11 @@ public final class MediaController { final int flags = AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE | AudioManager.FLAG_FROM_KEY; try { - mSessionBinder.adjustVolume(mContext.getOpPackageName(), mCbStub, true, 0, - flags); + // Note: Need both package name and OP package name. Package name is used for + // RemoteUserInfo, and OP package name is used for AudioService's internal + // AppOpsManager usages. + mSessionBinder.adjustVolume(mContext.getPackageName(), + mContext.getOpPackageName(), mCbStub, true, 0, flags); } catch (RemoteException e) { Log.wtf(TAG, "Error calling adjustVolumeBy", e); } @@ -365,7 +372,11 @@ public final class MediaController { */ public void setVolumeTo(int value, int flags) { try { - mSessionBinder.setVolumeTo(mContext.getOpPackageName(), mCbStub, value, flags); + // Note: Need both package name and OP package name. Package name is used for + // RemoteUserInfo, and OP package name is used for AudioService's internal + // AppOpsManager usages. + mSessionBinder.setVolumeTo(mContext.getPackageName(), mContext.getOpPackageName(), + mCbStub, value, flags); } catch (RemoteException e) { Log.wtf(TAG, "Error calling setVolumeTo.", e); } @@ -386,8 +397,11 @@ public final class MediaController { */ public void adjustVolume(int direction, int flags) { try { - mSessionBinder.adjustVolume(mContext.getOpPackageName(), mCbStub, false, direction, - flags); + // Note: Need both package name and OP package name. Package name is used for + // RemoteUserInfo, and OP package name is used for AudioService's internal + // AppOpsManager usages. + mSessionBinder.adjustVolume(mContext.getPackageName(), mContext.getOpPackageName(), + mCbStub, false, direction, flags); } catch (RemoteException e) { Log.wtf(TAG, "Error calling adjustVolumeBy.", e); } @@ -453,7 +467,7 @@ public final class MediaController { throw new IllegalArgumentException("command cannot be null or empty"); } try { - mSessionBinder.sendCommand(mContext.getOpPackageName(), mCbStub, command, args, cb); + mSessionBinder.sendCommand(mContext.getPackageName(), mCbStub, command, args, cb); } catch (RemoteException e) { Log.d(TAG, "Dead object in sendCommand.", e); } @@ -519,7 +533,7 @@ public final class MediaController { if (!mCbRegistered) { try { - mSessionBinder.registerCallbackListener(mContext.getOpPackageName(), mCbStub); + mSessionBinder.registerCallbackListener(mContext.getPackageName(), mCbStub); mCbRegistered = true; } catch (RemoteException e) { Log.e(TAG, "Dead object in registerCallback", e); @@ -666,7 +680,7 @@ public final class MediaController { */ public void prepare() { try { - mSessionBinder.prepare(mContext.getOpPackageName(), mCbStub); + mSessionBinder.prepare(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling prepare.", e); } @@ -690,7 +704,7 @@ public final class MediaController { "You must specify a non-empty String for prepareFromMediaId."); } try { - mSessionBinder.prepareFromMediaId(mContext.getOpPackageName(), mCbStub, mediaId, + mSessionBinder.prepareFromMediaId(mContext.getPackageName(), mCbStub, mediaId, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling prepare(" + mediaId + ").", e); @@ -717,7 +731,7 @@ public final class MediaController { query = ""; } try { - mSessionBinder.prepareFromSearch(mContext.getOpPackageName(), mCbStub, query, + mSessionBinder.prepareFromSearch(mContext.getPackageName(), mCbStub, query, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling prepare(" + query + ").", e); @@ -742,7 +756,7 @@ public final class MediaController { "You must specify a non-empty Uri for prepareFromUri."); } try { - mSessionBinder.prepareFromUri(mContext.getOpPackageName(), mCbStub, uri, extras); + mSessionBinder.prepareFromUri(mContext.getPackageName(), mCbStub, uri, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling prepare(" + uri + ").", e); } @@ -753,7 +767,7 @@ public final class MediaController { */ public void play() { try { - mSessionBinder.play(mContext.getOpPackageName(), mCbStub); + mSessionBinder.play(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling play.", e); } @@ -772,7 +786,7 @@ public final class MediaController { "You must specify a non-empty String for playFromMediaId."); } try { - mSessionBinder.playFromMediaId(mContext.getOpPackageName(), mCbStub, mediaId, + mSessionBinder.playFromMediaId(mContext.getPackageName(), mCbStub, mediaId, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling play(" + mediaId + ").", e); @@ -795,7 +809,7 @@ public final class MediaController { query = ""; } try { - mSessionBinder.playFromSearch(mContext.getOpPackageName(), mCbStub, query, extras); + mSessionBinder.playFromSearch(mContext.getPackageName(), mCbStub, query, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling play(" + query + ").", e); } @@ -814,7 +828,7 @@ public final class MediaController { "You must specify a non-empty Uri for playFromUri."); } try { - mSessionBinder.playFromUri(mContext.getOpPackageName(), mCbStub, uri, extras); + mSessionBinder.playFromUri(mContext.getPackageName(), mCbStub, uri, extras); } catch (RemoteException e) { Log.wtf(TAG, "Error calling play(" + uri + ").", e); } @@ -826,7 +840,7 @@ public final class MediaController { */ public void skipToQueueItem(long id) { try { - mSessionBinder.skipToQueueItem(mContext.getOpPackageName(), mCbStub, id); + mSessionBinder.skipToQueueItem(mContext.getPackageName(), mCbStub, id); } catch (RemoteException e) { Log.wtf(TAG, "Error calling skipToItem(" + id + ").", e); } @@ -838,7 +852,7 @@ public final class MediaController { */ public void pause() { try { - mSessionBinder.pause(mContext.getOpPackageName(), mCbStub); + mSessionBinder.pause(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling pause.", e); } @@ -850,7 +864,7 @@ public final class MediaController { */ public void stop() { try { - mSessionBinder.stop(mContext.getOpPackageName(), mCbStub); + mSessionBinder.stop(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling stop.", e); } @@ -863,7 +877,7 @@ public final class MediaController { */ public void seekTo(long pos) { try { - mSessionBinder.seekTo(mContext.getOpPackageName(), mCbStub, pos); + mSessionBinder.seekTo(mContext.getPackageName(), mCbStub, pos); } catch (RemoteException e) { Log.wtf(TAG, "Error calling seekTo.", e); } @@ -875,7 +889,7 @@ public final class MediaController { */ public void fastForward() { try { - mSessionBinder.fastForward(mContext.getOpPackageName(), mCbStub); + mSessionBinder.fastForward(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling fastForward.", e); } @@ -886,7 +900,7 @@ public final class MediaController { */ public void skipToNext() { try { - mSessionBinder.next(mContext.getOpPackageName(), mCbStub); + mSessionBinder.next(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling next.", e); } @@ -898,7 +912,7 @@ public final class MediaController { */ public void rewind() { try { - mSessionBinder.rewind(mContext.getOpPackageName(), mCbStub); + mSessionBinder.rewind(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling rewind.", e); } @@ -909,7 +923,7 @@ public final class MediaController { */ public void skipToPrevious() { try { - mSessionBinder.previous(mContext.getOpPackageName(), mCbStub); + mSessionBinder.previous(mContext.getPackageName(), mCbStub); } catch (RemoteException e) { Log.wtf(TAG, "Error calling previous.", e); } @@ -924,7 +938,7 @@ public final class MediaController { */ public void setRating(Rating rating) { try { - mSessionBinder.rate(mContext.getOpPackageName(), mCbStub, rating); + mSessionBinder.rate(mContext.getPackageName(), mCbStub, rating); } catch (RemoteException e) { Log.wtf(TAG, "Error calling rate.", e); } @@ -959,7 +973,7 @@ public final class MediaController { throw new IllegalArgumentException("CustomAction cannot be null."); } try { - mSessionBinder.sendCustomAction(mContext.getOpPackageName(), mCbStub, action, args); + mSessionBinder.sendCustomAction(mContext.getPackageName(), mCbStub, action, args); } catch (RemoteException e) { Log.d(TAG, "Dead object in sendCustomAction.", e); } diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 73dd55c1b88a..7a4116f8baa8 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -312,7 +312,7 @@ public final class MediaSessionManager { private void dispatchMediaKeyEventInternal(boolean asSystemService, @NonNull KeyEvent keyEvent, boolean needWakeLock) { try { - mService.dispatchMediaKeyEvent(mContext.getOpPackageName(), asSystemService, keyEvent, + mService.dispatchMediaKeyEvent(mContext.getPackageName(), asSystemService, keyEvent, needWakeLock); } catch (RemoteException e) { Log.e(TAG, "Failed to send key event.", e); @@ -348,8 +348,8 @@ public final class MediaSessionManager { private void dispatchVolumeKeyEventInternal(boolean asSystemService, @NonNull KeyEvent keyEvent, int stream, boolean musicOnly) { try { - mService.dispatchVolumeKeyEvent(mContext.getOpPackageName(), asSystemService, keyEvent, - stream, musicOnly); + mService.dispatchVolumeKeyEvent(mContext.getPackageName(), mContext.getOpPackageName(), + asSystemService, keyEvent, stream, musicOnly); } catch (RemoteException e) { Log.e(TAG, "Failed to send volume key event.", e); } @@ -369,8 +369,8 @@ public final class MediaSessionManager { */ public void dispatchAdjustVolume(int suggestedStream, int direction, int flags) { try { - mService.dispatchAdjustVolume(mContext.getOpPackageName(), suggestedStream, direction, - flags); + mService.dispatchAdjustVolume(mContext.getPackageName(), mContext.getOpPackageName(), + suggestedStream, direction, flags); } catch (RemoteException e) { Log.e(TAG, "Failed to send adjust volume.", e); } diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 7481fff74765..f75f69b4f2ee 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -95,14 +95,16 @@ cc_library_shared { ], shared_libs: [ - "android.hardware.cas@1.0", // for CasManager. VNDK??? - "android.hardware.cas.native@1.0", // CasManager. VNDK??? + // MediaCas + "android.hardware.cas@1.0", + "android.hardware.cas.native@1.0", "android.hidl.allocator@1.0", + "libhidlbase", "libhidlmemory", - "libbinder", - "libgui", // for VideoFrameScheduler - "libhidlbase", // VNDK??? - "libpowermanager", // for JWakeLock. to be removed + + "libpowermanager", // Used by JWakeLock. Will be replace with public SDJ API. + "libmediametrics", // Used by MediaMetrics. Will be replaced with stable C API. + "libbinder", // Used by JWakeLock and MediaMetrics. "libutils", // Have to use shared lib to make libandroid_runtime behave correctly. // Otherwise, AndroidRuntime::getJNIEnv() will return NULL. @@ -124,7 +126,6 @@ cc_library_shared { "libmedia_helper", "libmedia_player2_util", "libmediaextractor", - "libmediametrics", "libmediaplayer2", "libmediaplayer2-protos", "libmediandk_utils", diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml index cbebbb32dc89..d6dc211ad8c4 100644 --- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml +++ b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml @@ -18,12 +18,11 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:paddingMode="stack"> <item> - <shape - android:tint="?android:attr/colorForeground"> + <shape> <corners android:radius="20dp"/> <solid - android:color="@android:color/transparent"/> + android:color="?android:attr/colorPrimary"/> <stroke android:color="#1f000000" android:width="1dp"/> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 842779d494cd..7dcc3acb1dae 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1138,7 +1138,7 @@ <string name="notice_header" translatable="false"></string> <!-- UI debug setting: opt in to use updated graphics driver? [CHAR LIMIT=100] --> - <string name="updated_gfx_driver_dev_opt_in_app_summary">Opt in app to use updated graphcis driver in developement</string> + <string name="gup_dev_opt_in_app_summary">Opt in app to use Game Update Package in developement</string> <!-- Name of the phone device [CHAR LIMIT=NONE] --> <string name="media_transfer_phone_device_name">Phone speaker</string> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index e3d3d81704a8..526efcb35262 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -705,8 +705,11 @@ class SettingsProtoDumpUtil { Settings.Global.GPU_DEBUG_LAYERS_GLES, GlobalSettingsProto.Gpu.DEBUG_LAYERS_GLES); dumpSetting(s, p, - Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, - GlobalSettingsProto.Gpu.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP); + Settings.Global.GUP_DEV_OPT_IN_APPS, + GlobalSettingsProto.Gpu.GUP_DEV_OPT_IN_APPS); + dumpSetting(s, p, + Settings.Global.GUP_BLACK_LIST, + GlobalSettingsProto.Gpu.GUP_BLACK_LIST); p.end(gpuToken); final long hdmiToken = p.start(GlobalSettingsProto.HDMI); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index ce529a085e77..1727e75afe43 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -4125,10 +4125,12 @@ public class SettingsProvider extends ContentProvider { Secure.CHARGING_SOUNDS_ENABLED); if (!globalChargingSoundEnabled.isNull()) { - secureSettings.insertSettingLocked( - Secure.CHARGING_SOUNDS_ENABLED, - globalChargingSoundEnabled.getValue(), null, false, - SettingsState.SYSTEM_PACKAGE_NAME); + if (secureChargingSoundsEnabled.isNull()) { + secureSettings.insertSettingLocked( + Secure.CHARGING_SOUNDS_ENABLED, + globalChargingSoundEnabled.getValue(), null, false, + SettingsState.SYSTEM_PACKAGE_NAME); + } // set global charging_sounds_enabled setting to null since it's deprecated globalSettings.insertSettingLocked( diff --git a/packages/SystemUI/res/drawable/face_dialog_error_to_face.xml b/packages/SystemUI/res/drawable/face_dialog_error_to_face.xml new file mode 100644 index 000000000000..75311f44dfe3 --- /dev/null +++ b/packages/SystemUI/res/drawable/face_dialog_error_to_face.xml @@ -0,0 +1,517 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2018 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportWidth="60" + android:viewportHeight="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G_N_1_T_0" + android:translateX="30" + android:translateY="30"> + <group + android:name="_R_G_L_0_G" + android:translateX="-30" + android:translateY="-30"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeWidth="2.5" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorError" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:pathData=" M34.78 38.76 C33.83,38.75 31.54,38.75 30.01,38.75 C26.97,38.75 26.14,38.75 24.3,38.76 " + android:strokeWidth="2.5" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorError" + android:trimPathStart="0.34" + android:trimPathEnd="0.5700000000000001" + android:trimPathOffset="0" /> + <group + android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0" + android:scaleX="0.3" + android:scaleY="0.3" + android:translateX="37.788" + android:translateY="19.53"> + <path + android:name="_R_G_L_0_G_D_2_P_0" + android:fillAlpha="0" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.1,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0" + android:scaleX="0.3" + android:scaleY="0.3" + android:translateX="22.005" + android:translateY="19.51"> + <path + android:name="_R_G_L_0_G_D_3_P_0" + android:fillAlpha="0" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.2,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0" + android:translateX="30.3" + android:translateY="29.215"> + <path + android:name="_R_G_L_0_G_D_4_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorError" + android:fillType="nonZero" + android:pathData=" M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-11.71 -1.5,-11.71 C-1.5,-11.71 0.9,-11.71 0.9,-11.71 C0.9,-11.71 0.9,3.25 0.9,3.25c " /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="?android:attr/colorError" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="83" + android:valueFrom="?android:attr/colorError" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="?android:attr/colorError" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="83" + android:valueFrom="?android:attr/colorError" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="strokeWidth" + android:startOffset="0" + android:valueFrom="2.5" + android:valueTo="2" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M34.78 38.76 C33.83,38.75 31.54,38.75 30.01,38.75 C26.97,38.75 26.14,38.75 24.3,38.76 " + android:valueTo="M33.75 42.75 C32.75,43.76 31.37,44.39 29.83,44.39 C26.8,44.39 24.34,41.93 24.34,38.9 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="trimPathStart" + android:startOffset="0" + android:valueFrom="0.34" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="0.5700000000000001" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillAlpha" + android:startOffset="83" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:pathData="M 37.788,19.53C 38.3400184636116,20.241653709411622 37.235981536388394,18.81834629058838 37.788,19.53" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:pathData="M 37.788,19.53C 38.3400184636116,20.241653709411622 40.5479815363884,23.08834629058838 41.1,23.8" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="50"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.3" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="50" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.3" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleX" + android:startOffset="50" + android:valueFrom="0.3" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleY" + android:startOffset="50" + android:valueFrom="0.3" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillAlpha" + android:startOffset="83" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:pathData="M 22.005,19.51C 21.43742198228836,20.224974105358122 22.57257801771164,18.79502589464188 22.005,19.51" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:pathData="M 22.005,19.51C 21.43742198228836,20.224974105358122 19.16757801771164,23.08502589464188 18.6,23.8" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="50"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.3" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="50" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.3" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleX" + android:startOffset="50" + android:valueFrom="0.3" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleY" + android:startOffset="50" + android:valueFrom="0.3" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="fillColor" + android:startOffset="0" + android:valueFrom="?android:attr/colorError" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillColor" + android:startOffset="83" + android:valueFrom="?android:attr/colorError" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="150" + android:pathData="M 30.3,29.215C 30.3,29.58759101867676 30.3,31.077408981323238 30.3,31.45" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-11.71 -1.5,-11.71 C-1.5,-11.71 0.9,-11.71 0.9,-11.71 C0.9,-11.71 0.9,3.25 0.9,3.25c " + android:valueTo="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-3.25 -1.5,-3.25 C-1.5,-3.25 0.9,-3.25 0.9,-3.25 C0.9,-3.25 0.9,3.25 0.9,3.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.321,0 0.67,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="133" + android:propertyName="pathData" + android:startOffset="83" + android:valueFrom="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-3.25 -1.5,-3.25 C-1.5,-3.25 0.9,-3.25 0.9,-3.25 C0.9,-3.25 0.9,3.25 0.9,3.25c " + android:valueTo="M2.6 3.25 C2.6,3.25 -2.6,3.25 -2.6,3.25 C-2.6,3.25 -2.6,1.25 -2.6,1.25 C-2.6,1.25 0.6,1.25 0.6,1.25 C0.6,1.25 0.6,-3.25 0.6,-3.25 C0.6,-3.25 2.6,-3.25 2.6,-3.25 C2.6,-3.25 2.6,3.25 2.6,3.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.568,0 0.456,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="233" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/face_dialog_face_blue_to_checkmark.xml b/packages/SystemUI/res/drawable/face_dialog_face_blue_to_checkmark.xml new file mode 100644 index 000000000000..e4ace67577c3 --- /dev/null +++ b/packages/SystemUI/res/drawable/face_dialog_face_blue_to_checkmark.xml @@ -0,0 +1,637 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2018 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportWidth="60" + android:viewportHeight="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G_N_2_T_0" + android:translateX="30" + android:translateY="30"> + <group + android:name="_R_G_L_0_G" + android:translateX="-30" + android:translateY="-30"> + <group + android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" + android:scaleX="0.08" + android:scaleY="0.08" + android:translateX="30.1" + android:translateY="30.083"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:fillAlpha="0" + android:fillColor="?android:attr/colorAccent" + android:fillType="nonZero" + android:pathData=" M-116 -16.5 C-116,-16.5 -31.25,68.5 -31.25,68.5 C-31.25,68.5 108.75,-71.5 108.75,-71.5 " + android:trimPathStart="0" + android:trimPathEnd="0" + android:trimPathOffset="0" /> + </group> + <group + android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0" + android:scaleX="0.08" + android:scaleY="0.08" + android:translateX="30.1" + android:translateY="30.083"> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:pathData=" M-116 -16.5 C-116,-16.5 -31.25,68.5 -31.25,68.5 C-31.25,68.5 108.75,-71.5 108.75,-71.5 " + android:strokeWidth="20" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:trimPathStart="0" + android:trimPathEnd="0" + android:trimPathOffset="0" /> + </group> + <path + android:name="_R_G_L_0_G_D_2_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeWidth="2.5" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + <group + android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0" + android:pivotX="1.05" + android:pivotY="-9.891" + android:scaleX="1" + android:scaleY="1" + android:translateX="29.044" + android:translateY="41.647"> + <path + android:name="_R_G_L_0_G_D_3_P_0" + android:pathData=" M4.71 1.1 C3.71,2.12 2.32,2.75 0.79,2.75 C-2.25,2.75 -4.7,0.29 -4.7,-2.75 " + android:strokeWidth="2" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + </group> + <group + android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="41.1" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_4_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorAccent" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.1,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_5_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="18.6" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_5_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorAccent" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.2,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_6_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="30.727" + android:translateY="31.703"> + <path + android:name="_R_G_L_0_G_D_6_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorAccent" + android:fillType="nonZero" + android:pathData=" M2.6 3.25 C2.6,3.25 -2.6,3.25 -2.6,3.25 C-2.6,3.25 -2.6,1.25 -2.6,1.25 C-2.6,1.25 0.6,1.25 0.6,1.25 C0.6,1.25 0.6,-3.25 0.6,-3.25 C0.6,-3.25 2.6,-3.25 2.6,-3.25 C2.6,-3.25 2.6,3.25 2.6,3.25c " /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="33" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleX" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleY" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="trimPathEnd" + android:startOffset="33" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="33" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleX" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleY" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="trimPathEnd" + android:startOffset="33" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="?android:attr/colorAccent" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="67" + android:valueFrom="?android:attr/colorAccent" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="strokeAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.65" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.65" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="trimPathStart" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0.5" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.5" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_5_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_5_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_6_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_6_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.287,0.12 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.287,0.12 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="383" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/face_dialog_face_gray_to_checkmark.xml b/packages/SystemUI/res/drawable/face_dialog_face_gray_to_checkmark.xml new file mode 100644 index 000000000000..b09f69b742bb --- /dev/null +++ b/packages/SystemUI/res/drawable/face_dialog_face_gray_to_checkmark.xml @@ -0,0 +1,637 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2018 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportWidth="60" + android:viewportHeight="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G_N_2_T_0" + android:translateX="30" + android:translateY="30"> + <group + android:name="_R_G_L_0_G" + android:translateX="-30" + android:translateY="-30"> + <group + android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" + android:scaleX="0.08" + android:scaleY="0.08" + android:translateX="30.1" + android:translateY="30.083"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:fillAlpha="0" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-116 -16.5 C-116,-16.5 -31.25,68.5 -31.25,68.5 C-31.25,68.5 108.75,-71.5 108.75,-71.5 " + android:trimPathStart="0" + android:trimPathEnd="0" + android:trimPathOffset="0" /> + </group> + <group + android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0" + android:scaleX="0.08" + android:scaleY="0.08" + android:translateX="30.1" + android:translateY="30.083"> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:pathData=" M-116 -16.5 C-116,-16.5 -31.25,68.5 -31.25,68.5 C-31.25,68.5 108.75,-71.5 108.75,-71.5 " + android:strokeWidth="20" + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:trimPathStart="0" + android:trimPathEnd="0" + android:trimPathOffset="0" /> + </group> + <path + android:name="_R_G_L_0_G_D_2_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeWidth="2.5" + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + <group + android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0" + android:pivotX="1.05" + android:pivotY="-9.891" + android:scaleX="1" + android:scaleY="1" + android:translateX="29.044" + android:translateY="41.647"> + <path + android:name="_R_G_L_0_G_D_3_P_0" + android:pathData=" M4.71 1.1 C3.71,2.12 2.32,2.75 0.79,2.75 C-2.25,2.75 -4.7,0.29 -4.7,-2.75 " + android:strokeWidth="2" + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + </group> + <group + android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="41.1" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_4_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.1,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_5_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="18.6" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_5_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.2,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_6_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="30.727" + android:translateY="31.703"> + <path + android:name="_R_G_L_0_G_D_6_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M2.6 3.25 C2.6,3.25 -2.6,3.25 -2.6,3.25 C-2.6,3.25 -2.6,1.25 -2.6,1.25 C-2.6,1.25 0.6,1.25 0.6,1.25 C0.6,1.25 0.6,-3.25 0.6,-3.25 C0.6,-3.25 2.6,-3.25 2.6,-3.25 C2.6,-3.25 2.6,3.25 2.6,3.25c " /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="33" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleX" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleY" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="trimPathEnd" + android:startOffset="33" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="33" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="0.08" + android:valueTo="0.08" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleX" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="scaleY" + android:startOffset="33" + android:valueFrom="0.08" + android:valueTo="0.12789" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.537,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="200" + android:valueFrom="0.12789" + android:valueTo="0.12241" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.441,0 0.533,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="300" + android:valueFrom="0.12241" + android:valueTo="0.125" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.424,0 0.486,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="trimPathEnd" + android:startOffset="33" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.292,0 0.155,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="67" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="strokeAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.65" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.65" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="trimPathStart" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0.5" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.5" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_5_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_5_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_6_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_6_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.287,0.12 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.287,0.12 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="383" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/face_dialog_face_gray_to_face_blue.xml b/packages/SystemUI/res/drawable/face_dialog_face_gray_to_face_blue.xml new file mode 100644 index 000000000000..9259dc7bb977 --- /dev/null +++ b/packages/SystemUI/res/drawable/face_dialog_face_gray_to_face_blue.xml @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportHeight="60" + android:viewportWidth="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G_N_1_T_0" + android:translateX="30" + android:translateY="30"> + <group + android:name="_R_G_L_0_G" + android:translateX="-30" + android:translateY="-30"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:pathData=" M33.75 42.75 C32.75,43.76 31.37,44.39 29.83,44.39 C26.8,44.39 24.34,41.93 24.34,38.9 " + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_0_G_D_2_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M39 23.8 C39,25 39.9,25.9 41.1,25.9 C42.2,25.9 43.2,25 43.2,23.8 C43.2,22.6 42.3,21.7 41.1,21.7 C39.9,21.7 39,22.6 39,23.8c " /> + <path + android:name="_R_G_L_0_G_D_3_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M16.5 23.8 C16.5,25 17.4,25.9 18.6,25.9 C19.8,25.9 20.7,25 20.7,23.8 C20.7,22.6 19.8,21.7 18.6,21.7 C17.4,21.7 16.5,22.6 16.5,23.8c " /> + <path + android:name="_R_G_L_0_G_D_4_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M32.9 34.7 C32.9,34.7 27.7,34.7 27.7,34.7 C27.7,34.7 27.7,32.7 27.7,32.7 C27.7,32.7 30.9,32.7 30.9,32.7 C30.9,32.7 30.9,28.2 30.9,28.2 C30.9,28.2 32.9,28.2 32.9,28.2 C32.9,28.2 32.9,34.7 32.9,34.7c " /> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="fillColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="fillColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="33" + android:propertyName="fillColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorAccent" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/face_dialog_face_to_error.xml b/packages/SystemUI/res/drawable/face_dialog_face_to_error.xml new file mode 100644 index 000000000000..a96d21addb2b --- /dev/null +++ b/packages/SystemUI/res/drawable/face_dialog_face_to_error.xml @@ -0,0 +1,473 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2018 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportWidth="60" + android:viewportHeight="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G_N_1_T_0" + android:translateX="30" + android:translateY="30"> + <group + android:name="_R_G_L_0_G" + android:translateX="-30" + android:translateY="-30"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeWidth="2.5" + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:pathData=" M33.75 42.75 C32.75,43.76 31.37,44.39 29.83,44.39 C26.8,44.39 24.34,41.93 24.34,38.9 " + android:strokeWidth="2" + android:strokeAlpha="1" + android:strokeColor="@color/biometric_face_icon_gray" + android:trimPathStart="0" + android:trimPathEnd="1" + android:trimPathOffset="0" /> + <group + android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="41.1" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_2_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.1,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="18.6" + android:translateY="23.8"> + <path + android:name="_R_G_L_0_G_D_3_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M-2.1 0 C-2.1,1.2 -1.2,2.1 0,2.1 C1.2,2.1 2.1,1.2 2.1,0 C2.1,-1.2 1.2,-2.1 0,-2.1 C-1.2,-2.1 -2.1,-1.2 -2.1,0c " /> + </group> + <group + android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0" + android:translateX="30.3" + android:translateY="31.45"> + <path + android:name="_R_G_L_0_G_D_4_P_0" + android:fillAlpha="1" + android:fillColor="@color/biometric_face_icon_gray" + android:fillType="nonZero" + android:pathData=" M2.6 3.25 C2.6,3.25 -2.6,3.25 -2.6,3.25 C-2.6,3.25 -2.6,1.25 -2.6,1.25 C-2.6,1.25 0.6,1.25 0.6,1.25 C0.6,1.25 0.6,-3.25 0.6,-3.25 C0.6,-3.25 2.6,-3.25 2.6,-3.25 C2.6,-3.25 2.6,3.25 2.6,3.25c " /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + <target android:name="_R_G_L_0_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="50" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="strokeColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="strokeColor" + android:startOffset="50" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="strokeWidth" + android:startOffset="0" + android:valueFrom="2" + android:valueTo="2.5" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M33.75 42.75 C32.75,43.76 31.37,44.39 29.83,44.39 C26.8,44.39 24.34,41.93 24.34,38.9 " + android:valueTo="M34.78 38.76 C33.83,38.75 31.54,38.75 30.01,38.75 C26.97,38.75 26.14,38.75 24.3,38.76 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="trimPathStart" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="0.34" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_1_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="217" + android:propertyName="trimPathEnd" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.5700000000000001" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillAlpha" + android:startOffset="50" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:pathData="M 41.1,23.8C 40.547981774806985,23.08834635019302 38.34001822519301,20.24165364980698 37.788,19.53" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_2_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.999,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.999,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillAlpha" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="1" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillAlpha" + android:startOffset="50" + android:valueFrom="1" + android:valueTo="0" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:pathData="M 18.6,23.8C 19.16757813692093,23.08502601385117 21.43742186307907,20.224973986148832 22.005,19.51" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_3_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="scaleX" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.999,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="0.3" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.999,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="50" + android:propertyName="fillColor" + android:startOffset="0" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="@color/biometric_face_icon_gray" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="17" + android:propertyName="fillColor" + android:startOffset="50" + android:valueFrom="@color/biometric_face_icon_gray" + android:valueTo="?android:attr/colorError" + android:valueType="colorType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0_G_0_T_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:pathData="M 30.3,31.45C 30.3,31.07740886211395 30.3,31.82259113788605 30.3,31.45" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="150" + android:pathData="M 30.3,31.45C 30.3,31.07740886211395 30.3,29.58759113788605 30.3,29.215" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="67"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_D_4_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="67" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M2.6 3.25 C2.6,3.25 -2.6,3.25 -2.6,3.25 C-2.6,3.25 -2.6,1.25 -2.6,1.25 C-2.6,1.25 0.6,1.25 0.6,1.25 C0.6,1.25 0.6,-3.25 0.6,-3.25 C0.6,-3.25 2.6,-3.25 2.6,-3.25 C2.6,-3.25 2.6,3.25 2.6,3.25c " + android:valueTo="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-3.25 -1.5,-3.25 C-1.5,-3.25 0.9,-3.25 0.9,-3.25 C0.9,-3.25 0.9,3.25 0.9,3.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="150" + android:propertyName="pathData" + android:startOffset="67" + android:valueFrom="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-3.25 -1.5,-3.25 C-1.5,-3.25 0.9,-3.25 0.9,-3.25 C0.9,-3.25 0.9,3.25 0.9,3.25c " + android:valueTo="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-13.15 -1.5,-13.15 C-1.5,-13.15 0.9,-13.15 0.9,-13.15 C0.9,-13.15 0.9,3.25 0.9,3.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="pathData" + android:startOffset="217" + android:valueFrom="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-13.15 -1.5,-13.15 C-1.5,-13.15 0.9,-13.15 0.9,-13.15 C0.9,-13.15 0.9,3.25 0.9,3.25c " + android:valueTo="M0.9 3.25 C0.9,3.25 -1.5,3.25 -1.5,3.25 C-1.5,3.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,1.25 -1.5,1.25 C-1.5,1.25 -1.5,-11.71 -1.5,-11.71 C-1.5,-11.71 0.9,-11.71 0.9,-11.71 C0.9,-11.71 0.9,3.25 0.9,3.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="333" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/face_dialog_icon.xml b/packages/SystemUI/res/drawable/face_dialog_icon.xml deleted file mode 100644 index 6d28b5a105f2..000000000000 --- a/packages/SystemUI/res/drawable/face_dialog_icon.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2018 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> - -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:width="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path android:fillColor="#000" android:pathData="M9,11.75A1.25,1.25 0 0,0 7.75,13A1.25,1.25 0 0,0 9,14.25A1.25,1.25 0 0,0 10.25,13A1.25,1.25 0 0,0 9,11.75M15,11.75A1.25,1.25 0 0,0 13.75,13A1.25,1.25 0 0,0 15,14.25A1.25,1.25 0 0,0 16.25,13A1.25,1.25 0 0,0 15,11.75M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,11.71 4,11.42 4.05,11.14C6.41,10.09 8.28,8.16 9.26,5.77C11.07,8.33 14.05,10 17.42,10C18.2,10 18.95,9.91 19.67,9.74C19.88,10.45 20,11.21 20,12C20,16.41 16.41,20 12,20Z" /> -</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml index af25e44bd746..8f411f4c07fe 100644 --- a/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml +++ b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml @@ -18,133 +18,138 @@ xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> <vector - android:width="24dp" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24"> + android:width="60dp" + android:height="60dp" + android:viewportHeight="60" + android:viewportWidth="60"> <group android:name="_R_G"> <group - android:name="_R_G_L_2_G" - android:pivotX="-33" - android:pivotY="-34" - android:rotation="180" - android:scaleX="0.738" - android:scaleY="0.738" - android:translateX="45" - android:translateY="46.4"> - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_2_G_D_1_P_0" - android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_2_G_D_2_P_0" - android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="1" /> - <path - android:name="_R_G_L_2_G_D_3_P_0" - android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="1" /> - <path - android:name="_R_G_L_2_G_D_4_P_0" - android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - </group> - <group - android:name="_R_G_L_1_G" - android:rotation="10" - android:translateX="12" - android:translateY="12"> - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - </group> - <group - android:name="_R_G_L_0_G" - android:translateX="12" - android:translateY="12"> + android:name="_R_G_L_1_G_N_4_T_0" + android:translateX="30" + android:translateY="30"> <group - android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" - android:pivotY="-0.012" - android:rotation="0" - android:scaleX="1" - android:scaleY="1"> + android:name="_R_G_L_1_G" + android:pivotX="114" + android:pivotY="114" + android:scaleX="0.42200000000000004" + android:scaleY="0.42200000000000004" + android:translateX="-114" + android:translateY="-114"> + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:pathData=" M79.63 67.24 C79.63,67.24 111.5,47.42 147.83,67.24 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="0" + android:trimPathOffset="0" + android:trimPathStart="0" /> <path - android:name="_R_G_L_0_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?android:attr/colorError" - android:fillType="nonZero" - android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " /> + android:name="_R_G_L_1_G_D_1_P_0" + android:pathData=" M64.27 98.07 C64.27,98.07 80.13,73.02 113.98,73.02 C147.83,73.02 163.56,97.26 163.56,97.26 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="0" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_2_P_0" + android:pathData=" M72.53 151.07 C72.53,151.07 62.46,122.89 76.16,105.55 C89.86,88.21 106.72,86.73 113.98,86.73 C121.08,86.73 153.51,90.62 158.7,125.87 C159.14,128.82 158.8,132.88 157.18,136.09 C154.88,140.63 150.62,143.63 145.85,143.97 C133.78,144.85 129.76,137.92 129.26,128.49 C128.88,121.19 122.49,115.35 113.15,115.35 C102.91,115.35 95.97,126.69 99.77,139.74 C103.57,152.78 111.33,163.85 130.32,169.13 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="0" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_3_P_0" + android:pathData=" M100.6 167.84 C100.6,167.84 82.76,152.1 83.75,130.31 C84.75,108.53 102.58,100.7 113.73,100.7 C124.87,100.7 144.19,108.56 144.19,130.01 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="0" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_4_P_0" + android:pathData=" M113.73 129.17 C113.73,129.17 113.15,161.33 149.15,156.58 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="0" + android:trimPathOffset="0" + android:trimPathStart="0" /> </group> + </group> + <group + android:name="_R_G_L_0_G_N_4_T_0" + android:translateX="30" + android:translateY="30"> <group - android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0" - android:pivotY="-0.012" - android:rotation="0" - android:scaleX="1" - android:scaleY="1"> + android:name="_R_G_L_0_G" + android:translateX="-30.05" + android:translateY="-30"> + <group + android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" + android:scaleX="1" + android:scaleY="1" + android:translateX="30" + android:translateY="38.75"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorError" + android:fillType="nonZero" + android:pathData=" M-1.2 -1.25 C-1.2,-1.25 1.2,-1.25 1.2,-1.25 C1.2,-1.25 1.2,1.25 1.2,1.25 C1.2,1.25 -1.2,1.25 -1.2,1.25 C-1.2,1.25 -1.2,-1.25 -1.2,-1.25c " /> + </group> + <group + android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0" + android:pivotX="0.002" + android:pivotY="7.488" + android:scaleX="1" + android:scaleY="1" + android:translateX="30" + android:translateY="25"> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorError" + android:fillType="nonZero" + android:pathData=" M-1.2 -7.5 C-1.2,-7.5 1.2,-7.5 1.2,-7.5 C1.2,-7.5 1.2,7.5 1.2,7.5 C1.2,7.5 -1.2,7.5 -1.2,7.5 C-1.2,7.5 -1.2,-7.5 -1.2,-7.5c " /> + </group> <path - android:name="_R_G_L_0_G_D_0_P_1" - android:fillAlpha="1" - android:fillColor="?android:attr/colorError" - android:fillType="nonZero" - android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " /> + android:name="_R_G_L_0_G_D_2_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorError" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> </group> </group> </group> <group android:name="time_group" /> </vector> </aapt:attr> - <target android:name="_R_G_L_2_G_D_0_P_0"> + <target android:name="_R_G_L_1_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="350" + android:duration="83" android:propertyName="trimPathEnd" android:startOffset="0" android:valueFrom="0" @@ -155,9 +160,9 @@ </aapt:attr> </objectAnimator> <objectAnimator - android:duration="350" + android:duration="250" android:propertyName="trimPathEnd" - android:startOffset="350" + android:startOffset="83" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> @@ -168,11 +173,11 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_1_P_0"> + <target android:name="_R_G_L_1_G_D_1_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="267" + android:duration="83" android:propertyName="trimPathEnd" android:startOffset="0" android:valueFrom="0" @@ -183,9 +188,9 @@ </aapt:attr> </objectAnimator> <objectAnimator - android:duration="433" + android:duration="250" android:propertyName="trimPathEnd" - android:startOffset="267" + android:startOffset="83" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> @@ -196,67 +201,39 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_2_P_0"> + <target android:name="_R_G_L_1_G_D_2_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="250" - android:propertyName="trimPathStart" + android:duration="83" + android:propertyName="trimPathEnd" android:startOffset="0" - android:valueFrom="1" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="250" - android:propertyName="trimPathStart" - android:startOffset="250" - android:valueFrom="1" + android:valueFrom="0" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_3_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="350" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="1" + android:duration="250" + android:propertyName="trimPathEnd" + android:startOffset="83" + android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="trimPathStart" - android:startOffset="350" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_4_P_0"> + <target android:name="_R_G_L_1_G_D_3_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="417" + android:duration="83" android:propertyName="trimPathEnd" android:startOffset="0" android:valueFrom="0" @@ -267,9 +244,9 @@ </aapt:attr> </objectAnimator> <objectAnimator - android:duration="117" + android:duration="250" android:propertyName="trimPathEnd" - android:startOffset="417" + android:startOffset="83" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> @@ -280,43 +257,26 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G"> + <target android:name="_R_G_L_1_G_D_4_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="200" - android:propertyName="rotation" + android:duration="83" + android:propertyName="trimPathEnd" android:startOffset="0" - android:valueFrom="180" - android:valueTo="180" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="500" - android:propertyName="rotation" - android:startOffset="200" - android:valueFrom="180" + android:valueFrom="0" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_D_0_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="383" + android:duration="250" android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="0" + android:startOffset="83" + android:valueFrom="0" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> @@ -325,185 +285,129 @@ </set> </aapt:attr> </target> - <target android:name="_R_G_L_1_G"> + <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="33" - android:propertyName="rotation" + android:duration="67" + android:propertyName="scaleX" android:startOffset="0" - android:valueFrom="10" - android:valueTo="10" + android:valueFrom="1" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.853,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="367" - android:propertyName="rotation" - android:startOffset="33" - android:valueFrom="10" - android:valueTo="-180" + android:duration="67" + android:propertyName="scaleY" + android:startOffset="0" + android:valueFrom="1" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.853,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="17" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="0" + android:duration="100" + android:propertyName="scaleX" + android:startOffset="67" + android:valueFrom="1.1" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.92,1.06 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="417" - android:propertyName="rotation" - android:startOffset="17" - android:valueFrom="0" - android:valueTo="-180" + android:duration="100" + android:propertyName="scaleY" + android:startOffset="67" + android:valueFrom="1.1" + android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.92,1.06 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> + <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="117" + android:duration="67" android:propertyName="scaleX" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.659,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="117" + android:duration="67" android:propertyName="scaleY" android:startOffset="0" android:valueFrom="1" - android:valueTo="1" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="317" + android:duration="100" android:propertyName="scaleX" - android:startOffset="117" + android:startOffset="67" android:valueFrom="1" - android:valueTo="0" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="317" + android:duration="100" android:propertyName="scaleY" - android:startOffset="117" - android:valueFrom="1" + android:startOffset="67" + android:valueFrom="1.1" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.92,1.096 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"> + <target android:name="_R_G_L_0_G_D_2_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="17" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="417" - android:propertyName="rotation" - android:startOffset="17" - android:valueFrom="0" - android:valueTo="-180" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="117" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="scaleY" + android:duration="67" + android:propertyName="trimPathEnd" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="317" - android:propertyName="scaleX" - android:startOffset="117" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="317" - android:propertyName="scaleY" - android:startOffset="117" + android:duration="133" + android:propertyName="trimPathEnd" + android:startOffset="67" android:valueFrom="1" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> @@ -513,7 +417,7 @@ <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="717" + android:duration="350" android:propertyName="translateX" android:startOffset="0" android:valueFrom="0" @@ -522,4 +426,4 @@ </set> </aapt:attr> </target> -</animated-vector> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml index 1a7a846b140e..89b822840b14 100644 --- a/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml +++ b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml @@ -18,821 +18,374 @@ xmlns:aapt="http://schemas.android.com/aapt"> <aapt:attr name="android:drawable"> <vector - android:width="24dp" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24"> + android:width="60dp" + android:height="60dp" + android:viewportHeight="60" + android:viewportWidth="60"> <group android:name="_R_G"> <group - android:name="_R_G_L_3_G" - android:pivotX="-33" - android:pivotY="-34" - android:rotation="0" - android:scaleX="0.738" - android:scaleY="0.738" - android:translateX="45" - android:translateY="46.4"> - <path - android:name="_R_G_L_3_G_D_0_P_0" - android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_3_G_D_1_P_0" - android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_3_G_D_2_P_0" - android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_3_G_D_3_P_0" - android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_3_G_D_4_P_0" - android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorAccent" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="0" /> - </group> - <group - android:name="_R_G_L_2_G" - android:pivotX="-33" - android:pivotY="-34" - android:rotation="0" - android:scaleX="0.738" - android:scaleY="0.738" - android:translateX="45" - android:translateY="46.4"> - <path - android:name="_R_G_L_2_G_D_0_P_0" - android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_2_G_D_1_P_0" - android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_2_G_D_2_P_0" - android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - <path - android:name="_R_G_L_2_G_D_3_P_0" - android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="1" /> - <path - android:name="_R_G_L_2_G_D_4_P_0" - android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="1.45" - android:trimPathEnd="0" - android:trimPathOffset="0" - android:trimPathStart="0" /> - </group> - <group - android:name="_R_G_L_1_G" - android:rotation="190" - android:translateX="12" - android:translateY="12"> - <path - android:name="_R_G_L_1_G_D_0_P_0" - android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c " - android:strokeAlpha="1" - android:strokeColor="?android:attr/colorError" - android:strokeLineCap="round" - android:strokeLineJoin="round" - android:strokeWidth="2" - android:trimPathEnd="1" - android:trimPathOffset="0" - android:trimPathStart="1" /> - </group> - <group - android:name="_R_G_L_0_G" - android:translateX="12" - android:translateY="12"> + android:name="_R_G_L_1_G_N_4_T_0" + android:translateX="30" + android:translateY="30"> <group - android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" - android:pivotY="-0.012" - android:rotation="184" - android:scaleX="0" - android:scaleY="0"> + android:name="_R_G_L_1_G" + android:pivotX="114" + android:pivotY="114" + android:scaleX="0.42244" + android:scaleY="0.42244" + android:translateX="-114" + android:translateY="-114"> <path - android:name="_R_G_L_0_G_D_0_P_0" - android:fillAlpha="1" - android:fillColor="?android:attr/colorError" - android:fillType="nonZero" - android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " /> + android:name="_R_G_L_1_G_D_0_P_0" + android:pathData=" M79.63 67.24 C79.63,67.24 111.5,47.42 147.83,67.24 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_1_P_0" + android:pathData=" M64.27 98.07 C64.27,98.07 80.13,73.02 113.98,73.02 C147.83,73.02 163.56,97.26 163.56,97.26 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_2_P_0" + android:pathData=" M72.53 151.07 C72.53,151.07 62.46,122.89 76.16,105.55 C89.86,88.21 106.72,86.73 113.98,86.73 C121.08,86.73 153.51,90.62 158.7,125.87 C159.14,128.82 158.8,132.88 157.18,136.09 C154.88,140.63 150.62,143.63 145.85,143.97 C133.78,144.85 129.76,137.92 129.26,128.49 C128.88,121.19 122.49,115.35 113.15,115.35 C102.91,115.35 95.97,126.69 99.77,139.74 C103.57,152.78 111.33,163.85 130.32,169.13 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_3_P_0" + android:pathData=" M100.6 167.84 C100.6,167.84 82.76,152.1 83.75,130.31 C84.75,108.53 102.58,100.7 113.73,100.7 C124.87,100.7 144.19,108.56 144.19,130.01 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> + <path + android:name="_R_G_L_1_G_D_4_P_0" + android:pathData=" M113.73 129.17 C113.73,129.17 113.15,161.33 149.15,156.58 " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorAccent" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="5.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="0" /> </group> + </group> + <group + android:name="_R_G_L_0_G_N_4_T_0" + android:translateX="30" + android:translateY="30"> <group - android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0" - android:pivotY="-0.012" - android:rotation="184" - android:scaleX="0" - android:scaleY="0"> + android:name="_R_G_L_0_G" + android:translateX="-30.05" + android:translateY="-30"> + <group + android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" + android:scaleX="0" + android:scaleY="0" + android:translateX="30" + android:translateY="38.75"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorError" + android:fillType="nonZero" + android:pathData=" M-1.2 -1.25 C-1.2,-1.25 1.2,-1.25 1.2,-1.25 C1.2,-1.25 1.2,1.25 1.2,1.25 C1.2,1.25 -1.2,1.25 -1.2,1.25 C-1.2,1.25 -1.2,-1.25 -1.2,-1.25c " /> + </group> + <group + android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0" + android:pivotX="0.002" + android:pivotY="7.488" + android:scaleX="1" + android:scaleY="0" + android:translateX="30" + android:translateY="25"> + <path + android:name="_R_G_L_0_G_D_1_P_0" + android:fillAlpha="1" + android:fillColor="?android:attr/colorError" + android:fillType="nonZero" + android:pathData=" M-1.2 -7.5 C-1.2,-7.5 1.2,-7.5 1.2,-7.5 C1.2,-7.5 1.2,7.5 1.2,7.5 C1.2,7.5 -1.2,7.5 -1.2,7.5 C-1.2,7.5 -1.2,-7.5 -1.2,-7.5c " /> + </group> <path - android:name="_R_G_L_0_G_D_0_P_1" - android:fillAlpha="1" - android:fillColor="?android:attr/colorError" - android:fillType="nonZero" - android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " /> + android:name="_R_G_L_0_G_D_2_P_0" + android:pathData=" M30 6.2 C16.9,6.2 6.3,16.8 6.3,30 C6.3,43.2 16.9,53.8 30,53.8 C43.1,53.8 53.8,43.2 53.8,30 C53.8,16.8 43.1,6.2 30,6.2c " + android:strokeAlpha="1" + android:strokeColor="?android:attr/colorError" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2.5" + android:trimPathEnd="1" + android:trimPathOffset="0" + android:trimPathStart="1" /> </group> </group> </group> <group android:name="time_group" /> </vector> </aapt:attr> - <target android:name="_R_G_L_3_G_D_0_P_0"> + <target android:name="_R_G_L_1_G_D_0_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="150" + android:duration="167" android:propertyName="trimPathStart" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_3_G_D_1_P_0"> + <target android:name="_R_G_L_1_G_D_1_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="33" + android:duration="167" android:propertyName="trimPathStart" android:startOffset="0" android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="150" - android:propertyName="trimPathStart" - android:startOffset="33" - android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_3_G_D_2_P_0"> + <target android:name="_R_G_L_1_G_D_2_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="17" + android:duration="167" android:propertyName="trimPathStart" android:startOffset="0" android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="217" - android:propertyName="trimPathStart" - android:startOffset="17" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_3_G_D_3_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="17" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="133" - android:propertyName="trimPathEnd" - android:startOffset="17" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_3_G_D_4_P_0"> + <target android:name="_R_G_L_1_G_D_3_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="17" + android:duration="167" android:propertyName="trimPathStart" android:startOffset="0" android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="67" - android:propertyName="trimPathStart" - android:startOffset="17" - android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_3_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="100" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="567" - android:propertyName="rotation" - android:startOffset="100" - android:valueFrom="0" - android:valueTo="-305" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_0_P_0"> + <target android:name="_R_G_L_1_G_D_4_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="150" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator android:duration="167" android:propertyName="trimPathStart" - android:startOffset="150" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_0_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="167" - android:propertyName="trimPathEnd" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_1_P_0"> + <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="133" - android:propertyName="trimPathStart" + android:duration="167" + android:propertyName="scaleX" android:startOffset="0" android:valueFrom="0" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="200" - android:propertyName="trimPathStart" - android:startOffset="133" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.06 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_1_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="17" - android:propertyName="trimPathEnd" + android:duration="167" + android:propertyName="scaleY" android:startOffset="0" android:valueFrom="0" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.06 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="217" - android:propertyName="trimPathEnd" - android:startOffset="17" + android:duration="100" + android:propertyName="scaleX" + android:startOffset="167" android:valueFrom="0" - android:valueTo="1" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.06 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_2_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="133" - android:propertyName="trimPathStart" - android:startOffset="0" + android:duration="100" + android:propertyName="scaleY" + android:startOffset="167" android:valueFrom="0" - android:valueTo="0" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.06 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="200" - android:propertyName="trimPathStart" - android:startOffset="133" - android:valueFrom="0" + android:duration="67" + android:propertyName="scaleX" + android:startOffset="267" + android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.147,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_2_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="250" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0" + android:duration="67" + android:propertyName="scaleY" + android:startOffset="267" + android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0 0.833,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.147,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_2_G_D_3_P_0"> + <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator android:duration="167" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_3_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="117" - android:propertyName="trimPathEnd" + android:propertyName="scaleX" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="117" - android:propertyName="trimPathEnd" - android:startOffset="117" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_4_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="100" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="100" - android:propertyName="trimPathStart" - android:startOffset="100" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G_D_4_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="133" - android:propertyName="trimPathEnd" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_2_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="100" - android:propertyName="rotation" + android:duration="167" + android:propertyName="scaleY" android:startOffset="0" android:valueFrom="0" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="567" - android:propertyName="rotation" - android:startOffset="100" - android:valueFrom="0" - android:valueTo="-305" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_D_0_P_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="167" - android:propertyName="trimPathStart" - android:startOffset="0" - android:valueFrom="1" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.096 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="533" - android:propertyName="trimPathStart" + android:duration="100" + android:propertyName="scaleX" android:startOffset="167" android:valueFrom="1" - android:valueTo="0" + android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> <objectAnimator - android:duration="150" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="190" - android:valueTo="190" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="550" - android:propertyName="rotation" - android:startOffset="150" - android:valueFrom="190" - android:valueTo="-6" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="283" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="184" - android:valueTo="184" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="317" - android:propertyName="rotation" - android:startOffset="283" - android:valueFrom="184" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="283" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="283" + android:duration="100" android:propertyName="scaleY" - android:startOffset="0" + android:startOffset="167" android:valueFrom="0" - android:valueTo="0" + android:valueTo="1.1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.08,0.096 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="317" + android:duration="67" android:propertyName="scaleX" - android:startOffset="283" - android:valueFrom="0" + android:startOffset="267" + android:valueFrom="1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.341,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> <objectAnimator - android:duration="317" + android:duration="67" android:propertyName="scaleY" - android:startOffset="283" - android:valueFrom="0" + android:startOffset="267" + android:valueFrom="1.1" android:valueTo="1" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator - android:duration="283" - android:propertyName="rotation" - android:startOffset="0" - android:valueFrom="184" - android:valueTo="184" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="317" - android:propertyName="rotation" - android:startOffset="283" - android:valueFrom="184" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> </aapt:attr> </target> - <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"> + <target android:name="_R_G_L_0_G_D_2_P_0"> <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="283" - android:propertyName="scaleX" - android:startOffset="0" - android:valueFrom="0" - android:valueTo="0" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="283" - android:propertyName="scaleY" + android:duration="267" + android:propertyName="trimPathStart" android:startOffset="0" - android:valueFrom="0" + android:valueFrom="1" android:valueTo="0" android:valueType="floatType"> <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="317" - android:propertyName="scaleX" - android:startOffset="283" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> - </aapt:attr> - </objectAnimator> - <objectAnimator - android:duration="317" - android:propertyName="scaleY" - android:startOffset="283" - android:valueFrom="0" - android:valueTo="1" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" /> + <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0" /> </aapt:attr> </objectAnimator> </set> @@ -842,7 +395,7 @@ <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="717" + android:duration="350" android:propertyName="translateX" android:startOffset="0" android:valueFrom="0" @@ -851,4 +404,4 @@ </set> </aapt:attr> </target> -</animated-vector> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index b3567f892c44..d5f29badd893 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -130,6 +130,7 @@ <!-- Biometric dialog colors --> <color name="biometric_dialog_dim_color">#80000000</color> <!-- 50% black --> + <color name="biometric_face_icon_gray">#ffbdc1c6</color> <!-- Logout button --> <color name="logout_button_bg_color">#ccffffff</color> diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 6e5042940175..2605a11f987f 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -511,6 +511,9 @@ public class Dependency extends SystemUI { public static void initDependencies(Context context) { if (sDependency != null) return; Dependency d = new Dependency(); + SystemUIFactory.getInstance().getRootComponent() + .createDependency() + .createSystemUI(d); d.mContext = context; d.mComponents = new HashMap<>(); d.start(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java index ba89fe662a65..3167b9e0a458 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java @@ -240,7 +240,10 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba mConfirmShowing = true; mCurrentDialog.showConfirmationButton(true /* show */); } else { - handleHideDialog(false /* userCanceled */); + mCurrentDialog.updateState(BiometricDialogView.STATE_AUTHENTICATED); + mHandler.postDelayed(() -> { + handleHideDialog(false /* userCanceled */); + }, mCurrentDialog.getDelayAfterAuthenticatedDurationMs()); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index e085f2368214..9934bfd11f12 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.PixelFormat; import android.graphics.PorterDuff; +import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricPrompt; import android.os.Binder; @@ -63,7 +64,8 @@ public abstract class BiometricDialogView extends LinearLayout { protected static final int STATE_NONE = 0; protected static final int STATE_AUTHENTICATING = 1; protected static final int STATE_ERROR = 2; - protected static final int STATE_AUTHENTICATED = 3; + protected static final int STATE_PENDING_CONFIRMATION = 3; + protected static final int STATE_AUTHENTICATED = 4; private final IBinder mWindowToken = new Binder(); private final Interpolator mLinearOutSlowIn; @@ -77,6 +79,8 @@ public abstract class BiometricDialogView extends LinearLayout { private final DialogViewCallback mCallback; private ViewGroup mLayout; + private final Button mPositiveButton; + private final Button mNegativeButton; private final TextView mErrorText; private Bundle mBundle; private final LinearLayout mDialog; @@ -90,10 +94,12 @@ public abstract class BiometricDialogView extends LinearLayout { private boolean mPendingShowTryAgain; private boolean mPendingShowConfirm; - protected abstract void updateIcon(int lastState, int newState); protected abstract int getHintStringResourceId(); protected abstract int getAuthenticatedAccessibilityResourceId(); protected abstract int getIconDescriptionResourceId(); + protected abstract Drawable getAnimationForTransition(int oldState, int newState); + protected abstract boolean shouldAnimateForTransition(int oldState, int newState); + protected abstract int getDelayAfterAuthenticatedDurationMs(); private final Runnable mShowAnimationRunnable = new Runnable() { @Override @@ -178,10 +184,10 @@ public abstract class BiometricDialogView extends LinearLayout { final View space = mLayout.findViewById(R.id.space); final View leftSpace = mLayout.findViewById(R.id.left_space); final View rightSpace = mLayout.findViewById(R.id.right_space); - final Button negative = mLayout.findViewById(R.id.button2); - final Button positive = mLayout.findViewById(R.id.button1); final ImageView icon = mLayout.findViewById(R.id.biometric_icon); final Button tryAgain = mLayout.findViewById(R.id.button_try_again); + mNegativeButton = mLayout.findViewById(R.id.button2); + mPositiveButton = mLayout.findViewById(R.id.button1); icon.setContentDescription(getResources().getString(getIconDescriptionResourceId())); @@ -189,12 +195,15 @@ public abstract class BiometricDialogView extends LinearLayout { setDismissesDialog(leftSpace); setDismissesDialog(rightSpace); - negative.setOnClickListener((View v) -> { + mNegativeButton.setOnClickListener((View v) -> { mCallback.onNegativePressed(); }); - positive.setOnClickListener((View v) -> { - mCallback.onPositivePressed(); + mPositiveButton.setOnClickListener((View v) -> { + updateState(STATE_AUTHENTICATED); + mHandler.postDelayed(() -> { + mCallback.onPositivePressed(); + }, getDelayAfterAuthenticatedDurationMs()); }); tryAgain.setOnClickListener((View v) -> { @@ -215,7 +224,6 @@ public abstract class BiometricDialogView extends LinearLayout { final TextView title = mLayout.findViewById(R.id.title); final TextView subtitle = mLayout.findViewById(R.id.subtitle); final TextView description = mLayout.findViewById(R.id.description); - final Button negative = mLayout.findViewById(R.id.button2); final ImageView backgroundView = mLayout.findViewById(R.id.background); if (mUserManager.isManagedProfile(mUserId)) { @@ -229,6 +237,9 @@ public abstract class BiometricDialogView extends LinearLayout { backgroundView.setBackgroundColor(R.color.biometric_dialog_dim_color); } + mNegativeButton.setVisibility(View.VISIBLE); + mErrorText.setVisibility(View.VISIBLE); + if (RotationUtils.getRotation(mContext) != RotationUtils.ROTATION_NONE) { mDialog.getLayoutParams().width = (int) mDialogWidth; } @@ -258,7 +269,7 @@ public abstract class BiometricDialogView extends LinearLayout { description.setText(descriptionText); } - negative.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); + mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); showTryAgainButton(mPendingShowTryAgain); showConfirmationButton(mPendingShowConfirm); @@ -280,10 +291,32 @@ public abstract class BiometricDialogView extends LinearLayout { mSkipIntro = false; } + protected void updateIcon(int lastState, int newState) { + final Drawable icon = getAnimationForTransition(lastState, newState); + if (icon == null) { + Log.e(TAG, "Animation not found"); + return; + } + + final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable + ? (AnimatedVectorDrawable) icon + : null; + + final ImageView imageView = getLayout().findViewById(R.id.biometric_icon); + imageView.setImageDrawable(icon); + + if (animation != null && shouldAnimateForTransition(lastState, newState)) { + animation.forceAnimationOnUI(); + animation.start(); + } + } + private void setDismissesDialog(View v) { v.setClickable(true); v.setOnTouchListener((View view, MotionEvent event) -> { - mCallback.onUserCanceled(); + if (mLastState != STATE_AUTHENTICATED) { + mCallback.onUserCanceled(); + } return true; }); } @@ -302,6 +335,7 @@ public abstract class BiometricDialogView extends LinearLayout { showTryAgainButton(false /* show */); mPendingShowTryAgain = false; mPendingShowConfirm = false; + updateState(STATE_NONE); } }; @@ -362,11 +396,11 @@ public abstract class BiometricDialogView extends LinearLayout { } public void showConfirmationButton(boolean show) { - final Button positive = mLayout.findViewById(R.id.button1); if (show) { - positive.setVisibility(View.VISIBLE); + updateState(STATE_PENDING_CONFIRMATION); + mPositiveButton.setVisibility(View.VISIBLE); } else { - positive.setVisibility(View.GONE); + mPositiveButton.setVisibility(View.GONE); } } @@ -411,7 +445,15 @@ public abstract class BiometricDialogView extends LinearLayout { mCallback.onErrorShown(); } - private void updateState(int newState) { + public void updateState(int newState) { + if (newState == STATE_PENDING_CONFIRMATION) { + mErrorText.setVisibility(View.INVISIBLE); + } else if (newState == STATE_AUTHENTICATED) { + mPositiveButton.setVisibility(View.GONE); + mNegativeButton.setVisibility(View.GONE); + mErrorText.setVisibility(View.INVISIBLE); + } + updateIcon(mLastState, newState); mLastState = newState; } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java index feef3a6dc133..de3f9471a6ba 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java @@ -18,16 +18,18 @@ package com.android.systemui.biometrics; import android.content.Context; import android.graphics.drawable.Drawable; -import android.widget.ImageView; import com.android.systemui.R; /** * This class loads the view for the system-provided dialog. The view consists of: - * Application Icon, Title, Subtitle, Description, Fingerprint Icon, Error/Help message area, + * Application Icon, Title, Subtitle, Description, Biometric Icon, Error/Help message area, * and positive/negative buttons. */ public class FaceDialogView extends BiometricDialogView { + + private static final int HIDE_DIALOG_DELAY = 500; // ms + public FaceDialogView(Context context, DialogViewCallback callback) { super(context, callback); @@ -53,10 +55,46 @@ public class FaceDialogView extends BiometricDialogView { } @Override - protected void updateIcon(int lastState, int newState) { - Drawable icon = mContext.getDrawable(R.drawable.face_dialog_icon); + protected boolean shouldAnimateForTransition(int oldState, int newState) { + if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) { + return false; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) { + return true; + } else if (oldState == STATE_ERROR && newState == STATE_AUTHENTICATING) { + return true; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_PENDING_CONFIRMATION) { + return true; + } else if (oldState == STATE_PENDING_CONFIRMATION && newState == STATE_AUTHENTICATED) { + return true; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) { + return true; + } + return false; + } + + @Override + protected int getDelayAfterAuthenticatedDurationMs() { + return HIDE_DIALOG_DELAY; + } - final ImageView faceIcon = getLayout().findViewById(R.id.biometric_icon); - faceIcon.setImageDrawable(icon); + @Override + protected Drawable getAnimationForTransition(int oldState, int newState) { + int iconRes; + if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) { + iconRes = R.drawable.face_dialog_face_to_error; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) { + iconRes = R.drawable.face_dialog_face_to_error; + } else if (oldState == STATE_ERROR && newState == STATE_AUTHENTICATING) { + iconRes = R.drawable.face_dialog_error_to_face; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_PENDING_CONFIRMATION) { + iconRes = R.drawable.face_dialog_face_gray_to_face_blue; + } else if (oldState == STATE_PENDING_CONFIRMATION && newState == STATE_AUTHENTICATED) { + iconRes = R.drawable.face_dialog_face_blue_to_checkmark; + } else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) { + iconRes = R.drawable.face_dialog_face_gray_to_checkmark; + } else { + return null; + } + return mContext.getDrawable(iconRes); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java index 38a69a90f0bb..1a6cee281c84 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FingerprintDialogView.java @@ -17,21 +17,21 @@ package com.android.systemui.biometrics; import android.content.Context; -import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; -import android.util.Log; -import android.widget.ImageView; import com.android.systemui.R; /** * This class loads the view for the system-provided dialog. The view consists of: - * Application Icon, Title, Subtitle, Description, Fingerprint Icon, Error/Help message area, + * Application Icon, Title, Subtitle, Description, Biometric Icon, Error/Help message area, * and positive/negative buttons. */ public class FingerprintDialogView extends BiometricDialogView { - private static final String TAG = "FingerprintDialogView"; + public FingerprintDialogView(Context context, + DialogViewCallback callback) { + super(context, callback); + } @Override protected int getHintStringResourceId() { return R.string.fingerprint_dialog_touch_sensor; @@ -48,33 +48,7 @@ public class FingerprintDialogView extends BiometricDialogView { } @Override - protected void updateIcon(int lastState, int newState) { - Drawable icon = getAnimationForTransition(lastState, newState); - - if (icon == null) { - Log.e(TAG, "Animation not found"); - return; - } - - final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable - ? (AnimatedVectorDrawable) icon - : null; - - final ImageView fingerprintIcon = getLayout().findViewById(R.id.biometric_icon); - fingerprintIcon.setImageDrawable(icon); - - if (animation != null && shouldAnimateForTransition(lastState, newState)) { - animation.forceAnimationOnUI(); - animation.start(); - } - } - - public FingerprintDialogView(Context context, - DialogViewCallback callback) { - super(context, callback); - } - - private boolean shouldAnimateForTransition(int oldState, int newState) { + protected boolean shouldAnimateForTransition(int oldState, int newState) { if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) { return false; } else if (oldState == STATE_AUTHENTICATING && newState == STATE_ERROR) { @@ -88,7 +62,13 @@ public class FingerprintDialogView extends BiometricDialogView { return false; } - private Drawable getAnimationForTransition(int oldState, int newState) { + @Override + protected int getDelayAfterAuthenticatedDurationMs() { + return 0; + } + + @Override + protected Drawable getAnimationForTransition(int oldState, int newState) { int iconRes; if (oldState == STATE_NONE && newState == STATE_AUTHENTICATING) { iconRes = R.drawable.fingerprint_dialog_fp_to_error; @@ -98,7 +78,7 @@ public class FingerprintDialogView extends BiometricDialogView { iconRes = R.drawable.fingerprint_dialog_error_to_fp; } else if (oldState == STATE_AUTHENTICATING && newState == STATE_AUTHENTICATED) { // TODO(b/77328470): add animation when fingerprint is authenticated - iconRes = R.drawable.fingerprint_dialog_error_to_fp; + iconRes = R.drawable.fingerprint_dialog_fp_to_error; } else { return null; } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 04362c17141c..b6fc35553760 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -85,6 +85,7 @@ public class DozeSensors { mProxCallback = proxCallback; mResolver = mContext.getContentResolver(); + boolean alwaysOn = mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT); mSensors = new TriggerSensor[] { new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION), @@ -116,7 +117,7 @@ public class DozeSensors { new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY), Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, - mConfig.wakeScreenGestureAvailable(), + mConfig.wakeScreenGestureAvailable() && alwaysOn, DozeLog.REASON_SENSOR_WAKE_UP, false /* reports touch coordinates */, false /* touchscreen */), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java index 32acb8df173c..610d3003f0e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java @@ -174,7 +174,7 @@ public class NotificationLogger implements StateListener { NotificationVisibility visibility, boolean lifetimeExtended, boolean removedByUser) { - if (removedByUser && visibility != null && entry.notification != null) { + if (removedByUser && visibility != null && entry != null) { logNotificationClear(key, entry.notification, visibility); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 1b18c6cf8440..fd34ac553c8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -2803,6 +2803,11 @@ public class NotificationPanelView extends PanelView implements if (animatePulse) { mAnimateNextPositionUpdate = true; } + // Do not animate the clock when waking up from a pulse. + // The height callback will take care of pushing the clock to the right position. + if (!mPulsing && !mDozing) { + mAnimateNextPositionUpdate = false; + } mNotificationStackScroller.setPulsing(pulsing, animatePulse); mKeyguardStatusView.setPulsing(pulsing, animatePulse); mKeyguardBottomArea.setPulsing(pulsing, animatePulse); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index 2c756ceb1b48..d4049826a50a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -33,6 +33,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.util.AttributeSet; +import android.util.Log; import android.util.TypedValue; import android.view.HapticFeedbackConstants; import android.view.InputDevice; @@ -304,6 +305,10 @@ public class KeyButtonView extends ImageView implements ButtonInterface { .setSubtype(mCode) .addTaggedData(MetricsEvent.FIELD_NAV_ACTION, action) .addTaggedData(MetricsEvent.FIELD_FLAGS, flags)); + // TODO(b/122195391): Added logs to make sure sysui is sending back button events + if (mCode == KeyEvent.KEYCODE_BACK && flags != KeyEvent.FLAG_LONG_PRESS) { + Log.i(TAG, "Back button event: " + KeyEvent.actionToString(action)); + } final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0; final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java index 3426e117ab13..61bfa758ad79 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java @@ -69,4 +69,10 @@ public class DependencyTest extends SysuiTestCase { mDependency.onConfigurationChanged(null); verify(d).onConfigurationChanged(eq(null)); } + + @Test + public void testInitDependency() { + Dependency.clearDependencies(); + Dependency.initDependencies(mContext); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java index 7b96518ad13f..983ca837b639 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java @@ -42,6 +42,7 @@ import com.android.systemui.UiOffloadThread; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationData; +import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; @@ -51,6 +52,8 @@ import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -72,9 +75,11 @@ public class NotificationLoggerTest extends SysuiTestCase { // Dependency mocks: @Mock private NotificationEntryManager mEntryManager; @Mock private NotificationListener mListener; + @Captor private ArgumentCaptor<NotificationEntryListener> mEntryListenerCaptor; private NotificationData.Entry mEntry; private TestableNotificationLogger mLogger; + private NotificationEntryListener mNotificationEntryListener; private ConcurrentLinkedQueue<AssertionError> mErrorQueue = new ConcurrentLinkedQueue<>(); @Before @@ -94,6 +99,8 @@ public class NotificationLoggerTest extends SysuiTestCase { mLogger = new TestableNotificationLogger(mListener, Dependency.get(UiOffloadThread.class), mEntryManager, mock(StatusBarStateController.class), mBarService); mLogger.setUpWithContainer(mListContainer); + verify(mEntryManager).addNotificationEntryListener(mEntryListenerCaptor.capture()); + mNotificationEntryListener = mEntryListenerCaptor.getValue(); } @Test @@ -152,6 +159,11 @@ public class NotificationLoggerTest extends SysuiTestCase { verify(mBarService, times(1)).onNotificationVisibilityChanged(any(), any()); } + @Test + public void testHandleNullEntryOnEntryRemoved() { + mNotificationEntryListener.onEntryRemoved(null, "foobar", null, null, false, false); + } + private class TestableNotificationLogger extends NotificationLogger { TestableNotificationLogger(NotificationListener notificationListener, diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 65cd329b5de8..f9a77af631af 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -67,8 +67,8 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS_GLES, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.SMS_ACCESS_RESTRICTION_ENABLED, int.class); - sGlobalSettingToTypeMap.put(Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, - String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GUP_DEV_OPT_IN_APPS, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GUP_BLACK_LIST, String.class); // add other global settings here... } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index a381477b01cb..36ca4dcbea33 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -373,6 +373,13 @@ public class BiometricService extends SystemService { public void onAuthenticationSucceeded(boolean requireConfirmation, byte[] token) throws RemoteException { try { + // Should never happen, log this to catch bad HAL behavior (e.g. auth succeeded + // after user dismissed/canceled dialog). + if (mCurrentAuthSession == null) { + Slog.e(TAG, "onAuthenticationSucceeded(): Auth session is null"); + return; + } + if (!requireConfirmation) { mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener); KeyStore.getInstance().addAuthToken(token); @@ -398,6 +405,13 @@ public class BiometricService extends SystemService { public void onAuthenticationFailed(int cookie, boolean requireConfirmation) throws RemoteException { try { + // Should never happen, log this to catch bad HAL behavior (e.g. auth succeeded + // after user dismissed/canceled dialog). + if (mCurrentAuthSession == null) { + Slog.e(TAG, "onAuthenticationFailed(): Auth session is null"); + return; + } + mStatusBarService.onBiometricHelp(getContext().getResources().getString( com.android.internal.R.string.biometric_not_recognized)); if (requireConfirmation) { @@ -486,6 +500,13 @@ public class BiometricService extends SystemService { @Override public void onAcquired(int acquiredInfo, String message) throws RemoteException { + // Should never happen, log this to catch bad HAL behavior (e.g. auth succeeded + // after user dismissed/canceled dialog). + if (mCurrentAuthSession == null) { + Slog.e(TAG, "onAcquired(): Auth session is null"); + return; + } + if (acquiredInfo != BiometricConstants.BIOMETRIC_ACQUIRED_GOOD) { try { mStatusBarService.onBiometricHelp(message); diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index dd2abde10433..d49c4a94256e 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -236,6 +236,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { * {@link AudioManager#ADJUST_SAME}. * * @param packageName The package that made the original volume request. + * @param opPackageName The op package that made the original volume request. * @param pid The pid that made the original volume request. * @param uid The uid that made the original volume request. * @param caller caller binder. can be {@code null} if it's from the volume key. @@ -248,7 +249,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { * @param flags Any of the flags from {@link AudioManager}. * @param useSuggested True to use adjustSuggestedStreamVolume instead of */ - public void adjustVolume(String packageName, int pid, int uid, + public void adjustVolume(String packageName, String opPackageName, int pid, int uid, ControllerCallbackLink caller, boolean asSystemService, int direction, int flags, boolean useSuggested) { int previousFlagPlaySound = flags & AudioManager.FLAG_PLAY_SOUND; @@ -258,8 +259,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) { // Adjust the volume with a handler not to be blocked by other system service. int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs); - postAdjustLocalVolume(stream, direction, flags, packageName, uid, asSystemService, - useSuggested, previousFlagPlaySound); + postAdjustLocalVolume(stream, direction, flags, opPackageName, pid, uid, + asSystemService, useSuggested, previousFlagPlaySound); } else { if (mVolumeControlType == VolumeProvider.VOLUME_CONTROL_FIXED) { // Nothing to do, the volume cannot be changed @@ -290,11 +291,23 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } - private void setVolumeTo(String packageName, int pid, int uid, + private void setVolumeTo(String packageName, String opPackageName, int pid, int uid, ControllerCallbackLink caller, int value, int flags) { if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) { int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs); - mAudioManagerInternal.setStreamVolumeForUid(stream, value, flags, packageName, uid); + final int volumeValue = value; + mHandler.post(new Runnable() { + @Override + public void run() { + try { + mAudioManagerInternal.setStreamVolumeForUid(stream, volumeValue, flags, + opPackageName, uid); + } catch (IllegalArgumentException | SecurityException e) { + Log.e(TAG, "Cannot set volume: stream=" + stream + ", value=" + volumeValue + + ", flags=" + flags, e); + } + } + }); } else { if (mVolumeControlType != VolumeProvider.VOLUME_CONTROL_ABSOLUTE) { // Nothing to do. The volume can't be set directly. @@ -465,11 +478,19 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } private void postAdjustLocalVolume(final int stream, final int direction, final int flags, - final String callingPackageName, final int callingUid, final boolean asSystemService, - final boolean useSuggested, final int previousFlagPlaySound) { - final String packageName = asSystemService - ? mContext.getOpPackageName() : callingPackageName; - final int uid = asSystemService ? Process.SYSTEM_UID : callingUid; + final String callingOpPackageName, final int callingPid, final int callingUid, + final boolean asSystemService, final boolean useSuggested, + final int previousFlagPlaySound) { + // Must use opPackageName for adjusting volumes with UID. + final String opPackageName; + final int uid; + if (asSystemService) { + opPackageName = mContext.getOpPackageName(); + uid = Process.SYSTEM_UID; + } else { + opPackageName = callingOpPackageName; + uid = callingUid; + } mHandler.post(new Runnable() { @Override public void run() { @@ -477,19 +498,19 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { if (useSuggested) { if (AudioSystem.isStreamActive(stream, 0)) { mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, - direction, flags, packageName, uid); + direction, flags, opPackageName, uid); } else { mAudioManagerInternal.adjustSuggestedStreamVolumeForUid( AudioManager.USE_DEFAULT_STREAM_TYPE, direction, - flags | previousFlagPlaySound, packageName, uid); + flags | previousFlagPlaySound, opPackageName, uid); } } else { mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags, - packageName, uid); + opPackageName, uid); } } catch (IllegalArgumentException | SecurityException e) { Log.e(TAG, "Cannot adjust volume: direction=" + direction + ", stream=" - + stream + ", flags=" + flags + ", packageName=" + packageName + + stream + ", flags=" + flags + ", opPackageName=" + opPackageName + ", uid=" + uid + ", useSuggested=" + useSuggested + ", previousFlagPlaySound=" + previousFlagPlaySound, e); } @@ -1256,27 +1277,28 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void adjustVolume(String packageName, ControllerCallbackLink caller, - boolean asSystemService, int direction, int flags) { + public void adjustVolume(String packageName, String opPackageName, + ControllerCallbackLink caller, boolean asSystemService, int direction, int flags) { int pid = Binder.getCallingPid(); int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { - MediaSessionRecord.this.adjustVolume(packageName, pid, uid, caller, asSystemService, - direction, flags, false /* useSuggested */); + MediaSessionRecord.this.adjustVolume(packageName, opPackageName, pid, uid, caller, + asSystemService, direction, flags, false /* useSuggested */); } finally { Binder.restoreCallingIdentity(token); } } @Override - public void setVolumeTo(String packageName, ControllerCallbackLink caller, - int value, int flags) { + public void setVolumeTo(String packageName, String opPackageName, + ControllerCallbackLink caller, int value, int flags) { int pid = Binder.getCallingPid(); int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { - MediaSessionRecord.this.setVolumeTo(packageName, pid, uid, caller, value, flags); + MediaSessionRecord.this.setVolumeTo(packageName, opPackageName, pid, uid, caller, + value, flags); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index b807c47c09b9..7dbabda21b19 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -35,6 +35,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.media.AudioManager; +import android.media.AudioManagerInternal; import android.media.AudioPlaybackConfiguration; import android.media.AudioSystem; import android.media.IAudioService; @@ -72,6 +73,7 @@ import android.view.KeyEvent; import android.view.ViewConfiguration; import com.android.internal.util.DumpUtils; +import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.Watchdog; import com.android.server.Watchdog.Monitor; @@ -108,6 +110,8 @@ public class MediaSessionService extends SystemService implements Monitor { private KeyguardManager mKeyguardManager; private IAudioService mAudioService; + private AudioManagerInternal mAudioManagerInternal; + private ActivityManager mActivityManager; private ContentResolver mContentResolver; private SettingsObserver mSettingsObserver; private boolean mHasFeatureLeanback; @@ -139,6 +143,9 @@ public class MediaSessionService extends SystemService implements Monitor { mKeyguardManager = (KeyguardManager) getContext().getSystemService(Context.KEYGUARD_SERVICE); mAudioService = getAudioService(); + mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class); + mActivityManager = + (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE); mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(); mAudioPlayerStateMonitor.registerListener( (config, isRemoved) -> { @@ -1202,7 +1209,8 @@ public class MediaSessionService extends SystemService implements Monitor { * there's no active global priority session, long-pressess will be sent to the * long-press listener instead of adjusting volume. * - * @param packageName The caller package. + * @param packageName The caller's package name, obtained by Context#getPackageName() + * @param opPackageName The caller's op package name, obtained by Context#getOpPackageName() * @param asSystemService {@code true} if the event sent to the session as if it was come * from the system service instead of the app process. This helps sessions to * distinguish between the key injection by the app and key events from the @@ -1217,8 +1225,8 @@ public class MediaSessionService extends SystemService implements Monitor { * @param musicOnly true if both UI nor haptic feedback aren't needed when adjust volume. */ @Override - public void dispatchVolumeKeyEvent(String packageName, boolean asSystemService, - KeyEvent keyEvent, int stream, boolean musicOnly) { + public void dispatchVolumeKeyEvent(String packageName, String opPackageName, + boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) { if (keyEvent == null || (keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_UP && keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_DOWN @@ -1240,8 +1248,8 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { if (isGlobalPriorityActiveLocked() || mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) { - dispatchVolumeKeyEventLocked(packageName, pid, uid, asSystemService, - keyEvent, stream, musicOnly); + dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid, + asSystemService, keyEvent, stream, musicOnly); } else { // TODO: Consider the case when both volume up and down keys are pressed // at the same time. @@ -1274,12 +1282,13 @@ public class MediaSessionService extends SystemService implements Monitor { && mCurrentFullUserRecord.mInitialDownVolumeKeyEvent .getDownTime() == keyEvent.getDownTime()) { // Short-press. Should change volume. - dispatchVolumeKeyEventLocked(packageName, pid, uid, asSystemService, + dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid, + asSystemService, mCurrentFullUserRecord.mInitialDownVolumeKeyEvent, mCurrentFullUserRecord.mInitialDownVolumeStream, mCurrentFullUserRecord.mInitialDownMusicOnly); - dispatchVolumeKeyEventLocked(packageName, pid, uid, asSystemService, - keyEvent, stream, musicOnly); + dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid, + asSystemService, keyEvent, stream, musicOnly); } else { dispatchVolumeKeyLongPressLocked(keyEvent); } @@ -1291,8 +1300,9 @@ public class MediaSessionService extends SystemService implements Monitor { } } - private void dispatchVolumeKeyEventLocked(String packageName, int pid, int uid, - boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) { + private void dispatchVolumeKeyEventLocked(String packageName, String opPackageName, int pid, + int uid, boolean asSystemService, KeyEvent keyEvent, int stream, + boolean musicOnly) { boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN; boolean up = keyEvent.getAction() == KeyEvent.ACTION_UP; int direction = 0; @@ -1326,26 +1336,26 @@ public class MediaSessionService extends SystemService implements Monitor { if (up) { direction = 0; } - dispatchAdjustVolumeLocked(packageName, pid, uid, asSystemService, stream, - direction, flags); + dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid, + asSystemService, stream, direction, flags); } else if (isMute) { if (down && keyEvent.getRepeatCount() == 0) { - dispatchAdjustVolumeLocked(packageName, pid, uid, asSystemService, stream, - AudioManager.ADJUST_TOGGLE_MUTE, flags); + dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid, + asSystemService, stream, AudioManager.ADJUST_TOGGLE_MUTE, flags); } } } } @Override - public void dispatchAdjustVolume(String packageName, int suggestedStream, int delta, - int flags) { + public void dispatchAdjustVolume(String packageName, String opPackageName, + int suggestedStream, int delta, int flags) { final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { - dispatchAdjustVolumeLocked(packageName, pid, uid, false, + dispatchAdjustVolumeLocked(packageName, opPackageName, pid, uid, false, suggestedStream, delta, flags); } } finally { @@ -1409,24 +1419,14 @@ public class MediaSessionService extends SystemService implements Monitor { final int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { - int controllerUserId = UserHandle.getUserId(controllerUid); - int controllerUidFromPackageName; - try { - controllerUidFromPackageName = getContext().getPackageManager() - .getPackageUidAsUser(controllerPackageName, controllerUserId); - } catch (NameNotFoundException e) { - if (DEBUG) { - Log.d(TAG, "Package " + controllerPackageName + " doesn't exist"); - } - return false; - } - if (controllerUidFromPackageName != controllerUid) { - if (DEBUG) { - Log.d(TAG, "Package name " + controllerPackageName - + " doesn't match with the uid " + controllerUid); - } - return false; - } + // Don't perform sanity check between controllerPackageName and controllerUid. + // When an (activity|service) runs on the another apps process by specifying + // android:process in the AndroidManifest.xml, then PID and UID would have the + // running process' information instead of the (activity|service) that has created + // MediaController. + // Note that we can use Context#getOpPackageName() instead of + // Context#getPackageName() for getting package name that matches with the PID/UID, + // but it doesn't tell which package has created the MediaController, so useless. return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName, controllerPid, controllerUid); } finally { @@ -1497,8 +1497,8 @@ public class MediaSessionService extends SystemService implements Monitor { return false; } - private void dispatchAdjustVolumeLocked(String packageName, int pid, int uid, - boolean asSystemService, int suggestedStream, int direction, int flags) { + private void dispatchAdjustVolumeLocked(String packageName, String opPackageName, int pid, + int uid, boolean asSystemService, int suggestedStream, int direction, int flags) { MediaSessionRecord session = isGlobalPriorityActiveLocked() ? mGlobalPrioritySession : mCurrentFullUserRecord.mPriorityStack.getDefaultVolumeSession(); @@ -1529,21 +1529,28 @@ public class MediaSessionService extends SystemService implements Monitor { mHandler.post(new Runnable() { @Override public void run() { + final String callingOpPackageName; + final int callingUid; + if (asSystemService) { + callingOpPackageName = getContext().getOpPackageName(); + callingUid = Process.myUid(); + } else { + callingOpPackageName = opPackageName; + callingUid = uid; + } try { - String packageName = getContext().getOpPackageName(); - mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream, - flags, packageName, TAG); - } catch (RemoteException|SecurityException e) { - Log.e(TAG, "Error adjusting default volume.", e); - } catch (IllegalArgumentException e) { + mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(suggestedStream, + direction, flags, callingOpPackageName, callingUid); + } catch (SecurityException | IllegalArgumentException e) { Log.e(TAG, "Cannot adjust volume: direction=" + direction - + ", suggestedStream=" + suggestedStream + ", flags=" + flags, - e); + + ", suggestedStream=" + suggestedStream + ", flags=" + flags + + ", packageName=" + packageName + ", uid=" + uid + + ", asSystemService=" + asSystemService, e); } } }); } else { - session.adjustVolume(packageName, pid, uid, null, asSystemService, + session.adjustVolume(packageName, opPackageName, pid, uid, null, asSystemService, direction, flags, true); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f370edf50708..c7928633eef6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -844,7 +844,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void interceptBackKeyDown() { - MetricsLogger.count(mContext, "key_back_down", 1); + mLogger.count("key_back_down", 1); // Reset back key state for long press mBackKeyHandled = false; @@ -858,6 +858,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // returns true if the key was handled and should not be passed to the user private boolean interceptBackKeyUp(KeyEvent event) { + mLogger.count("key_back_up", 1); // Cache handled state boolean handled = mBackKeyHandled; diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index d8b2b5200f0c..a5341ca11784 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1949,6 +1949,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } else if (newTask || !processRunning || (taskSwitch && !activityCreated)) { return STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else if (taskSwitch && allowTaskSnapshot) { + if (mWmService.mLowRamTaskSnapshots) { + // For low RAM devices, we use the splash screen starting window instead of the + // task snapshot starting window. + return STARTING_WINDOW_TYPE_SPLASH_SCREEN; + } return snapshot == null ? STARTING_WINDOW_TYPE_NONE : snapshotOrientationSameAsTask(snapshot) || fromRecents ? STARTING_WINDOW_TYPE_SNAPSHOT : STARTING_WINDOW_TYPE_SPLASH_SCREEN; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index b6a4a51c41f2..f5f55e2ebf73 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -433,6 +433,12 @@ public class WindowManagerService extends IWindowManager.Stub final long mDrawLockTimeoutMillis; final boolean mAllowAnimationsInLowPowerMode; + /** + * Use very low resolution task snapshots. Replaces task snapshot starting windows with + * splashscreen starting windows. Used on low RAM devices to save memory. + */ + final boolean mLowRamTaskSnapshots; + final boolean mAllowBootMessages; final boolean mLimitedAlphaCompositing; @@ -949,6 +955,8 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_disableTransitionAnimation); mPerDisplayFocusEnabled = context.getResources().getBoolean( com.android.internal.R.bool.config_perDisplayFocusEnabled); + mLowRamTaskSnapshots = context.getResources().getBoolean( + com.android.internal.R.bool.config_lowRamTaskSnapshotsAndRecents); mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mDisplayWindowSettings = new DisplayWindowSettings(this); diff --git a/tools/aapt2/cmd/Command.cpp b/tools/aapt2/cmd/Command.cpp index bdee5c9d4909..4424a357c1dd 100644 --- a/tools/aapt2/cmd/Command.cpp +++ b/tools/aapt2/cmd/Command.cpp @@ -21,80 +21,97 @@ #include <string> #include <vector> +#include "android-base/stringprintf.h" +#include "android-base/utf8.h" #include "androidfw/StringPiece.h" #include "util/Util.h" +using android::base::StringPrintf; using android::StringPiece; namespace aapt { -void Command::AddRequiredFlag(const StringPiece& name, - const StringPiece& description, std::string* value) { - auto func = [value](const StringPiece& arg) -> bool { - *value = arg.to_string(); +std::string GetSafePath(const StringPiece& arg) { +#ifdef _WIN32 + // If the path exceeds the maximum path length for Windows, encode the path using the + // extended-length prefix + std::wstring path16; + CHECK(android::base::UTF8PathToWindowsLongPath(arg.data(), &path16)) + << "Failed to convert file path to UTF-16: file path " << arg.data(); + + std::string path8; + CHECK(android::base::WideToUTF8(path16, &path8)) + << "Failed to convert file path back to UTF-8: file path " << arg.data(); + + return path8; +#else + return arg.to_string(); +#endif +} + +void Command::AddRequiredFlag(const StringPiece& name, const StringPiece& description, + std::string* value, uint32_t flags) { + auto func = [value, flags](const StringPiece& arg) -> bool { + *value = (flags & Command::kPath) ? GetSafePath(arg) : arg.to_string(); return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, true, 1, false}); + flags_.emplace_back(Flag(name, description, /* required */ true, /* num_args */ 1, func)); } -void Command::AddRequiredFlagList(const StringPiece& name, - const StringPiece& description, - std::vector<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - value->push_back(arg.to_string()); +void Command::AddRequiredFlagList(const StringPiece& name, const StringPiece& description, + std::vector<std::string>* value, uint32_t flags) { + auto func = [value, flags](const StringPiece& arg) -> bool { + value->push_back((flags & Command::kPath) ? GetSafePath(arg) : arg.to_string()); return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, true, 1, false}); + flags_.emplace_back(Flag(name, description, /* required */ true, /* num_args */ 1, func)); } -void Command::AddOptionalFlag(const StringPiece& name, - const StringPiece& description, - Maybe<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - *value = arg.to_string(); +void Command::AddOptionalFlag(const StringPiece& name, const StringPiece& description, + Maybe<std::string>* value, uint32_t flags) { + auto func = [value, flags](const StringPiece& arg) -> bool { + *value = (flags & Command::kPath) ? GetSafePath(arg) : arg.to_string(); return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false}); + flags_.emplace_back(Flag(name, description, /* required */ false, /* num_args */ 1, func)); } -void Command::AddOptionalFlagList(const StringPiece& name, - const StringPiece& description, - std::vector<std::string>* value) { - auto func = [value](const StringPiece& arg) -> bool { - value->push_back(arg.to_string()); +void Command::AddOptionalFlagList(const StringPiece& name, const StringPiece& description, + std::vector<std::string>* value, uint32_t flags) { + auto func = [value, flags](const StringPiece& arg) -> bool { + value->push_back((flags & Command::kPath) ? GetSafePath(arg) : arg.to_string()); return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false}); + flags_.emplace_back(Flag(name, description, /* required */ false, /* num_args */ 1, func)); } -void Command::AddOptionalFlagList(const StringPiece& name, - const StringPiece& description, - std::unordered_set<std::string>* value) { +void Command::AddOptionalFlagList(const StringPiece& name, const StringPiece& description, + std::unordered_set<std::string>* value) { auto func = [value](const StringPiece& arg) -> bool { value->insert(arg.to_string()); return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false}); + flags_.emplace_back(Flag(name, description, /* required */ false, /* num_args */ 1, func)); } -void Command::AddOptionalSwitch(const StringPiece& name, - const StringPiece& description, bool* value) { +void Command::AddOptionalSwitch(const StringPiece& name, const StringPiece& description, + bool* value) { auto func = [value](const StringPiece& arg) -> bool { *value = true; return true; }; - flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 0, false}); + flags_.emplace_back(Flag(name, description, /* required */ false, /* num_args */ 0, func)); } void Command::AddOptionalSubcommand(std::unique_ptr<Command>&& subcommand, bool experimental) { - subcommand->fullname_ = name_ + " " + subcommand->name_; + subcommand->full_subcommand_name_ = StringPrintf("%s %s", name_.data(), subcommand->name_.data()); if (experimental) { experimental_subcommands_.push_back(std::move(subcommand)); } else { @@ -102,14 +119,14 @@ void Command::AddOptionalSubcommand(std::unique_ptr<Command>&& subcommand, bool } } -void Command::SetDescription(const android::StringPiece& description) { +void Command::SetDescription(const StringPiece& description) { description_ = description.to_string(); } void Command::Usage(std::ostream* out) { constexpr size_t kWidth = 50; - *out << fullname_; + *out << full_subcommand_name_; if (!subcommands_.empty()) { *out << " [subcommand]"; @@ -117,7 +134,7 @@ void Command::Usage(std::ostream* out) { *out << " [options]"; for (const Flag& flag : flags_) { - if (flag.required) { + if (flag.is_required) { *out << " " << flag.name << " arg"; } } @@ -160,29 +177,31 @@ void Command::Usage(std::ostream* out) { out->flush(); } -int Command::Execute(const std::vector<android::StringPiece>& args, std::ostream* out_error) { +int Command::Execute(const std::vector<StringPiece>& args, std::ostream* out_error) { std::vector<std::string> file_args; for (size_t i = 0; i < args.size(); i++) { - StringPiece arg = args[i]; + const StringPiece& arg = args[i]; if (*(arg.data()) != '-') { // Continue parsing as the subcommand if the first argument matches one of the subcommands if (i == 0) { for (auto& subcommand : subcommands_) { - if (arg == subcommand->name_ || arg==subcommand->short_name_) { + if (arg == subcommand->name_ || (!subcommand->short_name_.empty() + && arg == subcommand->short_name_)) { return subcommand->Execute( - std::vector<android::StringPiece>(args.begin() + 1, args.end()), out_error); + std::vector<StringPiece>(args.begin() + 1, args.end()), out_error); } } for (auto& subcommand : experimental_subcommands_) { - if (arg == subcommand->name_ || arg==subcommand->short_name_) { + if (arg == subcommand->name_ || (!subcommand->short_name_.empty() + && arg == subcommand->short_name_)) { return subcommand->Execute( - std::vector<android::StringPiece>(args.begin() + 1, args.end()), out_error); + std::vector<StringPiece>(args.begin() + 1, args.end()), out_error); } } } - file_args.push_back(arg.to_string()); + file_args.push_back(GetSafePath(arg)); continue; } @@ -205,7 +224,7 @@ int Command::Execute(const std::vector<android::StringPiece>& args, std::ostream } else { flag.action({}); } - flag.parsed = true; + flag.found = true; match = true; break; } @@ -219,7 +238,7 @@ int Command::Execute(const std::vector<android::StringPiece>& args, std::ostream } for (const Flag& flag : flags_) { - if (flag.required && !flag.parsed) { + if (flag.is_required && !flag.found) { *out_error << "missing required flag " << flag.name << "\n\n"; Usage(out_error); return 1; diff --git a/tools/aapt2/cmd/Command.h b/tools/aapt2/cmd/Command.h index 16949883d123..d21571d530d2 100644 --- a/tools/aapt2/cmd/Command.h +++ b/tools/aapt2/cmd/Command.h @@ -32,55 +32,83 @@ namespace aapt { class Command { public: explicit Command(const android::StringPiece& name) : name_(name.to_string()), - fullname_(name.to_string()) { } + short_name_(""), + full_subcommand_name_(name.to_string()) {} + explicit Command(const android::StringPiece& name, const android::StringPiece& short_name) - : name_(name.to_string()), short_name_(short_name.to_string()), fullname_(name.to_string()) {} + : name_(name.to_string()), short_name_(short_name.to_string()), + full_subcommand_name_(name.to_string()) {} + virtual ~Command() = default; + // Behavior flags used with the following functions that change how the command flags are parsed + // displayed. + enum : uint32_t { + // Indicates the arguments are file or folder paths. On Windows, paths that exceed the maximum + // path length will be converted to use the extended path prefix '//?/'. Without this + // conversion, files with long paths cannot be opened. + kPath = 1 << 0, + }; + void AddRequiredFlag(const android::StringPiece& name, const android::StringPiece& description, - std::string* value); - void AddRequiredFlagList(const android::StringPiece& name, const android::StringPiece& - description, std::vector<std::string>* value); + std::string* value, uint32_t flags = 0); + + void AddRequiredFlagList(const android::StringPiece& name, + const android::StringPiece& description, std::vector<std::string>* value, + uint32_t flags = 0); + void AddOptionalFlag(const android::StringPiece& name, const android::StringPiece& description, - Maybe<std::string>* value); + Maybe<std::string>* value, uint32_t flags = 0); + void AddOptionalFlagList(const android::StringPiece& name, - const android::StringPiece& description, std::vector<std::string>* value); + const android::StringPiece& description, std::vector<std::string>* value, + uint32_t flags = 0); + void AddOptionalFlagList(const android::StringPiece& name, - const android::StringPiece& description, std::unordered_set<std::string>* value); + const android::StringPiece& description, + std::unordered_set<std::string>* value); + void AddOptionalSwitch(const android::StringPiece& name, const android::StringPiece& description, - bool* value); + bool* value); + void AddOptionalSubcommand(std::unique_ptr<Command>&& subcommand, bool experimental = false); void SetDescription(const android::StringPiece& name); - /** Prints the help menu of the command. */ + // Prints the help menu of the command. void Usage(std::ostream* out); - /** - * Parses the command line arguments, sets the flag variable values, and runs the action of - * the command. If the arguments fail to parse to the command and its subcommands, then the action - * will not be run and the usage will be printed instead. - **/ + // Parses the command line arguments, sets the flag variable values, and runs the action of + // the command. If the arguments fail to parse to the command and its subcommands, then the action + // will not be run and the usage will be printed instead. int Execute(const std::vector<android::StringPiece>& args, std::ostream* outError); - /** The action to preform when the command is executed. */ + // The action to preform when the command is executed. virtual int Action(const std::vector<std::string>& args) = 0; private: - struct Flag { - std::string name; - std::string description; - std::function<bool(const android::StringPiece& value)> action; - bool required; - size_t num_args; + DISALLOW_COPY_AND_ASSIGN(Command); - bool parsed; + struct Flag { + explicit Flag(const android::StringPiece& name, const android::StringPiece& description, + const bool is_required, const size_t num_args, + std::function<bool(const android::StringPiece& value)>&& action) + : name(name.to_string()), description(description.to_string()), is_required(is_required), + num_args(num_args), action(std::move(action)) {} + + const std::string name; + const std::string description; + const bool is_required; + const size_t num_args; + const std::function<bool(const android::StringPiece& value)> action; + bool found = false; }; - std::string description_; - std::string name_; - std::string short_name_; - std::string fullname_; + const std::string name_; + const std::string short_name_; + std::string description_ = ""; + std::string full_subcommand_name_; + std::vector<Flag> flags_; std::vector<std::unique_ptr<Command>> subcommands_; std::vector<std::unique_ptr<Command>> experimental_subcommands_; diff --git a/tools/aapt2/cmd/Command_test.cpp b/tools/aapt2/cmd/Command_test.cpp new file mode 100644 index 000000000000..65608fdf64a7 --- /dev/null +++ b/tools/aapt2/cmd/Command_test.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Command.h" + +#include "test/Test.h" + +using ::testing::Eq; + +namespace aapt { + +class TestCommand : public Command { + public: + explicit TestCommand() : Command("command") {} + int Action(const std::vector<std::string>& args) override { + args_ = args; + return 0; + } + + std::vector<std::string> args_; +}; + +#ifdef _WIN32 +TEST(CommandTest, LongFullyQualifiedPathWindows) { + TestCommand command; + std::string required_flag; + command.AddRequiredFlag("--rflag", "", &required_flag, Command::kPath); + Maybe<std::string> optional_flag; + command.AddOptionalFlag("--oflag", "", &optional_flag, Command::kPath); + std::vector<std::string> required_flag_list; + command.AddRequiredFlagList("--rlflag", "", &required_flag_list, Command::kPath); + std::vector<std::string> optional_flag_list; + command.AddOptionalFlagList("--olflag", "", &optional_flag_list, Command::kPath); + std::string non_path_flag; + command.AddRequiredFlag("--nflag", "", &non_path_flag); + + const std::string kLongPath = + "C:\\Users\\jedo\\_bazel_jedo\\vcmdctjv\\execroot\\__main__\\_tmp" + "\\6767b4778f8798efc0f784ee74fa70ee\\tests\\testApksAr8c7560a9a65" + "\\1346ee7c014a089fb55d8c46cf3d9\\project\\baseModule\\build" + "\\intermediates\\processed_res\\minified\\processMinifiedResources" + "\\1346ee7c014a089fb55d8c46cf3d9\\project\\baseModule\\build" + "\\intermediates\\processed_res\\minified\\processMinifiedResources" + "\\out\\resources-minified.ap_"; + + const std::string kExpected = + "\\\\?\\C:\\Users\\jedo\\_bazel_jedo\\vcmdctjv\\execroot\\__main__\\_tmp" + "\\6767b4778f8798efc0f784ee74fa70ee\\tests\\testApksAr8c7560a9a65" + "\\1346ee7c014a089fb55d8c46cf3d9\\project\\baseModule\\build" + "\\intermediates\\processed_res\\minified\\processMinifiedResources" + "\\1346ee7c014a089fb55d8c46cf3d9\\project\\baseModule\\build" + "\\intermediates\\processed_res\\minified\\processMinifiedResources" + "\\out\\resources-minified.ap_"; + + + ASSERT_THAT(command.Execute({"--rflag", kLongPath, + "--oflag", kLongPath, + "--rlflag", kLongPath, + "--rlflag", kLongPath, + "--olflag", kLongPath, + "--olflag", kLongPath, + "--nflag", kLongPath, + kLongPath, kLongPath}, &std::cerr), Eq(0)); + + ASSERT_THAT(required_flag, Eq(kExpected)); + ASSERT_THAT(optional_flag, Eq(kExpected)); + ASSERT_THAT(required_flag_list.size(), Eq(2)); + ASSERT_THAT(required_flag_list[0], Eq(kExpected)); + ASSERT_THAT(required_flag_list[1], Eq(kExpected)); + ASSERT_THAT(optional_flag_list.size(), Eq(2)); + ASSERT_THAT(optional_flag_list[0], Eq(kExpected)); + ASSERT_THAT(optional_flag_list[1], Eq(kExpected)); + + // File arguments should also be converted to use the long path prefix + ASSERT_THAT(command.args_.size(), Eq(2)); + ASSERT_THAT(command.args_[0], Eq(kExpected)); + ASSERT_THAT(command.args_[1], Eq(kExpected)); + + // Do not convert flags that are not marged as paths + ASSERT_THAT(non_path_flag, Eq(kLongPath)); +} +#endif + +} // namespace aapt
\ No newline at end of file diff --git a/tools/aapt2/cmd/Compile.h b/tools/aapt2/cmd/Compile.h index c429d5f5d4b2..9b32cb3750a5 100644 --- a/tools/aapt2/cmd/Compile.h +++ b/tools/aapt2/cmd/Compile.h @@ -44,13 +44,13 @@ class CompileCommand : public Command { explicit CompileCommand(IDiagnostics* diagnostic) : Command("compile", "c"), diagnostic_(diagnostic) { SetDescription("Compiles resources to be linked into an apk."); - AddRequiredFlag("-o", "Output path", &options_.output_path); - AddOptionalFlag("--dir", "Directory to scan for resources", &options_.res_dir); + AddRequiredFlag("-o", "Output path", &options_.output_path, Command::kPath); + AddOptionalFlag("--dir", "Directory to scan for resources", &options_.res_dir, Command::kPath); AddOptionalFlag("--zip", "Zip file containing the res directory to scan for resources", - &options_.res_zip); + &options_.res_zip, Command::kPath); AddOptionalFlag("--output-text-symbols", "Generates a text file containing the resource symbols in the\n" - "specified file", &options_.generate_text_symbols_path); + "specified file", &options_.generate_text_symbols_path, Command::kPath); AddOptionalSwitch("--pseudo-localize", "Generate resources for pseudo-locales " "(en-XA and ar-XB)", &options_.pseudolocalize); AddOptionalSwitch("--no-crunch", "Disables PNG processing", &options_.no_png_crunch); @@ -70,8 +70,9 @@ class CompileCommand : public Command { Maybe<std::string> visibility_; }; -int Compile(IAaptContext* context, io::IFileCollection* inputs, - IArchiveWriter* output_writer, CompileOptions& options); +int Compile(IAaptContext* context, io::IFileCollection* inputs, IArchiveWriter* output_writer, + CompileOptions& options); + }// namespace aapt #endif //AAPT2_COMPILE_H diff --git a/tools/aapt2/cmd/Convert.h b/tools/aapt2/cmd/Convert.h index 6a6719c91b58..14016b106d80 100644 --- a/tools/aapt2/cmd/Convert.h +++ b/tools/aapt2/cmd/Convert.h @@ -27,7 +27,7 @@ class ConvertCommand : public Command { public: explicit ConvertCommand() : Command("convert") { SetDescription("Converts an apk between binary and proto formats."); - AddRequiredFlag("-o", "Output path", &output_path_); + AddRequiredFlag("-o", "Output path", &output_path_, Command::kPath); AddOptionalFlag("--output-format", android::base::StringPrintf("Format of the output. " "Accepted values are '%s' and '%s'. When not set, defaults to '%s'.", kOutputFormatProto, kOutputFormatBinary, kOutputFormatBinary), &output_format_); diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h index 950dac204dde..f740d538b326 100644 --- a/tools/aapt2/cmd/Link.h +++ b/tools/aapt2/cmd/Link.h @@ -100,24 +100,26 @@ class LinkCommand : public Command { explicit LinkCommand(IDiagnostics* diag) : Command("link", "l"), diag_(diag) { SetDescription("Links resources into an apk."); - AddRequiredFlag("-o", "Output path.", &options_.output_path); + AddRequiredFlag("-o", "Output path.", &options_.output_path, Command::kPath); AddRequiredFlag("--manifest", "Path to the Android manifest to build.", - &options_.manifest_path); - AddOptionalFlagList("-I", "Adds an Android APK to link against.", &options_.include_paths); + &options_.manifest_path, Command::kPath); + AddOptionalFlagList("-I", "Adds an Android APK to link against.", &options_.include_paths, + Command::kPath); AddOptionalFlagList("-A", "An assets directory to include in the APK. These are unprocessed.", - &options_.assets_dirs); + &options_.assets_dirs, Command::kPath); AddOptionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n" - "The last conflicting resource given takes precedence.", &overlay_arg_list_); + "The last conflicting resource given takes precedence.", &overlay_arg_list_, + Command::kPath); AddOptionalFlag("--package-id", "Specify the package ID to use for this app. Must be greater or equal to\n" "0x7f and can't be used with --static-lib or --shared-lib.", &package_id_); AddOptionalFlag("--java", "Directory in which to generate R.java.", - &options_.generate_java_class_path); + &options_.generate_java_class_path, Command::kPath); AddOptionalFlag("--proguard", "Output file for generated Proguard rules.", - &options_.generate_proguard_rules_path); + &options_.generate_proguard_rules_path, Command::kPath); AddOptionalFlag("--proguard-main-dex", "Output file for generated Proguard rules for the main dex.", - &options_.generate_main_dex_proguard_rules_path); + &options_.generate_main_dex_proguard_rules_path, Command::kPath); AddOptionalSwitch("--proguard-conditional-keep-rules", "Generate conditional Proguard keep rules.", &options_.generate_conditional_proguard_rules); diff --git a/tools/aapt2/cmd/Optimize.h b/tools/aapt2/cmd/Optimize.h index 43bc216382fa..d07305bc3e04 100644 --- a/tools/aapt2/cmd/Optimize.h +++ b/tools/aapt2/cmd/Optimize.h @@ -61,9 +61,10 @@ class OptimizeCommand : public Command { public: explicit OptimizeCommand() : Command("optimize") { SetDescription("Preforms resource optimizations on an apk."); - AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path); - AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir); - AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_); + AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path, Command::kPath); + AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir, + Command::kPath); + AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_, Command::kPath); AddOptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only_); AddOptionalFlag( "--target-densities", |