diff --git a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
index 7d5505e4e2..a1bcad0a7c 100644
--- a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
+++ b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
@@ -124,7 +124,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
- android:scaleType="centerCrop"
+ android:scaleType="matrix"
app:lottie_loop="true" />
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 3b8278451d..6d0dbaea9f 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -98,16 +98,17 @@
Rotate your device
Please rotate your device to complete the gesture navigation tutorial
+
- Make sure you swipe from the far-right or far-left edge.
+ Make sure you swipe from the far-right or far-left edge
- Make sure you swipe from the right or left edge to the middle of the screen and let go.
+ Make sure you swipe from the right or left edge to the middle of the screen and let go
You learned how to swipe from the right to go back. Next up, learn how to switch apps.
- You completed the go back gesture.
+ You completed the go back gesture
- Make sure you don\'t swipe too close to the bottom of the screen.
+ Make sure you don\'t swipe too close to the bottom of the screen
To change the sensitivity of the back gesture, go to Settings
@@ -119,16 +120,18 @@
To go back to the last screen, swipe with 2 fingers from the left or right edge to the middle of the screen.
Go back
+
+ Swipe from the left or right edge to the middle of the screen
- Make sure you swipe up from the bottom edge of the screen.
+ Make sure you swipe up from the bottom edge of the screen
- Make sure you don\'t pause before letting go.
+ Make sure you don\'t pause before letting go
- Make sure you swipe straight up.
+ Make sure you swipe straight up
- You completed the go Home gesture. Next up, learn how to go back.
+ You completed the go home gesture. Next up, learn how to go back.
- You completed the go Home gesture.
+ You completed the go home gesture
Swipe to go home
@@ -138,18 +141,20 @@
Go home
- To go to your home screen at any time, swipe up from the bottom of your screen
+ Swipe up from the bottom of your screen
+
+ Great job!
- Make sure you swipe up from the bottom edge of the screen.
+ Make sure you swipe up from the bottom edge of the screen
- Try holding the window for longer before releasing.
+ Try holding the window for longer before releasing
- Make sure you swipe straight up, then pause.
+ Make sure you swipe straight up, then pause
You learned how to use gestures. To turn off gestures, go to Settings.
- You completed the switch apps gesture.
+ You completed the switch apps gesture
Swipe to switch apps
@@ -158,6 +163,11 @@
To switch between apps, swipe up with 2 fingers from the bottom of your screen, hold, then release.
Switch apps
+
+ Swipe up from the bottom of your screen, hold, then release
+
+ Well done!
+
Tutorial: Assistant
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
index c7cd39c100..a8d7538687 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
@@ -94,8 +94,12 @@ public class QuickstepAtomicAnimationFactory extends
@Override
public void prepareForAtomicAnimation(LauncherState fromState, LauncherState toState,
StateAnimationConfig config) {
+
RecentsView overview = mActivity.getOverviewPanel();
if ((fromState == OVERVIEW || fromState == OVERVIEW_SPLIT_SELECT) && toState == NORMAL) {
+ overview.switchToScreenshot(() ->
+ overview.finishRecentsAnimation(true /* toRecents */, null));
+
if (fromState == OVERVIEW_SPLIT_SELECT) {
config.setInterpolator(ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN,
clampToProgress(EMPHASIZED_ACCELERATE, 0, 0.4f));
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java
index 6becf0f07e..395833ffea 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchController.java
@@ -30,8 +30,6 @@ import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManager;
-import androidx.annotation.VisibleForTesting;
-
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
@@ -52,13 +50,12 @@ public class StatusBarTouchController implements TouchController {
private final Launcher mLauncher;
private final SystemUiProxy mSystemUiProxy;
- @VisibleForTesting final float mTouchSlop;
+ private final float mTouchSlop;
private int mLastAction;
private final SparseArray mDownEvents;
/* If {@code false}, this controller should not handle the input {@link MotionEvent}.*/
- @VisibleForTesting
- boolean mCanIntercept;
+ private boolean mCanIntercept;
public StatusBarTouchController(Launcher l) {
mLauncher = l;
@@ -85,9 +82,9 @@ public class StatusBarTouchController implements TouchController {
@Override
public final boolean onControllerInterceptTouchEvent(MotionEvent ev) {
- final int action = ev.getActionMasked();
- final int idx = ev.getActionIndex();
- final int pid = ev.getPointerId(idx);
+ int action = ev.getActionMasked();
+ int idx = ev.getActionIndex();
+ int pid = ev.getPointerId(idx);
if (action == ACTION_DOWN) {
mCanIntercept = canInterceptTouch(ev);
if (!mCanIntercept) {
@@ -95,14 +92,14 @@ public class StatusBarTouchController implements TouchController {
}
mDownEvents.clear();
mDownEvents.put(pid, new PointF(ev.getX(), ev.getY()));
- } else if (action == MotionEvent.ACTION_POINTER_DOWN) {
+ } else if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
// Check!! should only set it only when threshold is not entered.
mDownEvents.put(pid, new PointF(ev.getX(idx), ev.getY(idx)));
}
if (!mCanIntercept) {
return false;
}
- if (action == ACTION_MOVE && mDownEvents.contains(pid)) {
+ if (action == ACTION_MOVE) {
float dy = ev.getY(idx) - mDownEvents.get(pid).y;
float dx = ev.getX(idx) - mDownEvents.get(pid).x;
// Currently input dispatcher will not do touch transfer if there are more than
@@ -129,6 +126,7 @@ public class StatusBarTouchController implements TouchController {
mLauncher.getStatsLogManager().logger()
.log(LAUNCHER_SWIPE_DOWN_WORKSPACE_NOTISHADE_OPEN);
setWindowSlippery(false);
+ return true;
}
return true;
}
@@ -142,8 +140,7 @@ public class StatusBarTouchController implements TouchController {
* Touches can slide out of the window but they cannot necessarily slide
* back in (unless the other window with touch focus permits it).
*/
- @VisibleForTesting
- void setWindowSlippery(boolean enable) {
+ private void setWindowSlippery(boolean enable) {
Window w = mLauncher.getWindow();
WindowManager.LayoutParams wlp = w.getAttributes();
if (enable) {
diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
index 9083d514d3..5d2527973e 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
@@ -66,7 +66,9 @@ final class BackGestureTutorialController extends TutorialController {
@Override
public int getIntroductionSubtitle() {
- return R.string.back_gesture_intro_subtitle;
+ return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
+ ? R.string.back_gesture_tutorial_subtitle
+ : R.string.back_gesture_intro_subtitle;
}
@Override
@@ -74,6 +76,11 @@ final class BackGestureTutorialController extends TutorialController {
return R.string.back_gesture_spoken_intro_subtitle;
}
+ @Override
+ public int getSuccessFeedbackTitle() {
+ return R.string.gesture_tutorial_nice;
+ }
+
@Override
public int getSuccessFeedbackSubtitle() {
return mTutorialFragment.isAtFinalStep()
diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
index 333ecbbb2c..bce8b985af 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
@@ -73,6 +73,13 @@ final class HomeGestureTutorialController extends SwipeUpGestureTutorialControll
return R.string.home_gesture_spoken_intro_subtitle;
}
+ @Override
+ public int getSuccessFeedbackTitle() {
+ return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
+ ? R.string.home_gesture_tutorial_success
+ : R.string.gesture_tutorial_nice;
+ }
+
@Override
public int getSuccessFeedbackSubtitle() {
return mTutorialFragment.isAtFinalStep()
diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
index 09a6bbe6b2..454dd17f37 100644
--- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
@@ -77,7 +77,9 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont
@Override
public int getIntroductionSubtitle() {
- return R.string.overview_gesture_intro_subtitle;
+ return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
+ ? R.string.overview_gesture_tutorial_subtitle
+ : R.string.overview_gesture_intro_subtitle;
}
@Override
@@ -85,6 +87,13 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont
return R.string.overview_gesture_spoken_intro_subtitle;
}
+ @Override
+ public int getSuccessFeedbackTitle() {
+ return ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()
+ ? R.string.overview_gesture_tutorial_success
+ : R.string.gesture_tutorial_nice;
+ }
+
@Override
public int getSuccessFeedbackSubtitle() {
return mTutorialFragment.getNumSteps() > 1 && mTutorialFragment.isAtFinalStep()
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
index a58f4538c8..16fe2d3d4d 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
@@ -30,6 +30,7 @@ import android.annotation.RawRes;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
+import android.graphics.Matrix;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -67,6 +68,7 @@ import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttem
import com.android.systemui.shared.system.QuickStepContract;
import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieComposition;
import java.util.ArrayList;
@@ -175,6 +177,8 @@ abstract class TutorialController implements BackGestureAttemptCallback,
mExitingAppStartingCornerRadius = QuickStepContract.getWindowCornerRadius(mContext);
mExitingAppEndingCornerRadius = mContext.getResources().getDimensionPixelSize(
R.dimen.gesture_tutorial_back_gesture_end_corner_radius);
+ mAnimatedGestureDemonstration.addLottieOnCompositionLoadedListener(
+ this::createScalingMatrix);
mFeedbackTitleView.setText(getIntroductionTitle());
mFeedbackSubtitleView.setText(getIntroductionSubtitle());
@@ -214,6 +218,24 @@ abstract class TutorialController implements BackGestureAttemptCallback,
};
}
+ /** Scale the Lottie gesture animation to fit the device based on device dimensions */
+ private void createScalingMatrix(LottieComposition composition) {
+ Rect animationBoundsRect = composition.getBounds();
+ if (animationBoundsRect == null) {
+ mAnimatedGestureDemonstration.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ return;
+ }
+ Matrix scaleMatrix = new Matrix();
+ float pivotX = mScreenWidth / 2f;
+ float pivotY = mScreenHeight;
+ float scaleFactor = mScreenWidth / animationBoundsRect.width();
+
+ scaleMatrix.postScale(scaleFactor, scaleFactor, pivotX, pivotY);
+ scaleMatrix.postTranslate(0,
+ mTutorialFragment.getDeviceProfile().heightPx - animationBoundsRect.height());
+ mAnimatedGestureDemonstration.setImageMatrix(scaleMatrix);
+ }
+
private void showSkipTutorialDialog() {
if (mSkipTutorialDialog != null) {
mSkipTutorialDialog.show();
@@ -321,6 +343,11 @@ abstract class TutorialController implements BackGestureAttemptCallback,
return NO_ID;
}
+ @StringRes
+ public int getSuccessFeedbackTitle() {
+ return NO_ID;
+ }
+
@StyleRes
public int getTitleTextAppearance() {
return NO_ID;
@@ -392,7 +419,7 @@ abstract class TutorialController implements BackGestureAttemptCallback,
void showFeedback(int subtitleResId, boolean isGestureSuccessful) {
showFeedback(
isGestureSuccessful
- ? R.string.gesture_tutorial_nice : R.string.gesture_tutorial_try_again,
+ ? getSuccessFeedbackTitle() : R.string.gesture_tutorial_try_again,
subtitleResId,
NO_ID,
isGestureSuccessful,
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 6d78364f71..0a31a62aaf 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -4100,14 +4100,6 @@ public abstract class RecentsView {
- TransformParams params = remoteTargetHandle.getTransformParams();
- params.setTargetAlpha(mContentAlpha);
- if (params.getTargetSet() != null) {
- remoteTargetHandle.getTaskViewSimulator().apply(params);
- }
- });
-
int runningTaskId = getTaskIdsForRunningTaskView()[0];
for (int i = getTaskViewCount() - 1; i >= 0; i--) {
TaskView child = requireTaskViewAt(i);
diff --git a/quickstep/tests/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchControllerTest.kt b/quickstep/tests/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchControllerTest.kt
deleted file mode 100644
index b2f13c7c65..0000000000
--- a/quickstep/tests/src/com/android/launcher3/uioverrides/touchcontrollers/StatusBarTouchControllerTest.kt
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 202 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.uioverrides.touchcontrollers
-
-import android.view.MotionEvent
-import android.view.WindowManager
-import androidx.test.filters.SmallTest
-import androidx.test.runner.AndroidJUnit4
-import com.android.launcher3.Launcher
-import com.android.launcher3.ui.AbstractLauncherUiTest
-import com.android.launcher3.ui.TaplTestsLauncher3
-import junit.framework.Assert.assertEquals
-import junit.framework.Assert.assertFalse
-import junit.framework.Assert.assertTrue
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class StatusBarTouchControllerTest : AbstractLauncherUiTest() {
- @Before
- @Throws(Exception::class)
- fun setup() {
- TaplTestsLauncher3.initialize(this)
- }
-
- @Test
- fun interceptActionDown_canIntercept() {
- executeOnLauncher { launcher: Launcher? ->
- val underTest = StatusBarTouchController(launcher)
- assertFalse(underTest.mCanIntercept)
- val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
-
- underTest.onControllerInterceptTouchEvent(downEvent)
-
- assertTrue(underTest.mCanIntercept)
- }
- }
-
- @Test
- fun interceptActionMove_handledAndSetSlippery() {
- executeOnLauncher { launcher: Launcher ->
- val underTest = StatusBarTouchController(launcher)
- val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- underTest.onControllerInterceptTouchEvent(downEvent)
- val w = launcher.window
- assertEquals(0, w.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY)
- val moveEvent =
- MotionEvent.obtain(
- 2,
- 2,
- MotionEvent.ACTION_MOVE,
- underTest.mTouchSlop,
- underTest.mTouchSlop + 10,
- 0
- )
-
- val handled = underTest.onControllerInterceptTouchEvent(moveEvent)
-
- assertTrue(handled)
- assertEquals(
- WindowManager.LayoutParams.FLAG_SLIPPERY,
- w.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
- )
- }
- }
-
- @Test
- fun interceptActionMove_not_handled() {
- executeOnLauncher { launcher: Launcher? ->
- val underTest = StatusBarTouchController(launcher)
- val downEvent = MotionEvent.obtain(1, 1, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- underTest.onControllerInterceptTouchEvent(downEvent)
- val moveEvent =
- MotionEvent.obtain(
- 2,
- 2,
- MotionEvent.ACTION_MOVE,
- underTest.mTouchSlop + 10,
- underTest.mTouchSlop,
- 0
- )
-
- val handled = underTest.onControllerInterceptTouchEvent(moveEvent)
-
- assertFalse(handled)
- }
- }
-
- @Test
- fun interceptActionMoveAsFirstGestureEvent_notCrashedNorHandled() {
- executeOnLauncher { launcher: Launcher? ->
- val underTest = StatusBarTouchController(launcher)
- underTest.mCanIntercept = true
- val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_MOVE, 10f, 10f, 0)
-
- val handled = underTest.onControllerInterceptTouchEvent(moveEvent)
-
- assertFalse(handled)
- }
- }
-
- @Test
- fun handleActionUp_setNotSlippery() {
- executeOnLauncher { launcher: Launcher ->
- val underTest = StatusBarTouchController(launcher)
- underTest.mCanIntercept = true
- underTest.setWindowSlippery(true)
- val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_UP, 10f, 10f, 0)
-
- val handled = underTest.onControllerTouchEvent(moveEvent)
-
- assertTrue(handled)
- assertEquals(
- 0,
- launcher.window.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
- )
- }
- }
-
- @Test
- fun handleActionCancel_setNotSlippery() {
- executeOnLauncher { launcher: Launcher ->
- val underTest = StatusBarTouchController(launcher)
- underTest.mCanIntercept = true
- underTest.setWindowSlippery(true)
- val moveEvent = MotionEvent.obtain(2, 2, MotionEvent.ACTION_CANCEL, 10f, 10f, 0)
-
- val handled = underTest.onControllerTouchEvent(moveEvent)
-
- assertTrue(handled)
- assertEquals(
- 0,
- launcher.window.attributes.flags and WindowManager.LayoutParams.FLAG_SLIPPERY
- )
- }
- }
-}
diff --git a/res/color-night-v31/material_color_surface.xml b/res/color-night-v31/material_color_surface.xml
new file mode 100644
index 0000000000..a645f24dd9
--- /dev/null
+++ b/res/color-night-v31/material_color_surface.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_bright.xml b/res/color-night-v31/material_color_surface_bright.xml
new file mode 100644
index 0000000000..f34ed6c548
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_bright.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_container.xml b/res/color-night-v31/material_color_surface_container.xml
new file mode 100644
index 0000000000..002b88eba4
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_container.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_container_high.xml b/res/color-night-v31/material_color_surface_container_high.xml
new file mode 100644
index 0000000000..002b88eba4
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_container_high.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_container_highest.xml b/res/color-night-v31/material_color_surface_container_highest.xml
new file mode 100644
index 0000000000..002b88eba4
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_container_highest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_container_low.xml b/res/color-night-v31/material_color_surface_container_low.xml
new file mode 100644
index 0000000000..002b88eba4
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_container_low.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_container_lowest.xml b/res/color-night-v31/material_color_surface_container_lowest.xml
new file mode 100644
index 0000000000..002b88eba4
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_container_lowest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_dim.xml b/res/color-night-v31/material_color_surface_dim.xml
new file mode 100644
index 0000000000..a645f24dd9
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_dim.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_inverse.xml b/res/color-night-v31/material_color_surface_inverse.xml
new file mode 100644
index 0000000000..ac63072a9e
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_inverse.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/material_color_surface_variant.xml b/res/color-night-v31/material_color_surface_variant.xml
new file mode 100644
index 0000000000..a645f24dd9
--- /dev/null
+++ b/res/color-night-v31/material_color_surface_variant.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-night-v31/surface.xml b/res/color-night-v31/surface.xml
deleted file mode 100644
index fbc9e43828..0000000000
--- a/res/color-night-v31/surface.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
diff --git a/res/color-v31/material_color_surface.xml b/res/color-v31/material_color_surface.xml
new file mode 100644
index 0000000000..b049851ff4
--- /dev/null
+++ b/res/color-v31/material_color_surface.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_bright.xml b/res/color-v31/material_color_surface_bright.xml
new file mode 100644
index 0000000000..b049851ff4
--- /dev/null
+++ b/res/color-v31/material_color_surface_bright.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_container.xml b/res/color-v31/material_color_surface_container.xml
new file mode 100644
index 0000000000..b031c081a9
--- /dev/null
+++ b/res/color-v31/material_color_surface_container.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_container_high.xml b/res/color-v31/material_color_surface_container_high.xml
new file mode 100644
index 0000000000..b031c081a9
--- /dev/null
+++ b/res/color-v31/material_color_surface_container_high.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_container_highest.xml b/res/color-v31/material_color_surface_container_highest.xml
new file mode 100644
index 0000000000..b031c081a9
--- /dev/null
+++ b/res/color-v31/material_color_surface_container_highest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_container_low.xml b/res/color-v31/material_color_surface_container_low.xml
new file mode 100644
index 0000000000..b031c081a9
--- /dev/null
+++ b/res/color-v31/material_color_surface_container_low.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_container_lowest.xml b/res/color-v31/material_color_surface_container_lowest.xml
new file mode 100644
index 0000000000..674fc73270
--- /dev/null
+++ b/res/color-v31/material_color_surface_container_lowest.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_dim.xml b/res/color-v31/material_color_surface_dim.xml
new file mode 100644
index 0000000000..e2d226fa89
--- /dev/null
+++ b/res/color-v31/material_color_surface_dim.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_inverse.xml b/res/color-v31/material_color_surface_inverse.xml
new file mode 100644
index 0000000000..e189862856
--- /dev/null
+++ b/res/color-v31/material_color_surface_inverse.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/material_color_surface_variant.xml b/res/color-v31/material_color_surface_variant.xml
new file mode 100644
index 0000000000..e2d226fa89
--- /dev/null
+++ b/res/color-v31/material_color_surface_variant.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/res/color-v31/surface.xml b/res/color-v31/surface.xml
index 30f3032541..da4571a61c 100644
--- a/res/color-v31/surface.xml
+++ b/res/color-v31/surface.xml
@@ -19,5 +19,6 @@
-->
-
+
+
diff --git a/res/values-night-v31/colors.xml b/res/values-night-v31/colors.xml
index 3453668d12..e462ae0b29 100644
--- a/res/values-night-v31/colors.xml
+++ b/res/values-night-v31/colors.xml
@@ -51,4 +51,39 @@
@android:color/system_accent1_200
@android:color/system_accent1_900
+
+ @android:color/system_accent2_700
+ @android:color/system_accent3_700
+ @android:color/system_accent1_700
+ @android:color/system_accent2_100
+ @android:color/system_accent3_100
+ @android:color/system_accent1_100
+ @android:color/system_accent2_200
+ #FFDAD5
+ @android:color/system_accent2_900
+ @android:color/system_neutral1_900
+ @android:color/system_accent3_200
+ @android:color/system_accent3_900
+ @android:color/system_accent1_200
+ @android:color/system_accent2_700
+ #930001
+ @android:color/system_accent1_900
+ @android:color/system_accent1_600
+ @android:color/system_accent2_100
+ @android:color/system_accent3_700
+ @android:color/system_accent3_100
+ @android:color/system_accent1_700
+ @android:color/system_neutral1_800
+ @android:color/system_accent1_100
+ @android:color/system_accent2_800
+ @android:color/system_accent3_800
+ #690001
+ @android:color/system_neutral2_200
+ @android:color/system_neutral2_400
+ @android:color/system_neutral2_700
+ @android:color/system_accent1_800
+ @android:color/system_neutral1_100
+ @android:color/system_accent1_200
+ @android:color/system_accent2_200
+ @android:color/system_accent3_200
\ No newline at end of file
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
new file mode 100644
index 0000000000..95b3a630ca
--- /dev/null
+++ b/res/values-night/colors.xml
@@ -0,0 +1,64 @@
+
+
+
+ #3F4759
+ #583E5B
+ #0D0E11
+ #2B4678
+ #DBE2F9
+ #FBD7FC
+ #1B1B1F
+ #D8E2FF
+ #BFC6DC
+ #FFDAD5
+ #141B2C
+ #1B1B1F
+ #DEBCDF
+ #29132D
+ #ADC6FF
+ #3F4759
+ #930001
+ #001A41
+ #445E91
+ #DBE2F9
+ #FAF9FD
+ #44474F
+ #583E5B
+ #FBD7FC
+ #2B4678
+ #E3E2E6
+ #D8E2FF
+ #293041
+ #402843
+ #121316
+ #38393C
+ #690001
+ #121316
+ #292A2D
+ #343538
+ #C4C6D0
+ #72747D
+ #444746
+ #102F60
+ #E3E2E6
+ #1F1F23
+ #ADC6FF
+ #BFC6DC
+ #DEBCDF
+
diff --git a/res/values-v31/colors.xml b/res/values-v31/colors.xml
index 4ffff57c99..841e07b263 100644
--- a/res/values-v31/colors.xml
+++ b/res/values-v31/colors.xml
@@ -102,4 +102,40 @@
@android:color/system_accent1_200
@android:color/system_accent1_900
+
+
+ @android:color/system_accent2_700
+ @android:color/system_accent3_700
+ @android:color/system_accent1_700
+ @android:color/system_accent2_900
+ @android:color/system_accent3_900
+ @android:color/system_accent1_900
+ @android:color/system_accent2_200
+ #410000
+ @android:color/system_accent2_900
+ @android:color/system_neutral1_100
+ @android:color/system_accent3_200
+ @android:color/system_accent3_900
+ @android:color/system_accent1_200
+ @android:color/system_accent2_100
+ #FFDAD5
+ @android:color/system_accent1_900
+ @android:color/system_accent1_200
+ @android:color/system_accent2_100
+ @android:color/system_accent3_100
+ @android:color/system_accent3_100
+ @android:color/system_accent1_100
+ @android:color/system_neutral1_50
+ @android:color/system_accent1_100
+ @android:color/system_accent2_0
+ @android:color/system_accent3_0
+ #FFFFFF
+ @android:color/system_neutral2_700
+ @android:color/system_neutral2_500
+ @android:color/system_neutral2_200
+ @android:color/system_accent1_0
+ @android:color/system_neutral1_900
+ @android:color/system_accent1_600
+ @android:color/system_accent2_600
+ @android:color/system_accent3_600
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index b023d10e5d..e4650b28b3 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -506,6 +506,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ad7a10b286..6c3b54c5bf 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -128,4 +128,49 @@
#2D312F
#C4C7C5
#444746
+
+ #3F4759
+ #583E5B
+ #FFFFFF
+ #2B4678
+ #141B2C
+ #29132D
+ #F5F3F7
+ #001A41
+ #BFC6DC
+ #410000
+ #141B2C
+ #E3E2E6
+ #DEBCDF
+ #29132D
+ #ADC6FF
+ #DBE2F9
+ #FFDAD5
+ #001A41
+ #ADC6FF
+ #DBE2F9
+ #121316
+ #E1E2EC
+ #FBD7FC
+ #FBD7FC
+ #D8E2FF
+ #1B1B1F
+ #D8E2FF
+ #FFFFFF
+ #FFFFFF
+ #DBD9DD
+ #FAF9FD
+ #FFFFFF
+ #FAF9FD
+ #E9E7EC
+ #E3E2E6
+ #44474F
+ #72747D
+ #C4C7C5
+ #FFFFFF
+ #1B1B1F
+ #EFEDF1
+ #445E91
+ #575E71
+ #715573
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 876c3a868e..c41f0e86e9 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -31,7 +31,7 @@