Merge "Null check on target set before rendering task open animation" into sc-dev
diff --git a/go/quickstep/res/layout/overview_panel.xml b/go/quickstep/res/layout/overview_panel.xml
deleted file mode 100644
index 241b63d..0000000
--- a/go/quickstep/res/layout/overview_panel.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright (C) 2021 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.
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
- <com.android.quickstep.views.LauncherRecentsView
- android:id="@+id/overview_panel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:accessibilityPaneTitle="@string/accessibility_recent_apps"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:background="?attr/overviewBackgroundColor"
- android:visibility="invisible" />
-
- <com.android.quickstep.views.SplitPlaceholderView
- android:id="@+id/split_placeholder"
- android:layout_width="match_parent"
- android:layout_height="@dimen/split_placeholder_size"
- android:background="@android:color/darker_gray"
- android:visibility="gone" />
-
- <include
- android:id="@+id/overview_actions_view"
- layout="@layout/overview_actions_container" />
-
-</merge>
diff --git a/go/quickstep/res/values/attrs.xml b/go/quickstep/res/values/attrs.xml
index 3adf462..03eab50 100644
--- a/go/quickstep/res/values/attrs.xml
+++ b/go/quickstep/res/values/attrs.xml
@@ -16,7 +16,6 @@
-->
<resources>
<!-- Attributes used for Overview theming -->
- <attr name="overviewBackgroundColor" format="color" />
<attr name="overviewButtonTextColor" format="color" />
<attr name="overviewButtonIconColor" format="color" />
<attr name="overviewButtonBackgroundColor" format="color" />
diff --git a/go/quickstep/res/values/colors.xml b/go/quickstep/res/values/colors.xml
index f815f54..ae72ef6 100644
--- a/go/quickstep/res/values/colors.xml
+++ b/go/quickstep/res/values/colors.xml
@@ -16,10 +16,8 @@
-->
<resources>
<!-- Overview -->
- <color name="go_overview_background_color">#DADADA</color>
- <color name="go_overview_background_color_dark">#000000</color>
<color name="go_overview_text_color">#3C4043</color>
<color name="go_overview_text_color_dark">#F8F9FA</color>
<color name="go_overview_button_color">#70FFFFFF</color>
- <color name="go_overview_button_color_dark">#303030</color>
+ <color name="go_overview_button_color_dark">#474747</color>
</resources>
diff --git a/go/quickstep/res/values/styles.xml b/go/quickstep/res/values/styles.xml
index 59f7377..ffe8f46 100644
--- a/go/quickstep/res/values/styles.xml
+++ b/go/quickstep/res/values/styles.xml
@@ -17,14 +17,12 @@
<resources>
<!-- App themes -->
<style name="AppTheme" parent="@style/LauncherTheme">
- <item name="overviewBackgroundColor">@color/go_overview_background_color</item>
<item name="overviewButtonTextColor">@color/go_overview_text_color</item>
<item name="overviewButtonIconColor">@color/go_overview_text_color</item>
<item name="overviewButtonBackgroundColor">@color/go_overview_button_color</item>
</style>
<style name="AppTheme.Dark" parent="@style/LauncherTheme.Dark">
- <item name="overviewBackgroundColor">@color/go_overview_background_color_dark</item>
<item name="overviewButtonTextColor">@color/go_overview_text_color_dark</item>
<item name="overviewButtonIconColor">@color/go_overview_text_color_dark</item>
<item name="overviewButtonBackgroundColor">@color/go_overview_button_color_dark</item>
diff --git a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
index 3a6e9b5..b823c36 100644
--- a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
+++ b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
@@ -51,7 +51,8 @@
public static final String ACTIONS_URL = "niu_actions_app_url";
public static final String ACTIONS_APP_PACKAGE = "niu_actions_app_package";
public static final String ACTIONS_ERROR_CODE = "niu_actions_app_error_code";
- public static final int ERROR_PERMISSIONS = 1;
+ public static final int ERROR_PERMISSIONS_STRUCTURE = 1;
+ public static final int ERROR_PERMISSIONS_SCREENSHOT = 2;
private static final String TAG = "TaskOverlayFactoryGo";
private AssistContentRequester mContentRequester;
@@ -75,7 +76,8 @@
private String mNIUPackageName;
private String mTaskPackageName;
private String mWebUrl;
- private boolean mAssistPermissionsEnabled;
+ private boolean mAssistStructurePermitted;
+ private boolean mAssistScreenshotPermitted;
private AssistContentRequester mFactoryContentRequester;
private TaskOverlayGo(TaskThumbnailView taskThumbnailView,
@@ -104,7 +106,7 @@
getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
mTaskPackageName = task.key.getPackageName();
- if (!mAssistPermissionsEnabled) {
+ if (!mAssistStructurePermitted || !mAssistScreenshotPermitted) {
return;
}
@@ -131,10 +133,14 @@
private void sendNIUIntent(String actionType) {
Intent intent = createNIUIntent(actionType);
// Only add and send the image if the appropriate permissions are held
- if (mAssistPermissionsEnabled) {
+ if (mAssistStructurePermitted && mAssistScreenshotPermitted) {
mImageApi.shareAsDataWithExplicitIntent(/* crop */ null, intent);
} else {
- intent.putExtra(ACTIONS_ERROR_CODE, ERROR_PERMISSIONS);
+ // If both permissions are disabled, the structure error code takes priority
+ // The user must enable that one before they can enable screenshots
+ int code = mAssistStructurePermitted ? ERROR_PERMISSIONS_SCREENSHOT
+ : ERROR_PERMISSIONS_STRUCTURE;
+ intent.putExtra(ACTIONS_ERROR_CODE, code);
try {
mApplicationContext.startActivity(intent);
} catch (ActivityNotFoundException e) {
@@ -164,11 +170,10 @@
@VisibleForTesting
public void checkSettings() {
ContentResolver contentResolver = mApplicationContext.getContentResolver();
- boolean structureEnabled = Settings.Secure.getInt(contentResolver,
+ mAssistStructurePermitted = Settings.Secure.getInt(contentResolver,
Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1) != 0;
- boolean screenshotEnabled = Settings.Secure.getInt(contentResolver,
+ mAssistScreenshotPermitted = Settings.Secure.getInt(contentResolver,
Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1) != 0;
- mAssistPermissionsEnabled = structureEnabled && screenshotEnabled;
String assistantPackage =
Settings.Secure.getString(contentResolver, Settings.Secure.ASSISTANT);
diff --git a/quickstep/res/drawable/ic_all_set.xml b/quickstep/res/drawable/ic_all_set.xml
index a6852aa..656c596 100644
--- a/quickstep/res/drawable/ic_all_set.xml
+++ b/quickstep/res/drawable/ic_all_set.xml
@@ -15,10 +15,10 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="42dp"
- android:height="40dp"
+ android:height="42dp"
android:viewportWidth="42"
- android:viewportHeight="40">
+ android:viewportHeight="42">
<path
- android:pathData="M38,14H25.38L27.28,4.86L27.34,4.22C27.34,3.4 27,2.64 26.46,2.1L24.34,0C24.34,0 10.16,13.7 10,14H0V40H32C33.66,40 35.08,39 35.68,37.56L41.72,23.46C41.9,23 42,22.52 42,22V18C42,15.8 40.2,14 38,14ZM10,36H4V18H10V36ZM38,22L32,36H14V16L22.68,7.32L20,18H38V22Z"
+ android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"
android:fillColor="#FFFFFF"/>
</vector>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 31cf51c..dd248e4 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -497,8 +497,6 @@
view -> viewsToAnimate.add(((CellLayout) view).getShortcutsAndWidgets()));
viewsToAnimate.add(mLauncher.getHotseat());
- // Add QSB
- viewsToAnimate.add(mLauncher.findViewById(R.id.search_container_all_apps));
viewsToAnimate.forEach(view -> {
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
diff --git a/quickstep/src/com/android/launcher3/WrappedLauncherAnimationRunner.java b/quickstep/src/com/android/launcher3/WrappedLauncherAnimationRunner.java
index e319275..fcf9857 100644
--- a/quickstep/src/com/android/launcher3/WrappedLauncherAnimationRunner.java
+++ b/quickstep/src/com/android/launcher3/WrappedLauncherAnimationRunner.java
@@ -58,6 +58,8 @@
if (animationRunnerImpl != null) {
animationRunnerImpl.onCreateAnimation(transit, appTargets, wallpaperTargets,
nonAppTargets, result);
+ } else {
+ result.setAnimation(null, null);
}
}
}
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
index 5b4e5f2..e6333d1 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
+++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
@@ -161,14 +161,14 @@
if (mSurface != surface) {
mSurface = surface;
if (surface != null) {
- dispatchTransactionSurface(mDepth);
+ dispatchTransactionSurface();
}
}
}
@Override
public void setState(LauncherState toState) {
- if (mSurface == null || mIgnoreStateChangesDuringMultiWindowAnimation) {
+ if (mIgnoreStateChangesDuringMultiWindowAnimation) {
return;
}
@@ -176,7 +176,7 @@
if (Float.compare(mDepth, toDepth) != 0) {
setDepth(toDepth);
} else if (toState == LauncherState.OVERVIEW) {
- dispatchTransactionSurface(mDepth);
+ dispatchTransactionSurface();
}
}
@@ -202,35 +202,30 @@
if (Float.compare(mDepth, depthF) == 0) {
return;
}
- if (dispatchTransactionSurface(depthF)) {
- mDepth = depthF;
- }
+ mDepth = depthF;
+ dispatchTransactionSurface();
}
- private boolean dispatchTransactionSurface(float depth) {
+ private void dispatchTransactionSurface() {
boolean supportsBlur = BlurUtils.supportsBlursOnWindows();
- if (supportsBlur && (mSurface == null || !mSurface.isValid())) {
- return false;
- }
ensureDependencies();
IBinder windowToken = mLauncher.getRootView().getWindowToken();
if (windowToken != null) {
- mWallpaperManager.setWallpaperZoomOut(windowToken, depth);
+ mWallpaperManager.setWallpaperZoomOut(windowToken, mDepth);
}
- if (supportsBlur) {
+ if (supportsBlur && (mSurface != null && mSurface.isValid())) {
// We cannot mark the window as opaque in overview because there will be an app window
// below the launcher layer, and we need to draw it -- without blurs.
boolean isOverview = mLauncher.isInState(LauncherState.OVERVIEW);
boolean opaque = mLauncher.getScrimView().isFullyOpaque() && !isOverview;
- int blur = opaque || isOverview ? 0 : (int) (depth * mMaxBlurRadius);
+ int blur = opaque || isOverview ? 0 : (int) (mDepth * mMaxBlurRadius);
new SurfaceControl.Transaction()
.setBackgroundBlurRadius(mSurface, blur)
.setOpaque(mSurface, opaque)
.apply();
}
- return true;
}
@Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
index eb524a9..0e2fbbc 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
@@ -86,7 +86,7 @@
StateAnimationConfig config) {
RecentsView overview = mActivity.getOverviewPanel();
if (toState == NORMAL && fromState == OVERVIEW) {
- config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, DEACCEL);
+ config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, clampToProgress(LINEAR, 0, 0.25f));
config.setInterpolator(ANIM_SCRIM_FADE, LINEAR);
config.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL);
config.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL);
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index e52405b..c9b68df 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -813,7 +813,13 @@
}
private void reset() {
- mConsumer = mUncheckedConsumer = mResetGestureInputConsumer;
+ if (mResetGestureInputConsumer != null) {
+ mConsumer = mUncheckedConsumer = mResetGestureInputConsumer;
+ } else {
+ // mResetGestureInputConsumer isn't initialized until onUserUnlocked(), so reset to
+ // NO_OP until then (we never want these to be null).
+ mConsumer = mUncheckedConsumer = InputConsumer.NO_OP;
+ }
mGestureState = DEFAULT_STATE;
// By default, use batching of the input events, but check receiver before using in the rare
// case that the monitor was disposed before the swipe settled
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/AssistantInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/AssistantInputConsumer.java
index a3cd7df..510820a 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/AssistantInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/AssistantInputConsumer.java
@@ -26,6 +26,8 @@
import static com.android.launcher3.Utilities.squaredHypot;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
@@ -199,6 +201,14 @@
float progress = (float) valueAnimator.getAnimatedValue();
SystemUiProxy.INSTANCE.get(mContext).onAssistantProgress(progress);
});
+ // Ensure that we always send a zero at the end to clear the invocation state.
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ SystemUiProxy.INSTANCE.get(mContext).onAssistantProgress(0f);
+ }
+ });
animator.setInterpolator(Interpolators.DEACCEL_2);
animator.start();
}
diff --git a/quickstep/src/com/android/quickstep/util/WorkspaceRevealAnim.java b/quickstep/src/com/android/quickstep/util/WorkspaceRevealAnim.java
index 50da93b..df94d0b 100644
--- a/quickstep/src/com/android/quickstep/util/WorkspaceRevealAnim.java
+++ b/quickstep/src/com/android/quickstep/util/WorkspaceRevealAnim.java
@@ -24,6 +24,7 @@
import static com.android.launcher3.states.StateAnimationConfig.SKIP_SCRIM;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.view.View;
@@ -98,6 +99,14 @@
alpha.setDuration(DURATION_MS);
alpha.setInterpolator(Interpolators.DECELERATED_EASE);
mAnimators.play(alpha);
+
+ mAnimators.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ SCALE_PROPERTY.set(v, 1f);
+ v.setAlpha(1f);
+ }
+ });
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index df7f8b5..8c3e5b5 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -2245,7 +2245,7 @@
public PendingAnimation createTaskDismissAnimation(TaskView taskView, boolean animateTaskView,
boolean shouldRemoveTask, long duration) {
if (mPendingAnimation != null) {
- mPendingAnimation.createPlaybackController().dispatchOnCancel();
+ mPendingAnimation.createPlaybackController().dispatchOnCancel().dispatchOnEnd();
}
PendingAnimation anim = new PendingAnimation(duration);
diff --git a/res/color-night-v31/all_apps_tabs_background.xml b/res/color-night-v31/all_apps_tabs_background.xml
deleted file mode 100644
index b396f33..0000000
--- a/res/color-night-v31/all_apps_tabs_background.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@android:color/system_neutral2_100"/>
-</selector>
\ No newline at end of file
diff --git a/res/color-night/all_apps_tabs_background.xml b/res/color-night/all_apps_tabs_background.xml
deleted file mode 100644
index c0c1621..0000000
--- a/res/color-night/all_apps_tabs_background.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 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.
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="#E2E2E2"/>
-</selector>
\ No newline at end of file
diff --git a/res/drawable/all_apps_tabs_background.xml b/res/drawable/all_apps_tabs_background.xml
index 4e95315..bf7ee8c 100644
--- a/res/drawable/all_apps_tabs_background.xml
+++ b/res/drawable/all_apps_tabs_background.xml
@@ -13,13 +13,27 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="500">
<item
- android:top="@dimen/all_apps_tabs_vertical_padding"
- android:bottom="@dimen/all_apps_tabs_vertical_padding">
+ android:id="@+id/unselected"
+ android:state_selected="false">
+ <ripple android:color="@color/all_apps_tab_background_selected">
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
+ <solid android:color="@color/all_apps_tabs_background" />
+ </shape>
+ </item>
+ </ripple>
+ </item>
+
+ <item
+ android:id="@+id/selected"
+ android:state_selected="true">
<shape android:shape="rectangle">
- <solid android:color="@color/all_apps_tabs_background" />
<corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
+ <solid android:color="@color/all_apps_tab_background_selected" />
</shape>
</item>
-</layer-list>
\ No newline at end of file
+</selector>
\ No newline at end of file
diff --git a/res/drawable/notification_circle.xml b/res/drawable/notification_circle.xml
new file mode 100644
index 0000000..65fbaea
--- /dev/null
+++ b/res/drawable/notification_circle.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+
+ <solid android:color="?attr/popupNotificationDotColor"/>
+
+ <size
+ android:width="@dimen/notification_circle_icon_size"
+ android:height="@dimen/notification_circle_icon_size"/>
+</shape>
\ No newline at end of file
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index cfaa261..11143fb 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -14,12 +14,12 @@
~ limitations under the License.
-->
-<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabs"
- android:layout_width="@dimen/all_apps_header_pills_width"
+ android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
android:layout_gravity="center_horizontal"
- android:background="@drawable/all_apps_tabs_background"
android:orientation="horizontal"
style="@style/TextHeadline">
@@ -27,19 +27,25 @@
android:id="@+id/tab_personal"
android:layout_width="0dp"
android:layout_height="match_parent"
+ android:layout_marginEnd="@dimen/all_apps_tabs_button_horizontal_padding"
+ android:layout_marginVertical="@dimen/all_apps_tabs_vertical_padding"
android:layout_weight="1"
- android:background="@drawable/personal_work_tabs_ripple"
+ android:background="@drawable/all_apps_tabs_background"
android:text="@string/all_apps_personal_tab"
android:textColor="@color/all_apps_tab_text"
- android:textSize="14sp" />
+ android:textSize="14sp"
+ style="?android:attr/borderlessButtonStyle" />
<Button
android:id="@+id/tab_work"
android:layout_width="0dp"
android:layout_height="match_parent"
+ android:layout_marginStart="@dimen/all_apps_tabs_button_horizontal_padding"
+ android:layout_marginVertical="@dimen/all_apps_tabs_vertical_padding"
android:layout_weight="1"
- android:background="@drawable/personal_work_tabs_ripple"
+ android:background="@drawable/all_apps_tabs_background"
android:text="@string/all_apps_work_tab"
android:textColor="@color/all_apps_tab_text"
- android:textSize="14sp" />
+ android:textSize="14sp"
+ style="?android:attr/borderlessButtonStyle" />
</com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip>
\ No newline at end of file
diff --git a/res/layout/notification_content.xml b/res/layout/notification_content.xml
index 147aa30..84822a6 100644
--- a/res/layout/notification_content.xml
+++ b/res/layout/notification_content.xml
@@ -23,35 +23,36 @@
<FrameLayout
android:id="@+id/header"
android:layout_width="match_parent"
- android:layout_height="@dimen/notification_header_height"
- android:paddingEnd="@dimen/notification_padding_end"
- android:paddingStart="@dimen/notification_padding_start">
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/notification_padding"
+ android:paddingStart="@dimen/notification_padding">
<TextView
android:id="@+id/notification_text"
+ android:paddingTop="@dimen/notification_padding"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="start"
- android:gravity="center_vertical"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|start"
android:text="@string/notifications_header"
android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/notification_header_text_size" />
+ android:textSize="@dimen/notification_header_text_size"
+ style="@style/TextHeadline"/>
<TextView
android:id="@+id/notification_count"
- android:layout_width="@dimen/notification_icon_size"
- android:layout_height="match_parent"
- android:layout_gravity="end"
- android:fontFamily="sans-serif-medium"
+ android:layout_width="@dimen/notification_circle_icon_size"
+ android:layout_height="@dimen/notification_circle_icon_size"
+ android:background="@drawable/notification_circle"
+ android:layout_gravity="bottom|end"
android:gravity="center"
android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/notification_header_count_text_size" />
+ android:textSize="@dimen/notification_header_count_text_size"
+ style="@style/TextHeadline"/>
</FrameLayout>
<!-- Main view -->
<com.android.launcher3.notification.NotificationMainView
android:id="@+id/main_view"
android:layout_width="match_parent"
- android:layout_height="@dimen/notification_main_height"
- android:background="@drawable/bg_notification_content"
+ android:layout_height="wrap_content"
android:focusable="true" >
<LinearLayout
@@ -61,28 +62,28 @@
android:background="?attr/popupColorPrimary"
android:gravity="center_vertical"
android:orientation="vertical"
- android:paddingBottom="14dp"
- android:paddingEnd="@dimen/notification_main_text_padding_end"
- android:paddingStart="@dimen/notification_padding_start">
+ android:paddingTop="@dimen/notification_padding"
+ android:paddingBottom="@dimen/notification_padding"
+ android:paddingEnd="@dimen/notification_padding"
+ android:paddingStart="@dimen/notification_main_text_padding_start">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
- android:fontFamily="sans-serif"
android:lines="1"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/notification_main_title_size" />
+ android:textSize="@dimen/notification_main_title_size"
+ style="@style/TextHeadline" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
- android:fontFamily="sans-serif"
android:lines="1"
- android:textColor="?android:attr/textColorSecondary"
+ android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/notification_main_text_size" />
</LinearLayout>
@@ -90,37 +91,9 @@
android:id="@+id/popup_item_icon"
android:layout_width="@dimen/notification_icon_size"
android:layout_height="@dimen/notification_icon_size"
- android:layout_gravity="center_vertical|end"
- android:layout_marginBottom="7dp"
- android:layout_marginEnd="@dimen/notification_padding_end" />
+ android:layout_gravity="start"
+ android:layout_marginTop="@dimen/notification_padding"
+ android:layout_marginStart="@dimen/notification_icon_padding" />
</com.android.launcher3.notification.NotificationMainView>
-
- <!-- Footer -->
- <com.android.launcher3.notification.NotificationFooterLayout
- android:id="@+id/footer"
- android:layout_width="match_parent"
- android:layout_height="@dimen/notification_footer_height"
- android:layout_gravity="center_vertical"
- android:clipChildren="false">
-
- <LinearLayout
- android:id="@+id/icon_row"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:gravity="end|center_vertical"
- android:orientation="horizontal"
- android:padding="@dimen/notification_footer_icon_row_padding"/>
-
- <View
- android:id="@+id/overflow"
- android:layout_width="@dimen/horizontal_ellipsis_size"
- android:layout_height="@dimen/horizontal_ellipsis_size"
- android:layout_gravity="start|center_vertical"
- android:layout_marginStart="@dimen/horizontal_ellipsis_offset"
- android:background="@drawable/horizontal_ellipsis" />
-
- </com.android.launcher3.notification.NotificationFooterLayout>
</merge>
\ No newline at end of file
diff --git a/res/layout/widgets_full_sheet_search_and_recommendations.xml b/res/layout/widgets_full_sheet_search_and_recommendations.xml
index a89f85f..4a3e20d 100644
--- a/res/layout/widgets_full_sheet_search_and_recommendations.xml
+++ b/res/layout/widgets_full_sheet_search_and_recommendations.xml
@@ -53,7 +53,7 @@
android:id="@+id/recommended_widget_table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginHorizontal="16dp"
+ android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin"
android:layout_marginTop="8dp"
android:background="@drawable/widgets_recommendation_background"
android:paddingVertical="@dimen/recommended_widgets_table_vertical_padding"
diff --git a/res/layout/widgets_list_row_header.xml b/res/layout/widgets_list_row_header.xml
index 0bfa2b2..7f84050 100644
--- a/res/layout/widgets_list_row_header.xml
+++ b/res/layout/widgets_list_row_header.xml
@@ -19,8 +19,7 @@
android:id="@+id/widgets_list_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginHorizontal="16dp"
- android:layout_marginBottom="@dimen/widget_list_entry_bottom_margin"
+ android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin"
android:paddingVertical="@dimen/widget_list_header_view_vertical_padding"
android:orientation="horizontal"
launcher:appIconSize="48dp">
diff --git a/res/layout/widgets_personal_work_tabs.xml b/res/layout/widgets_personal_work_tabs.xml
index 15275a6..532c422 100644
--- a/res/layout/widgets_personal_work_tabs.xml
+++ b/res/layout/widgets_personal_work_tabs.xml
@@ -20,28 +20,34 @@
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
- android:layout_marginHorizontal="32dp"
+ android:gravity="center_horizontal"
android:orientation="horizontal"
- android:background="@drawable/all_apps_tabs_background"
+ android:layout_marginHorizontal="@dimen/widget_tabs_horizontal_margin"
style="@style/TextHeadline">
<Button
android:id="@+id/tab_personal"
android:layout_width="0dp"
android:layout_height="match_parent"
+ android:layout_marginEnd="@dimen/widget_tabs_button_horizontal_padding"
+ android:layout_marginVertical="@dimen/widget_apps_tabs_vertical_padding"
android:layout_weight="1"
- android:background="@drawable/personal_work_tabs_ripple"
+ android:background="@drawable/all_apps_tabs_background"
android:text="@string/widgets_full_sheet_personal_tab"
android:textColor="@color/all_apps_tab_text"
- android:textSize="14sp" />
+ android:textSize="14sp"
+ style="?android:attr/borderlessButtonStyle" />
<Button
android:id="@+id/tab_work"
android:layout_width="0dp"
android:layout_height="match_parent"
+ android:layout_marginEnd="@dimen/widget_tabs_button_horizontal_padding"
+ android:layout_marginVertical="@dimen/widget_apps_tabs_vertical_padding"
android:layout_weight="1"
- android:background="@drawable/personal_work_tabs_ripple"
+ android:background="@drawable/all_apps_tabs_background"
android:text="@string/widgets_full_sheet_work_tab"
android:textColor="@color/all_apps_tab_text"
- android:textSize="14sp" />
+ android:textSize="14sp"
+ style="?android:attr/borderlessButtonStyle" />
</com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip>
\ No newline at end of file
diff --git a/res/layout/widgets_search_bar.xml b/res/layout/widgets_search_bar.xml
index 6a4bb4d..0b354e8 100644
--- a/res/layout/widgets_search_bar.xml
+++ b/res/layout/widgets_search_bar.xml
@@ -6,7 +6,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="24dp"
- android:layout_marginHorizontal="16dp"
+ android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin"
android:background="@drawable/bg_widgets_searchbox">
<com.android.launcher3.ExtendedEditText
diff --git a/res/layout/widgets_table_container.xml b/res/layout/widgets_table_container.xml
index 4f70a05..ab470d8 100644
--- a/res/layout/widgets_table_container.xml
+++ b/res/layout/widgets_table_container.xml
@@ -18,5 +18,4 @@
android:id="@+id/widgets_table"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginHorizontal="16dp"
- android:layout_marginBottom="@dimen/widget_list_entry_bottom_margin"/>
+ android:layout_marginHorizontal="@dimen/widget_list_horizontal_margin" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 7f36dd2..571ad51 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"skryf Tuis-instellings en -kortpaaie"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Laat die program toe om die instellings en kortpaaie in Tuis te verander."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> word nie toegelaat om foonoproepe te maak nie"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Kan nie legstuk laai nie"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tik om opstelling te voltooi"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Dit is \'n stelselprogram en kan nie gedeïnstalleer word nie."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Wysig naam"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Het <xliff:g id="APP_NAME">%1$s</xliff:g> gedeaktiveer"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index ef64624..8ae811f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -158,8 +158,7 @@
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Geschäftlich"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Arbeitsprofil"</string>
- <!-- no translation found for work_profile_edu_work_apps (7895468576497746520) -->
- <skip />
+ <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Geschäftliche Apps sind gekennzeichnet und für deinen IT-Administrator sichtbar"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
<string name="work_apps_paused_title" msgid="3007471013401118920">"Geschäftliche Apps sind deaktiviert"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"Deine geschäftlichen Apps können dir keine Benachrichtigungen senden, deinen Akku nicht nutzen und nicht auf deinen Standort zugreifen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index e9ea0ea..fc7d691 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"εγγραφή ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Επιτρέπει στην εφαρμογή την αλλαγή των ρυθμίσεων και των συντομεύσεων στην Αρχική οθόνη."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν επιτρέπεται να πραγματοποιεί τηλεφωνικές κλήσεις"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Δεν είναι δυνατή η φόρτωση του γραφικού στοιχείου"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Πατήστε για να ολοκληρώσετε τη ρύθμιση"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Αυτή είναι μια εφαρμογή συστήματος και δεν είναι δυνατή η κατάργηση της εγκατάστασής της."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Επεξεργασία ονόματος"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> είναι απενεργοποιημένη"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index c704585..08d032b 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not allowed to make phone calls"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Can\'t load widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tap to finish setup"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edit Name"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Disabled <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index c704585..08d032b 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not allowed to make phone calls"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Can\'t load widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tap to finish setup"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edit Name"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Disabled <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index c704585..08d032b 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not allowed to make phone calls"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Can\'t load widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tap to finish setup"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edit Name"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Disabled <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index c704585..08d032b 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not allowed to make phone calls"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Can\'t load widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tap to finish setup"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edit Name"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Disabled <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 930eb44..7ada105 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> is not allowed to make phone calls"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Can\'t load widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tap to finish setup"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edit Name"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Disabled <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index fbb616a..607d831 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"escribir configuración y accesos directos de la pantalla principal"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que la aplicación cambie la configuración y los accesos directos de la pantalla principal."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> no puede realizar llamadas telefónicas"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"No se puede cargar el widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Presiona para finalizar la configuración"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Esta es una aplicación del sistema y no se puede desinstalar."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Editar nombre"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"Se inhabilitó <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index a8cbded..a03a458 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების ჩაწერა"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების შეცვლის უფლების მიცემა."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს სატელეფონო ზარების განხორციელების უფლება"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"ვიჯეტის ჩატვირთვა ვერ ხერხდება"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"შეეხეთ დაყენების დასასრულებლად"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"ეს სისტემური აპია და მისი წაშლა შეუძლებელია."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"სახელის რედაქტირება"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> გაითიშა"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index c46e732..01dda6d 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -158,8 +158,7 @@
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ಕೆಲಸ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
- <!-- no translation found for work_profile_edu_work_apps (7895468576497746520) -->
- <skip />
+ <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಬ್ಯಾಡ್ಜ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ಅವುಗಳು ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರಿಗೆ ಗೋಚರಿಸುತ್ತವೆ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ಸರಿ"</string>
<string name="work_apps_paused_title" msgid="3007471013401118920">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳು ಆಫ್ ಆಗಿವೆ"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"ನಿಮ್ಮ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಿಗೆ ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸಲು ಅಥವಾ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 4e1cdfb..6a333f7 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -158,8 +158,7 @@
<string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"कार्यालय"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string>
- <!-- no translation found for work_profile_edu_work_apps (7895468576497746520) -->
- <skip />
+ <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"कामाशी संबंधित ॲप्स ही बॅज केलेली असून तुमच्या IT ॲडमिनला दृश्यमान आहेत"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"समजले"</string>
<string name="work_apps_paused_title" msgid="3007471013401118920">"कामाशी संबंधित ॲप्स बंद आहेत"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"तुमचे कामाशी संबंधित ॲप्स तुम्हाला सूचना पाठवू शकत नाहीत, तुमची बॅटरी वापरू शकत नाहीत किंवा तुमचे स्थान अॅक्सेस करू शकत नाहीत"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8fa7c02..a482147 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"instellingen en snelkoppelingen op startscherm zetten"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"De app toestaan de instellingen en snelkoppelingen op de homepage te wijzigen."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> mag niet bellen"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Kan widget niet laden"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Tik om het instellen af te ronden"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Dit is een systeemapp die niet kan worden verwijderd."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Naam bewerken"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> staat uit"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 9ef1ace..461c082 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -158,8 +158,7 @@
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ୱାର୍କ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
- <!-- no translation found for work_profile_edu_work_apps (7895468576497746520) -->
- <skip />
+ <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ୱାର୍କ ଆପଗୁଡ଼ିକୁ ବ୍ୟାଜ୍ କରାଯାଇଛି ଏବଂ ସେଗୁଡ଼ିକ ଆପଣଙ୍କ IT ଆଡମିନଙ୍କୁ ଦୃଶ୍ୟମାନ ହେଉଛି"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ବୁଝିଗଲି"</string>
<string name="work_apps_paused_title" msgid="3007471013401118920">"ୱାର୍କ ଆପଗୁଡ଼ିକ ବନ୍ଦ ଅଛି"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"ଆପଣଙ୍କ ୱାର୍କ ଆପଗୁଡ଼ିକ ଆପଣଙ୍କୁ ବିଜ୍ଞପ୍ତି ପଠାଇପାରିବ ନାହିଁ, ଆପଣଙ୍କ ବ୍ୟାଟେରୀକୁ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ କିମ୍ବା ଆପଣଙ୍କର ଲୋକେସନକୁ ଆକ୍ସେସ୍ କରିପାରିବ ନାହିଁ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index ba3c399..63ec085 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -158,8 +158,7 @@
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ਕੰਮ ਸੰਬੰਧੀ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
- <!-- no translation found for work_profile_edu_work_apps (7895468576497746520) -->
- <skip />
+ <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨੂੰ ਬੈਜ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਇਹ ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਦਿਸਣਗੀਆਂ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ਸਮਝ ਲਿਆ"</string>
<string name="work_apps_paused_title" msgid="3007471013401118920">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਬੰਦ ਹਨ"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"ਤੁਹਾਡੀਆਂ ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀਆਂ, ਤੁਹਾਡੀ ਬੈਟਰੀ ਨਹੀਂ ਵਰਤ ਸਕਦੀਆਂ ਜਾਂ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 2ffb341..11f1f83 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"escrever definições e atalhos do Ecrã principal"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Permite à app alterar as definições e os atalhos no Ecrã Principal."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"O <xliff:g id="APP_NAME">%1$s</xliff:g> não tem autorização para efetuar chamadas telefónicas"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Não é possível carregar o widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Toque para concluir a configuração"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"É uma app de sistema e não pode ser desinstalada."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Edite o nome"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> desativado"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 76a00ae..11779ed 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -82,10 +82,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"gravar configurações e atalhos da tela inicial"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que o app altere as configurações e os atalhos na tela inicial."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"<xliff:g id="APP_NAME">%1$s</xliff:g> não tem permissão para fazer chamadas"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Não é possível carregar o widget"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Toque para concluir a configuração"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Este é um app do sistema e não pode ser desinstalado."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Editar nome"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> desativado"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 29fe67d..d7612df 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -86,10 +86,8 @@
<string name="permlab_write_settings" msgid="3574213698004620587">"записувати налаштування та ярлики головного екрана"</string>
<string name="permdesc_write_settings" msgid="5440712911516509985">"Дозволяє програмі змінювати налаштування та ярлики на головному екрані."</string>
<string name="msg_no_phone_permission" msgid="9208659281529857371">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> не має дозволу телефонувати"</string>
- <!-- no translation found for gadget_error_text (740356548025791839) -->
- <skip />
- <!-- no translation found for gadget_setup_text (1745356155479272374) -->
- <skip />
+ <string name="gadget_error_text" msgid="740356548025791839">"Не вдається завантажити віджет"</string>
+ <string name="gadget_setup_text" msgid="1745356155479272374">"Торкніться, щоб завершити налаштування"</string>
<string name="uninstall_system_app_text" msgid="4172046090762920660">"Це системна програма, її неможливо видалити."</string>
<string name="folder_hint_text" msgid="5174843001373488816">"Редагувати назву"</string>
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> вимкнено"</string>
diff --git a/res/values-v31/colors.xml b/res/values-v31/colors.xml
index 38a0894..1785623 100644
--- a/res/values-v31/colors.xml
+++ b/res/values-v31/colors.xml
@@ -25,6 +25,9 @@
<color name="popup_color_secondary_dark">@android:color/system_neutral1_900</color>
<color name="popup_color_tertiary_dark">@android:color/system_neutral2_700</color>
+ <color name="popup_notification_dot_light">@android:color/system_accent1_100</color>
+ <color name="popup_notification_dot_dark">@android:color/system_accent2_600</color>
+
<color name="workspace_text_color_light">@android:color/system_neutral1_0</color>
<color name="workspace_text_color_dark">@android:color/system_neutral1_1000</color>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 92deb68..1fadc88 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -36,6 +36,7 @@
<attr name="iconOnlyShortcutColor" format="color" />
<attr name="eduHalfSheetBGColor" format="color" />
<attr name="overviewScrimColor" format="color" />
+ <attr name="popupNotificationDotColor" format="color" />
<attr name="folderDotColor" format="color" />
<attr name="folderFillColor" format="color" />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index dac12ed..01f5364 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -53,6 +53,9 @@
<color name="popup_color_secondary_dark">#202124</color>
<color name="popup_color_tertiary_dark">#757575</color> <!-- Gray 600 -->
+ <color name="popup_notification_dot_light">#FFF</color>
+ <color name="popup_notification_dot_dark">#757575</color>
+
<color name="workspace_text_color_light">#FFF</color>
<color name="workspace_text_color_dark">#FF000000</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9048d87..bc63c06 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -93,14 +93,14 @@
<dimen name="all_apps_background_canvas_width">700dp</dimen>
<dimen name="all_apps_background_canvas_height">475dp</dimen>
<dimen name="all_apps_header_pill_height">48dp</dimen>
- <dimen name="all_apps_header_pill_corner_radius">18dp</dimen>
- <dimen name="all_apps_header_pills_width">348dp</dimen>
+ <dimen name="all_apps_header_pill_corner_radius">12dp</dimen>
<dimen name="all_apps_header_tab_height">48dp</dimen>
<dimen name="all_apps_tabs_indicator_height">2dp</dimen>
<dimen name="all_apps_header_top_padding">36dp</dimen>
<dimen name="all_apps_header_bottom_padding">6dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_top_padding">16dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_bottom_padding">20dp</dimen>
+ <dimen name="all_apps_tabs_button_horizontal_padding">4dp</dimen>
<dimen name="all_apps_tabs_vertical_padding">6dp</dimen>
<dimen name="all_apps_divider_height">2dp</dimen>
<dimen name="all_apps_divider_width">128dp</dimen>
@@ -136,6 +136,11 @@
<dimen name="widget_cell_horizontal_padding">16dp</dimen>
<dimen name="widget_cell_font_size">14sp</dimen>
+ <dimen name="widget_tabs_button_horizontal_padding">4dp</dimen>
+ <dimen name="widget_tabs_horizontal_margin">32dp</dimen>
+ <dimen name="widget_apps_header_pill_height">48dp</dimen>
+ <dimen name="widget_apps_tabs_vertical_padding">6dp</dimen>
+
<dimen name="recommended_widgets_table_vertical_padding">8dp</dimen>
<!-- Bottom margin for the search and recommended widgets container without work profile -->
@@ -147,7 +152,8 @@
<dimen name="widget_list_content_corner_radius">4dp</dimen>
<dimen name="widget_list_header_view_vertical_padding">20dp</dimen>
- <dimen name="widget_list_entry_bottom_margin">2dp</dimen>
+ <dimen name="widget_list_entry_spacing">2dp</dimen>
+ <dimen name="widget_list_horizontal_margin">16dp</dimen>
<dimen name="widget_preview_shadow_blur">0.5dp</dimen>
<dimen name="widget_preview_key_shadow_distance">1dp</dimen>
@@ -259,28 +265,19 @@
<!-- Notifications -->
<dimen name="bg_round_rect_radius">8dp</dimen>
- <dimen name="notification_padding_start">16dp</dimen>
- <dimen name="notification_padding_end">12dp</dimen>
- <!-- notification_padding_end + (icon_size - footer_icon_size) / 2 -->
- <dimen name="notification_footer_icon_row_padding">15dp</dimen>
- <dimen name="notification_header_height">36dp</dimen>
- <dimen name="notification_main_height">84dp</dimen>
- <dimen name="notification_footer_height">32dp</dimen>
- <!-- How much space to keep as padding for the last notification when the footer collapses -->
- <dimen name="notification_empty_footer_height">6dp</dimen>
- <dimen name="notification_header_text_size">13sp</dimen>
+ <dimen name="notification_padding">16dp</dimen>
+ <dimen name="notification_padding_top">18dp</dimen>
+ <dimen name="notification_header_text_size">14sp</dimen>
<dimen name="notification_header_count_text_size">12sp</dimen>
- <dimen name="notification_main_title_size">16sp</dimen>
+ <dimen name="notification_main_title_size">14sp</dimen>
<dimen name="notification_main_text_size">14sp</dimen>
- <dimen name="notification_icon_size">24dp</dimen>
- <dimen name="notification_footer_icon_size">18dp</dimen>
- <!-- notification_icon_size + notification_padding_end + 16dp padding between icon and text -->
- <dimen name="notification_main_text_padding_end">52dp</dimen>
+ <dimen name="notification_circle_icon_size">24dp</dimen>
+ <dimen name="notification_icon_size">32dp</dimen>
+ <!-- Space between edge and icon and icon and text -->
+ <dimen name="notification_icon_padding">12dp</dimen>
+ <!-- notification_icon_padding + notification_icon_size + notification_icon_padding -->
+ <dimen name="notification_main_text_padding_start">56dp</dimen>
<dimen name="horizontal_ellipsis_size">18dp</dimen>
- <!-- arrow_horizontal_offset_start - (ellipsis_size - arrow_width) / 2 -->
- <dimen name="horizontal_ellipsis_offset">19dp</dimen>
- <dimen name="popup_item_divider_height">0.5dp</dimen>
- <dimen name="swipe_helper_falsing_threshold">70dp</dimen>
<!-- Overview -->
<dimen name="options_menu_icon_size">24dp</dimen>
diff --git a/res/values/id.xml b/res/values/id.xml
index 1bd40ce..1709c59 100644
--- a/res/values/id.xml
+++ b/res/values/id.xml
@@ -16,6 +16,7 @@
-->
<resources>
<item type="id" name="apps_list_view_work" />
+ <item type="id" name="tag_widget_entry" />
<item type="id" name="view_type_widgets_list" />
<item type="id" name="view_type_widgets_header" />
<item type="id" name="view_type_widgets_search_header" />
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 2119e58..1cacc28 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -39,6 +39,7 @@
<item name="popupColorPrimary">@color/popup_color_primary_light</item>
<item name="popupColorSecondary">@color/popup_color_secondary_light</item>
<item name="popupColorTertiary">@color/popup_color_tertiary_light</item>
+ <item name="popupNotificationDotColor">@color/popup_notification_dot_light</item>
<item name="isMainColorDark">false</item>
<item name="isWorkspaceDarkText">false</item>
<item name="workspaceTextColor">@color/workspace_text_color_light</item>
@@ -107,6 +108,7 @@
<item name="popupColorPrimary">@color/popup_color_primary_dark</item>
<item name="popupColorSecondary">@color/popup_color_secondary_dark</item>
<item name="popupColorTertiary">@color/popup_color_tertiary_dark</item>
+ <item name="popupNotificationDotColor">@color/popup_notification_dot_dark</item>
<item name="widgetsTheme">@style/WidgetContainerTheme.Dark</item>
<item name="folderDotColor">@color/folder_dot_color</item>
<item name="folderFillColor">@color/folder_background_dark</item>
diff --git a/src/com/android/launcher3/anim/AnimatorPlaybackController.java b/src/com/android/launcher3/anim/AnimatorPlaybackController.java
index 7d8b82a..85ca280 100644
--- a/src/com/android/launcher3/anim/AnimatorPlaybackController.java
+++ b/src/com/android/launcher3/anim/AnimatorPlaybackController.java
@@ -278,12 +278,19 @@
}
}
- public void dispatchOnStart() {
+ public AnimatorPlaybackController dispatchOnStart() {
callListenerCommandRecursively(mAnim, AnimatorListener::onAnimationStart);
+ return this;
}
- public void dispatchOnCancel() {
+ public AnimatorPlaybackController dispatchOnCancel() {
callListenerCommandRecursively(mAnim, AnimatorListener::onAnimationCancel);
+ return this;
+ }
+
+ public AnimatorPlaybackController dispatchOnEnd() {
+ callListenerCommandRecursively(mAnim, AnimatorListener::onAnimationEnd);
+ return this;
}
public void dispatchSetInterpolator(TimeInterpolator interpolator) {
@@ -328,7 +335,7 @@
public void onAnimationSuccess(Animator animator) {
// We wait for the spring (if any) to finish running before completing the end callback.
if (!mDispatched) {
- callListenerCommandRecursively(mAnim, AnimatorListener::onAnimationEnd);
+ dispatchOnEnd();
if (mEndAction != null) {
mEndAction.run();
}
diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java
index 3abcc2b..7091d2b 100644
--- a/src/com/android/launcher3/model/data/ItemInfo.java
+++ b/src/com/android/launcher3/model/data/ItemInfo.java
@@ -168,6 +168,8 @@
cellY = info.cellY;
spanX = info.spanX;
spanY = info.spanY;
+ minSpanX = info.minSpanX;
+ minSpanY = info.minSpanY;
rank = info.rank;
screenId = info.screenId;
itemType = info.itemType;
diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java
deleted file mode 100644
index fd3d41a..0000000
--- a/src/com/android/launcher3/notification/NotificationFooterLayout.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.notification;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-
-import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
-import com.android.launcher3.anim.PropertyListBuilder;
-import com.android.launcher3.anim.PropertyResetListener;
-import com.android.launcher3.util.Themes;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A {@link FrameLayout} that contains only icons of notifications.
- * If there are more than {@link #MAX_FOOTER_NOTIFICATIONS} icons, we add a "..." overflow.
- */
-public class NotificationFooterLayout extends FrameLayout {
-
- public interface IconAnimationEndListener {
- void onIconAnimationEnd(NotificationInfo animatedNotification);
- }
-
- private static final int MAX_FOOTER_NOTIFICATIONS = 5;
-
- private static final Rect sTempRect = new Rect();
-
- private final List<NotificationInfo> mNotifications = new ArrayList<>();
- private final List<NotificationInfo> mOverflowNotifications = new ArrayList<>();
- private final boolean mRtl;
- private final int mBackgroundColor;
-
- FrameLayout.LayoutParams mIconLayoutParams;
- private View mOverflowEllipsis;
- private LinearLayout mIconRow;
- private NotificationItemView mContainer;
-
- public NotificationFooterLayout(Context context) {
- this(context, null, 0);
- }
-
- public NotificationFooterLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public NotificationFooterLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- Resources res = getResources();
- mRtl = Utilities.isRtl(res);
-
- int iconSize = res.getDimensionPixelSize(R.dimen.notification_footer_icon_size);
- mIconLayoutParams = new LayoutParams(iconSize, iconSize);
- mIconLayoutParams.gravity = Gravity.CENTER_VERTICAL;
- setWidth((int) res.getDimension(R.dimen.bg_popup_item_width));
- mBackgroundColor = Themes.getAttrColor(context, R.attr.popupColorPrimary);
- }
-
-
- /**
- * Compute margin start for each icon such that the icons between the first one and the ellipsis
- * are evenly spaced out.
- */
- public void setWidth(int width) {
- if (getLayoutParams() != null) {
- getLayoutParams().width = width;
- }
- Resources res = getResources();
- int iconSize = res.getDimensionPixelSize(R.dimen.notification_footer_icon_size);
-
- int paddingEnd = res.getDimensionPixelSize(R.dimen.notification_footer_icon_row_padding);
- int ellipsisSpace = res.getDimensionPixelSize(R.dimen.horizontal_ellipsis_offset)
- + res.getDimensionPixelSize(R.dimen.horizontal_ellipsis_size);
- int availableIconRowSpace = width - paddingEnd - ellipsisSpace
- - iconSize * MAX_FOOTER_NOTIFICATIONS;
- mIconLayoutParams.setMarginStart(availableIconRowSpace / MAX_FOOTER_NOTIFICATIONS);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mOverflowEllipsis = findViewById(R.id.overflow);
- mIconRow = findViewById(R.id.icon_row);
- }
-
- void setContainer(NotificationItemView container) {
- mContainer = container;
- }
-
- /**
- * Keep track of the NotificationInfo, and then update the UI when
- * {@link #commitNotificationInfos()} is called.
- */
- public void addNotificationInfo(final NotificationInfo notificationInfo) {
- if (mNotifications.size() < MAX_FOOTER_NOTIFICATIONS) {
- mNotifications.add(notificationInfo);
- } else {
- mOverflowNotifications.add(notificationInfo);
- }
- }
-
- /**
- * Adds icons and potentially overflow text for all of the NotificationInfo's
- * added using {@link #addNotificationInfo(NotificationInfo)}.
- */
- public void commitNotificationInfos() {
- mIconRow.removeAllViews();
-
- for (int i = 0; i < mNotifications.size(); i++) {
- NotificationInfo info = mNotifications.get(i);
- addNotificationIconForInfo(info);
- }
- updateOverflowEllipsisVisibility();
- }
-
- private void updateOverflowEllipsisVisibility() {
- mOverflowEllipsis.setVisibility(mOverflowNotifications.isEmpty() ? GONE : VISIBLE);
- }
-
- /**
- * Creates an icon for the given NotificationInfo, and adds it to the icon row.
- * @return the icon view that was added
- */
- private View addNotificationIconForInfo(NotificationInfo info) {
- View icon = new View(getContext());
- icon.setBackground(info.getIconForBackground(getContext(), mBackgroundColor));
- icon.setOnClickListener(info);
- icon.setTag(info);
- icon.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
- mIconRow.addView(icon, 0, mIconLayoutParams);
- return icon;
- }
-
- public void animateFirstNotificationTo(Rect toBounds,
- final IconAnimationEndListener callback) {
- AnimatorSet animation = new AnimatorSet();
- final View firstNotification = mIconRow.getChildAt(mIconRow.getChildCount() - 1);
-
- Rect fromBounds = sTempRect;
- firstNotification.getGlobalVisibleRect(fromBounds);
- float scale = (float) toBounds.height() / fromBounds.height();
- Animator moveAndScaleIcon = new PropertyListBuilder().scale(scale)
- .translationY(toBounds.top - fromBounds.top
- + (fromBounds.height() * scale - fromBounds.height()) / 2)
- .build(firstNotification);
- moveAndScaleIcon.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- callback.onIconAnimationEnd((NotificationInfo) firstNotification.getTag());
- removeViewFromIconRow(firstNotification);
- }
- });
- animation.play(moveAndScaleIcon);
-
- // Shift all notifications (not the overflow) over to fill the gap.
- int gapWidth = mIconLayoutParams.width + mIconLayoutParams.getMarginStart();
- if (mRtl) {
- gapWidth = -gapWidth;
- }
- if (!mOverflowNotifications.isEmpty()) {
- NotificationInfo notification = mOverflowNotifications.remove(0);
- mNotifications.add(notification);
- View iconFromOverflow = addNotificationIconForInfo(notification);
- animation.play(ObjectAnimator.ofFloat(iconFromOverflow, ALPHA, 0, 1));
- }
- int numIcons = mIconRow.getChildCount() - 1; // All children besides the one leaving.
- // We have to reset the translation X to 0 when the new main notification
- // is removed from the footer.
- PropertyResetListener<View, Float> propertyResetListener
- = new PropertyResetListener<>(TRANSLATION_X, 0f);
- for (int i = 0; i < numIcons; i++) {
- final View child = mIconRow.getChildAt(i);
- Animator shiftChild = ObjectAnimator.ofFloat(child, TRANSLATION_X, gapWidth);
- shiftChild.addListener(propertyResetListener);
- animation.play(shiftChild);
- }
- animation.start();
- }
-
- private void removeViewFromIconRow(View child) {
- mIconRow.removeView(child);
- mNotifications.remove(child.getTag());
- updateOverflowEllipsisVisibility();
- if (mIconRow.getChildCount() == 0) {
- // There are no more icons in the footer, so hide it.
- if (mContainer != null) {
- mContainer.removeFooter();
- }
- }
- }
-
- public void trimNotifications(List<String> notifications) {
- if (!isAttachedToWindow() || mIconRow.getChildCount() == 0) {
- return;
- }
- Iterator<NotificationInfo> overflowIterator = mOverflowNotifications.iterator();
- while (overflowIterator.hasNext()) {
- if (!notifications.contains(overflowIterator.next().notificationKey)) {
- overflowIterator.remove();
- }
- }
- for (int i = mIconRow.getChildCount() - 1; i >= 0; i--) {
- View child = mIconRow.getChildAt(i);
- NotificationInfo childInfo = (NotificationInfo) child.getTag();
- if (!notifications.contains(childInfo.notificationKey)) {
- removeViewFromIconRow(child);
- }
- }
- }
-}
diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java
index 932e721..af943a6 100644
--- a/src/com/android/launcher3/notification/NotificationItemView.java
+++ b/src/com/android/launcher3/notification/NotificationItemView.java
@@ -16,12 +16,8 @@
package com.android.launcher3.notification;
-import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL;
-
import android.animation.AnimatorSet;
-import android.app.Notification;
import android.content.Context;
-import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Rect;
import android.view.MotionEvent;
@@ -32,11 +28,10 @@
import android.widget.TextView;
import com.android.launcher3.R;
-import com.android.launcher3.graphics.IconPalette;
import com.android.launcher3.popup.PopupContainerWithArrow;
-import com.android.launcher3.touch.SingleAxisSwipeDetector;
import com.android.launcher3.util.Themes;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -50,39 +45,26 @@
private final PopupContainerWithArrow mPopupContainer;
private final ViewGroup mRootView;
- private final TextView mHeaderText;
private final TextView mHeaderCount;
private final NotificationMainView mMainView;
- private final NotificationFooterLayout mFooter;
- private final SingleAxisSwipeDetector mSwipeDetector;
- private final View mIconView;
private final View mHeader;
private View mGutter;
private boolean mIgnoreTouch = false;
- private boolean mAnimatingNextIcon;
- private int mNotificationHeaderTextColor = Notification.COLOR_DEFAULT;
+ private List<NotificationInfo> mNotificationInfos = new ArrayList<>();
public NotificationItemView(PopupContainerWithArrow container, ViewGroup rootView) {
mPopupContainer = container;
mRootView = rootView;
mContext = container.getContext();
- mHeaderText = container.findViewById(R.id.notification_text);
mHeaderCount = container.findViewById(R.id.notification_count);
mMainView = container.findViewById(R.id.main_view);
- mFooter = container.findViewById(R.id.footer);
- mIconView = container.findViewById(R.id.popup_item_icon);
mHeader = container.findViewById(R.id.header);
- mSwipeDetector = new SingleAxisSwipeDetector(mContext, mMainView, HORIZONTAL);
- mSwipeDetector.setDetectableScrollConditions(SingleAxisSwipeDetector.DIRECTION_BOTH, false);
- mMainView.setSwipeDetector(mSwipeDetector);
- mFooter.setContainer(this);
-
float radius = Themes.getDialogCornerRadius(mContext);
rootView.setClipToOutline(true);
rootView.setOutlineProvider(new ViewOutlineProvider() {
@@ -108,19 +90,6 @@
}
}
- /**
- * Sets width for notification footer and spaces out items evenly
- */
- public void setFooterWidth(int footerWidth) {
- mFooter.setWidth(footerWidth);
- }
-
- public void removeFooter() {
- if (mRootView.indexOfChild(mFooter) >= 0) {
- mRootView.removeView(mFooter);
- }
- }
-
public void inverseGutterMargin() {
MarginLayoutParams lp = (MarginLayoutParams) mGutter.getLayoutParams();
int top = lp.topMargin;
@@ -131,27 +100,28 @@
public void removeAllViews() {
mRootView.removeView(mMainView);
mRootView.removeView(mHeader);
-
- if (mRootView.indexOfChild(mFooter) >= 0) {
- mRootView.removeView(mFooter);
- }
-
if (mGutter != null) {
mRootView.removeView(mGutter);
}
}
- public void updateHeader(int notificationCount, int iconColor) {
- mHeaderCount.setText(notificationCount <= 1 ? "" : String.valueOf(notificationCount));
- if (Color.alpha(iconColor) > 0) {
- if (mNotificationHeaderTextColor == Notification.COLOR_DEFAULT) {
- mNotificationHeaderTextColor =
- IconPalette.resolveContrastColor(mContext, iconColor,
- Themes.getAttrColor(mContext, R.attr.popupColorPrimary));
- }
- mHeaderText.setTextColor(mNotificationHeaderTextColor);
- mHeaderCount.setTextColor(mNotificationHeaderTextColor);
+ /**
+ * Updates the header text.
+ * @param notificationCount The number of notifications.
+ */
+ public void updateHeader(int notificationCount) {
+ final String text;
+ final int visibility;
+ if (notificationCount <= 1) {
+ text = "";
+ visibility = View.INVISIBLE;
+ } else {
+ text = String.valueOf(notificationCount);
+ visibility = View.VISIBLE;
+
}
+ mHeaderCount.setText(text);
+ mHeaderCount.setVisibility(visibility);
}
public boolean onInterceptTouchEvent(MotionEvent ev) {
@@ -171,53 +141,39 @@
return false;
}
- mSwipeDetector.onTouchEvent(ev);
- return mSwipeDetector.isDraggingOrSettling();
- }
-
- public boolean onTouchEvent(MotionEvent ev) {
- if (mIgnoreTouch) {
- return false;
- }
- if (mMainView.getNotificationInfo() == null) {
- // The notification hasn't been populated yet.
- return false;
- }
- return mSwipeDetector.onTouchEvent(ev);
+ return false;
}
public void applyNotificationInfos(final List<NotificationInfo> notificationInfos) {
+ mNotificationInfos.clear();
if (notificationInfos.isEmpty()) {
return;
}
+ mNotificationInfos.addAll(notificationInfos);
NotificationInfo mainNotification = notificationInfos.get(0);
mMainView.applyNotificationInfo(mainNotification, false);
-
- for (int i = 1; i < notificationInfos.size(); i++) {
- mFooter.addNotificationInfo(notificationInfos.get(i));
- }
- mFooter.commitNotificationInfos();
}
public void trimNotifications(final List<String> notificationKeys) {
- boolean dismissedMainNotification = !notificationKeys.contains(
- mMainView.getNotificationInfo().notificationKey);
- if (dismissedMainNotification && !mAnimatingNextIcon) {
- // Animate the next icon into place as the new main notification.
- mAnimatingNextIcon = true;
- mMainView.setContentVisibility(View.INVISIBLE);
- mMainView.setContentTranslation(0);
- mIconView.getGlobalVisibleRect(sTempRect);
- mFooter.animateFirstNotificationTo(sTempRect, (newMainNotification) -> {
- if (newMainNotification != null) {
- mMainView.applyNotificationInfo(newMainNotification, true);
- mMainView.setContentVisibility(View.VISIBLE);
+ NotificationInfo currentMainNotificationInfo = mMainView.getNotificationInfo();
+ boolean shouldUpdateMainNotification = !notificationKeys.contains(
+ currentMainNotificationInfo.notificationKey);
+
+ if (shouldUpdateMainNotification) {
+ int size = notificationKeys.size();
+ NotificationInfo nextNotification = null;
+ // We get the latest notification by finding the notification after the one that was
+ // just dismissed.
+ for (int i = 0; i < size; ++i) {
+ if (currentMainNotificationInfo == mNotificationInfos.get(i) && i + 1 < size) {
+ nextNotification = mNotificationInfos.get(i + 1);
+ break;
}
- mAnimatingNextIcon = false;
- });
- } else {
- mFooter.trimNotifications(notificationKeys);
+ }
+ if (nextNotification != null) {
+ mMainView.applyNotificationInfo(nextNotification, true);
+ }
}
}
}
diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java
index e9b5f32..b8aa824 100644
--- a/src/com/android/launcher3/notification/NotificationMainView.java
+++ b/src/com/android/launcher3/notification/NotificationMainView.java
@@ -16,19 +16,15 @@
package com.android.launcher3.notification;
-import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DISMISSED;
-import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.RippleDrawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -40,19 +36,15 @@
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
-import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.model.data.ItemInfo;
-import com.android.launcher3.touch.BaseSwipeDetector;
-import com.android.launcher3.touch.OverScroll;
import com.android.launcher3.touch.SingleAxisSwipeDetector;
-import com.android.launcher3.util.Themes;
/**
* A {@link android.widget.FrameLayout} that contains a single notification,
* e.g. icon + title + text.
*/
@TargetApi(Build.VERSION_CODES.N)
-public class NotificationMainView extends FrameLayout implements SingleAxisSwipeDetector.Listener {
+public class NotificationMainView extends FrameLayout {
private static final FloatProperty<NotificationMainView> CONTENT_TRANSLATION =
new FloatProperty<NotificationMainView>("contentTranslation") {
@@ -70,8 +62,6 @@
// This is used only to track the notification view, so that it can be properly logged.
public static final ItemInfo NOTIFICATION_ITEM_INFO = new ItemInfo();
- private final ObjectAnimator mContentTranslateAnimator;
-
private NotificationInfo mNotificationInfo;
private ViewGroup mTextAndBackground;
private int mBackgroundColor;
@@ -82,7 +72,6 @@
private SingleAxisSwipeDetector mSwipeDetector;
private final ColorDrawable mColorDrawable;
- private final RippleDrawable mRippleDrawable;
public NotificationMainView(Context context) {
this(context, null, 0);
@@ -95,11 +84,7 @@
public NotificationMainView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- mContentTranslateAnimator = ObjectAnimator.ofFloat(this, CONTENT_TRANSLATION, 0);
mColorDrawable = new ColorDrawable(Color.TRANSPARENT);
- mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(
- Themes.getAttrColor(getContext(), android.R.attr.colorControlHighlight)),
- mColorDrawable, null);
}
@Override
@@ -118,7 +103,7 @@
private void updateBackgroundColor(int color) {
mBackgroundColor = color;
mColorDrawable.setColor(color);
- mTextAndBackground.setBackground(mRippleDrawable);
+ mTextAndBackground.setBackground(mColorDrawable);
if (mNotificationInfo != null) {
mIconView.setBackground(mNotificationInfo.getIconForBackground(getContext(),
mBackgroundColor));
@@ -140,10 +125,6 @@
animatorSetOut.play(colors);
}
- public void setSwipeDetector(SingleAxisSwipeDetector swipeDetector) {
- mSwipeDetector = swipeDetector;
- }
-
/**
* Sets the content of this view, animating it after a new icon shifts up if necessary.
*/
@@ -182,11 +163,6 @@
mIconView.setTranslationX(translation);
}
- public void setContentVisibility(int visibility) {
- mTextAndBackground.setVisibility(visibility);
- mIconView.setVisibility(visibility);
- }
-
public NotificationInfo getNotificationInfo() {
return mNotificationInfo;
}
@@ -202,56 +178,4 @@
mNotificationInfo.notificationKey);
launcher.getStatsLogManager().logger().log(LAUNCHER_NOTIFICATION_DISMISSED);
}
-
- // SingleAxisSwipeDetector.Listener's
- @Override
- public void onDragStart(boolean start, float startDisplacement) { }
-
-
- @Override
- public boolean onDrag(float displacement) {
- setContentTranslation(canChildBeDismissed()
- ? displacement : OverScroll.dampedScroll(displacement, getWidth()));
- mContentTranslateAnimator.cancel();
- return true;
- }
-
- @Override
- public void onDragEnd(float velocity) {
- final boolean willExit;
- final float endTranslation;
- final float startTranslation = mTextAndBackground.getTranslationX();
-
- if (!canChildBeDismissed()) {
- willExit = false;
- endTranslation = 0;
- } else if (mSwipeDetector.isFling(velocity)) {
- willExit = true;
- endTranslation = velocity < 0 ? - getWidth() : getWidth();
- } else if (Math.abs(startTranslation) > getWidth() / 2) {
- willExit = true;
- endTranslation = (startTranslation < 0 ? -getWidth() : getWidth());
- } else {
- willExit = false;
- endTranslation = 0;
- }
-
- long duration = BaseSwipeDetector.calculateDuration(velocity,
- (endTranslation - startTranslation) / getWidth());
-
- mContentTranslateAnimator.removeAllListeners();
- mContentTranslateAnimator.setDuration(duration)
- .setInterpolator(scrollInterpolatorForVelocity(velocity));
- mContentTranslateAnimator.setFloatValues(startTranslation, endTranslation);
- mContentTranslateAnimator.addListener(new AnimationSuccessListener() {
- @Override
- public void onAnimationSuccess(Animator animator) {
- mSwipeDetector.finishedScrolling();
- if (willExit) {
- onChildDismissed();
- }
- }
- });
- mContentTranslateAnimator.start();
- }
}
diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
index 2ae12ac..18f263a 100644
--- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java
+++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
@@ -138,14 +138,6 @@
}
@Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (mNotificationItemView != null) {
- return mNotificationItemView.onTouchEvent(ev) || super.onTouchEvent(ev);
- }
- return super.onTouchEvent(ev);
- }
-
- @Override
protected boolean isOfType(int type) {
return (type & TYPE_ACTION_POPUP) != 0;
}
@@ -272,12 +264,6 @@
}
View.inflate(getContext(), R.layout.notification_content, mNotificationContainer);
mNotificationItemView = new NotificationItemView(this, mNotificationContainer);
- if (mNumNotifications == 1) {
- mNotificationItemView.removeFooter();
- }
- else {
- mNotificationItemView.setFooterWidth(containerWidth);
- }
updateNotificationHeader();
}
int viewsToFlip = getChildCount();
@@ -462,8 +448,7 @@
ItemInfoWithIcon itemInfo = (ItemInfoWithIcon) mOriginalIcon.getTag();
DotInfo dotInfo = mLauncher.getDotInfoForItem(itemInfo);
if (mNotificationItemView != null && dotInfo != null) {
- mNotificationItemView.updateHeader(
- dotInfo.getNotificationCount(), itemInfo.bitmap.color);
+ mNotificationItemView.updateHeader(dotInfo.getNotificationCount());
}
}
diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java
index dbd9c28..915e140 100644
--- a/src/com/android/launcher3/settings/SettingsActivity.java
+++ b/src/com/android/launcher3/settings/SettingsActivity.java
@@ -113,12 +113,6 @@
Utilities.getPrefs(getApplicationContext()).registerOnSharedPreferenceChangeListener(this);
}
- @Override
- protected void onStop() {
- super.onStop();
- finish();
- }
-
/**
* Obtains the preference fragment to instantiate in this activity.
*
diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java
index 13d6568..b34af97 100644
--- a/src/com/android/launcher3/statemanager/StateManager.java
+++ b/src/com/android/launcher3/statemanager/StateManager.java
@@ -209,7 +209,7 @@
// Cancel the current animation. This will reset mState to mCurrentStableState, so store it.
STATE_TYPE fromState = mState;
- mConfig.reset();
+ cancelAnimation();
if (!animated) {
mAtomicAnimationFactory.cancelAllStateElementAnimation();
@@ -303,7 +303,7 @@
public AnimatorPlaybackController createAnimationToNewWorkspace(STATE_TYPE state,
StateAnimationConfig config) {
config.userControlled = true;
- mConfig.reset();
+ cancelAnimation();
config.copyTo(mConfig);
mConfig.playbackController = createAnimationToNewWorkspaceInternal(state)
.createPlaybackController();
@@ -393,6 +393,11 @@
*/
public void cancelAnimation() {
mConfig.reset();
+ // It could happen that a new animation is set as a result of an endListener on the
+ // existing animation.
+ while (mConfig.currentAnimation != null || mConfig.playbackController != null) {
+ mConfig.reset();
+ }
}
public void setCurrentUserControlledAnimation(AnimatorPlaybackController controller) {
@@ -508,14 +513,19 @@
* Cancels the current animation and resets config variables.
*/
public void reset() {
+ AnimatorSet anim = currentAnimation;
+ AnimatorPlaybackController pc = playbackController;
+
DEFAULT.copyTo(this);
targetState = null;
+ currentAnimation = null;
+ playbackController = null;
+ changeId++;
- if (playbackController != null) {
- playbackController.getAnimationPlayer().cancel();
- playbackController.dispatchOnCancel();
- } else if (currentAnimation != null) {
- AnimatorSet anim = currentAnimation;
+ if (pc != null) {
+ pc.getAnimationPlayer().cancel();
+ pc.dispatchOnCancel().dispatchOnEnd();
+ } else if (anim != null) {
anim.setDuration(0);
if (!anim.isStarted()) {
// If the animation is not started the listeners do not get notified,
@@ -525,10 +535,6 @@
}
anim.cancel();
}
-
- currentAnimation = null;
- playbackController = null;
- changeId++;
}
@Override
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
index 6dc6971..fe83f3f 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
@@ -60,6 +60,10 @@
private static final int FLAG_ACTIVITY_RESUMED = 1 << 3;
private static final int FLAGS_SHOULD_LISTEN =
FLAG_STATE_IS_NORMAL | FLAG_ACTIVITY_STARTED | FLAG_ACTIVITY_RESUMED;
+ // TODO(b/191735836): Replace with ActivityOptions.KEY_SPLASH_SCREEN_STYLE when un-hidden
+ private static final String KEY_SPLASH_SCREEN_STYLE = "android.activity.splashScreenStyle";
+ // TODO(b/191735836): Replace with SplashScreen.SPLASH_SCREEN_STYLE_EMPTY when un-hidden
+ private static final int SPLASH_SCREEN_STYLE_EMPTY = 0;
public static final int APPWIDGET_HOST_ID = 1024;
@@ -329,7 +333,9 @@
if (view == null) return null;
Object tag = view.getTag();
if (!(tag instanceof ItemInfo)) return null;
- return activity.getActivityLaunchOptions(view, (ItemInfo) tag).toBundle();
+ Bundle bundle = activity.getActivityLaunchOptions(view, (ItemInfo) tag).toBundle();
+ bundle.putInt(KEY_SPLASH_SCREEN_STYLE, SPLASH_SCREEN_STYLE_EMPTY);
+ return bundle;
}
private void sendActionCancelled(final BaseActivity activity, final int requestCode) {
diff --git a/src/com/android/launcher3/widget/model/WidgetsListSearchHeaderEntry.java b/src/com/android/launcher3/widget/model/WidgetsListSearchHeaderEntry.java
index c0f89bc..055e4ec 100644
--- a/src/com/android/launcher3/widget/model/WidgetsListSearchHeaderEntry.java
+++ b/src/com/android/launcher3/widget/model/WidgetsListSearchHeaderEntry.java
@@ -60,7 +60,7 @@
WidgetsListSearchHeaderEntry otherEntry = (WidgetsListSearchHeaderEntry) obj;
return mWidgets.equals(otherEntry.mWidgets) && mPkgItem.equals(otherEntry.mPkgItem)
&& mTitleSectionName.equals(otherEntry.mTitleSectionName)
- && mIsWidgetListShown;
+ && mIsWidgetListShown == otherEntry.mIsWidgetListShown;
}
/** Returns a copy of this {@link WidgetsListSearchHeaderEntry} with the widget list shown. */
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
index 5d9adf0..b668c90 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
@@ -18,6 +18,7 @@
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGETSTRAY_APP_EXPANDED;
import android.content.Context;
+import android.graphics.Rect;
import android.os.Process;
import android.util.Log;
import android.util.Size;
@@ -34,6 +35,7 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
+import androidx.recyclerview.widget.RecyclerView.LayoutParams;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.android.launcher3.BaseActivity;
@@ -107,7 +109,8 @@
@Nullable private Predicate<WidgetsListBaseEntry> mFilter = null;
@Nullable private RecyclerView mRecyclerView;
@Nullable private PackageUserKey mPendingClickHeader;
- private int mShortcutPreviewPadding;
+ private final int mShortcutPreviewPadding;
+ private final int mSpacingBetweenEntries;
private final WidgetPreviewLoadedCallback mPreviewLoadedCallback =
ignored -> updateVisibleEntries();
@@ -141,11 +144,28 @@
mShortcutPreviewPadding =
2 * context.getResources()
.getDimensionPixelSize(R.dimen.widget_preview_shortcut_padding);
+ mSpacingBetweenEntries =
+ context.getResources().getDimensionPixelSize(R.dimen.widget_list_entry_spacing);
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
mRecyclerView = recyclerView;
+
+ mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
+ @Override
+ public void getItemOffsets(
+ @NonNull Rect outRect,
+ @NonNull View view,
+ @NonNull RecyclerView parent,
+ @NonNull RecyclerView.State state) {
+ super.getItemOffsets(outRect, view, parent, state);
+ int position = ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
+ boolean isHeader =
+ view.getTag(R.id.tag_widget_entry) instanceof WidgetsListBaseEntry.Header;
+ outRect.top += position > 0 && isHeader ? mSpacingBetweenEntries : 0;
+ }
+ });
}
@Override
@@ -329,7 +349,9 @@
@Override
public void onBindViewHolder(ViewHolder holder, int pos) {
ViewHolderBinder viewHolderBinder = mViewHolderBinders.get(getItemViewType(pos));
+ WidgetsListBaseEntry entry = mVisibleEntries.get(pos);
viewHolderBinder.bindViewHolder(holder, mVisibleEntries.get(pos), pos);
+ holder.itemView.setTag(R.id.tag_widget_entry, entry);
}
@Override
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
index cdab964..ef2adbb 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
@@ -30,7 +30,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.LauncherAppState;
@@ -59,7 +58,6 @@
@Nullable private HandlerRunnable mIconLoadRequest;
@Nullable private Drawable mIconDrawable;
private final int mIconSize;
- private final int mBottomMarginSize;
private ImageView mAppIcon;
private TextView mTitle;
@@ -86,8 +84,6 @@
R.styleable.WidgetsListRowHeader, defStyleAttr, /* defStyleRes= */ 0);
mIconSize = a.getDimensionPixelSize(R.styleable.WidgetsListRowHeader_appIconSize,
grid.iconSizePx);
- mBottomMarginSize =
- getResources().getDimensionPixelSize(R.dimen.widget_list_entry_bottom_margin);
}
@Override
@@ -146,13 +142,6 @@
public void setExpanded(boolean isExpanded) {
this.mIsExpanded = isExpanded;
mExpandToggle.setChecked(isExpanded);
- if (getLayoutParams() instanceof RecyclerView.LayoutParams) {
- int bottomMargin = isExpanded ? 0 : mBottomMarginSize;
- RecyclerView.LayoutParams layoutParams =
- ((RecyclerView.LayoutParams) getLayoutParams());
- layoutParams.bottomMargin = bottomMargin;
- setLayoutParams(layoutParams);
- }
}
/** Sets the {@link WidgetsListDrawableState} and refreshes the background drawable. */
diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
index 3ee8b33..7671841 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java
@@ -52,7 +52,7 @@
private HeaderViewDimensionsProvider mHeaderViewDimensionsProvider;
private int mLastVisibleWidgetContentTableHeight = 0;
private int mWidgetHeaderHeight = 0;
- private final int mCollapsedHeaderBottomMarginSize;
+ private final int mSpacingBetweenEntries;
@Nullable private OnContentChangeListener mOnContentChangeListener;
public WidgetsRecyclerView(Context context) {
@@ -72,9 +72,9 @@
ActivityContext activity = ActivityContext.lookupContext(getContext());
DeviceProfile grid = activity.getDeviceProfile();
- // The bottom margin used when the header is not expanded.
- mCollapsedHeaderBottomMarginSize =
- getResources().getDimensionPixelSize(R.dimen.widget_list_entry_bottom_margin);
+ // The spacing used between entries.
+ mSpacingBetweenEntries =
+ getResources().getDimensionPixelSize(R.dimen.widget_list_entry_spacing);
}
@Override
@@ -270,16 +270,16 @@
if (untilIndex > mAdapter.getItems().size()) {
untilIndex = mAdapter.getItems().size();
}
- int expandedHeaderPosition = mAdapter.getSelectedHeaderPosition().orElse(-1);
int totalItemsHeight = 0;
for (int i = 0; i < untilIndex; i++) {
WidgetsListBaseEntry entry = mAdapter.getItems().get(i);
if (entry instanceof WidgetsListHeaderEntry
|| entry instanceof WidgetsListSearchHeaderEntry) {
totalItemsHeight += mWidgetHeaderHeight;
- if (expandedHeaderPosition != i) {
- // If the header is collapsed, include the bottom margin it will use.
- totalItemsHeight += mCollapsedHeaderBottomMarginSize;
+ if (i > 0) {
+ // Each header contains the spacing between entries as top decoration, except
+ // the first one.
+ totalItemsHeight += mSpacingBetweenEntries;
}
} else if (entry instanceof WidgetsListContentEntry) {
totalItemsHeight += mLastVisibleWidgetContentTableHeight;
diff --git a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
index df5d465..11185fb 100644
--- a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
+++ b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
@@ -16,118 +16,43 @@
package com.android.launcher3.workprofile;
import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.util.AttributeSet;
-import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
import com.android.launcher3.pageindicators.PageIndicator;
/**
* Supports two indicator colors, dedicated for personal and work tabs.
*/
public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageIndicator {
- private final Paint mSelectedIndicatorPaint;
-
- private int mTabVerticalPadding;
- private final int mSelectedIndicatorRadius;
-
- private int mIndicatorLeft = -1;
- private int mIndicatorRight = -1;
- private float mScrollOffset;
- private int mSelectedPosition = 0;
-
private OnActivePageChangedListener mOnActivePageChangedListener;
private int mLastActivePage = 0;
- private boolean mIsRtl;
public PersonalWorkSlidingTabStrip(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
- setWillNotDraw(false);
-
- mTabVerticalPadding =
- getResources().getDimensionPixelSize(R.dimen.all_apps_tabs_vertical_padding);
-
- mSelectedIndicatorRadius = getResources().getDimensionPixelSize(
- R.dimen.all_apps_header_pill_corner_radius);
-
- mSelectedIndicatorPaint = new Paint();
- mSelectedIndicatorPaint.setColor(
- context.getColor(R.color.all_apps_tab_background_selected));
-
- mIsRtl = Utilities.isRtl(getResources());
}
/**
* Highlights tab with index pos
*/
public void updateTabTextColor(int pos) {
- mSelectedPosition = pos;
for (int i = 0; i < getChildCount(); i++) {
Button tab = (Button) getChildAt(i);
tab.setSelected(i == pos);
}
}
- private void updateIndicatorPosition(float scrollOffset) {
- mScrollOffset = scrollOffset;
- updateIndicatorPosition();
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
- updateTabTextColor(mSelectedPosition);
- updateIndicatorPosition(mScrollOffset);
- }
-
- private void updateIndicatorPosition() {
- int left = -1, right = -1;
- final View leftTab = getLeftTab();
- if (leftTab != null) {
- left = (int) (leftTab.getLeft() + leftTab.getWidth() * mScrollOffset);
- right = left + leftTab.getWidth();
- }
- setIndicatorPosition(left, right);
- }
-
- private View getLeftTab() {
- return mIsRtl ? getChildAt(1) : getChildAt(0);
- }
-
- private void setIndicatorPosition(int left, int right) {
- if (left != mIndicatorLeft || right != mIndicatorRight) {
- mIndicatorLeft = left;
- mIndicatorRight = right;
- invalidate();
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawRoundRect(mIndicatorLeft, mTabVerticalPadding, mIndicatorRight,
- getHeight() - mTabVerticalPadding, mSelectedIndicatorRadius,
- mSelectedIndicatorRadius, mSelectedIndicatorPaint);
- }
-
@Override
public void setScroll(int currentScroll, int totalScroll) {
- float scrollOffset = ((float) currentScroll) / totalScroll;
- updateIndicatorPosition(scrollOffset);
}
@Override
public void setActiveMarker(int activePage) {
updateTabTextColor(activePage);
- updateIndicatorPosition(mIsRtl ? 1 - activePage : activePage);
if (mOnActivePageChangedListener != null && mLastActivePage != activePage) {
mOnActivePageChangedListener.onActivePageChanged(activePage);
}
diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java
index e32250e..1cb6b2d 100644
--- a/tests/tapl/com/android/launcher3/tapl/AllApps.java
+++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java
@@ -25,6 +25,7 @@
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.Direction;
+import androidx.test.uiautomator.StaleObjectException;
import androidx.test.uiautomator.UiObject2;
import com.android.launcher3.testing.TestProtocol;
@@ -61,7 +62,13 @@
private boolean hasClickableIcon(UiObject2 allAppsContainer, UiObject2 appListRecycler,
BySelector appIconSelector, int displayBottom) {
- final UiObject2 icon = appListRecycler.findObject(appIconSelector);
+ final UiObject2 icon;
+ try {
+ icon = appListRecycler.findObject(appIconSelector);
+ } catch (StaleObjectException e) {
+ mLauncher.fail("All apps recycler disappeared from screen");
+ return false;
+ }
if (icon == null) {
LauncherInstrumentation.log("hasClickableIcon: icon not visible");
return false;
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 96e8222..c05fc57 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -496,7 +496,7 @@
}
}
- private void fail(String message) {
+ void fail(String message) {
checkForAnomaly();
Assert.fail(formatSystemHealthMessage(formatErrorWithEvents(
"http://go/tapl test failure:\nSummary: " + getContextDescription()
@@ -1449,6 +1449,9 @@
Rect getVisibleBounds(UiObject2 object) {
try {
return object.getVisibleBounds();
+ } catch (StaleObjectException e) {
+ fail("Object " + object + " disappeared from screen");
+ return null;
} catch (Throwable t) {
fail(t.toString());
return null;