Moving clear all button inside the recents view

Bug: 72222505
Bug: 109828536

Change-Id: I843b79db3e47abc2c41ed78f186b9c941941ddef
This commit is contained in:
Sunny Goyal
2018-06-06 15:39:13 -07:00
parent 367a53ec13
commit c82c6396e9
23 changed files with 249 additions and 484 deletions
@@ -20,25 +20,12 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.android.quickstep.views.RecentsViewContainer
android:id="@+id/overview_panel_container"
<com.android.quickstep.fallback.FallbackRecentsView
android:id="@id/overview_panel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
>
<include layout="@layout/overview_clear_all_button"/>
<com.android.quickstep.fallback.FallbackRecentsView
android:id="@id/overview_panel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:outlineProvider="none"
android:focusableInTouchMode="true"
android:theme="@style/HomeScreenElementTheme"
>
</com.android.quickstep.fallback.FallbackRecentsView>
</com.android.quickstep.views.RecentsViewContainer>
android:clipToPadding="false"
android:outlineProvider="none"
android:theme="@style/HomeScreenElementTheme" />
</com.android.quickstep.fallback.RecentsRootView>
@@ -1,15 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.quickstep.views.ClearAllButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/clear_all_button"
style="@android:style/Widget.DeviceDefault.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|top"
android:text="@string/recents_clear_all"
android:textColor="?attr/workspaceTextColor"
android:visibility="invisible"
android:textSize="14sp"
android:importantForAccessibility="no"
/>
android:translationY="@dimen/task_thumbnail_half_top_margin"
/>
+5 -19
View File
@@ -14,26 +14,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.quickstep.views.RecentsViewContainer
<com.android.quickstep.views.LauncherRecentsView
xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@style/HomeScreenElementTheme"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:visibility="invisible"
>
<include layout="@layout/overview_clear_all_button"/>
<com.android.quickstep.views.LauncherRecentsView
android:id="@id/overview_panel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:outlineProvider="none"
android:focusableInTouchMode="true"
android:accessibilityPaneTitle="@string/accessibility_recent_apps"
android:theme="@style/HomeScreenElementTheme"
>
</com.android.quickstep.views.LauncherRecentsView>
</com.android.quickstep.views.RecentsViewContainer>
android:clipToPadding="false"
android:accessibilityPaneTitle="@string/accessibility_recent_apps"
android:visibility="invisible" />
+5 -4
View File
@@ -17,8 +17,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="false"
android:elevation="4dp">
android:defaultFocusHighlightEnabled="false"
android:elevation="4dp"
android:focusable="true">
<com.android.quickstep.views.TaskThumbnailView
android:id="@+id/snapshot"
@@ -30,7 +31,7 @@
android:id="@+id/icon"
android:layout_width="@dimen/task_thumbnail_icon_size"
android:layout_height="@dimen/task_thumbnail_icon_size"
android:importantForAccessibility="no"
android:layout_gravity="top|center_horizontal"
android:focusable="false"
android:layout_gravity="top|center_horizontal" />
android:importantForAccessibility="no" />
</com.android.quickstep.views.TaskView>
+1 -3
View File
@@ -17,6 +17,7 @@
<resources>
<dimen name="task_thumbnail_top_margin">24dp</dimen>
<dimen name="task_thumbnail_half_top_margin">12dp</dimen>
<dimen name="task_thumbnail_icon_size">48dp</dimen>
<dimen name="task_corner_radius">2dp</dimen>
<dimen name="recents_page_spacing">10dp</dimen>
@@ -50,9 +51,6 @@
docked_stack_divider_thickness - 2 * docked_stack_divider_insets -->
<dimen name="multi_window_task_divider_size">10dp</dimen>
<!-- Width of the space behind the last task in Overview. In the center of it, there is "Clear all" button. -->
<dimen name="clear_all_container_width">168dp</dimen>
<dimen name="shelf_surface_radius">16dp</dimen>
<!-- same as vertical_drag_handle_size -->
<dimen name="shelf_surface_offset">24dp</dimen>
@@ -369,8 +369,9 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
launcherAnimator.play(ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS,
allAppsController.getProgress(), ALL_APPS_PROGRESS_OFF_SCREEN));
View overview = mLauncher.getOverviewPanelContainer();
ObjectAnimator alpha = ObjectAnimator.ofFloat(overview, View.ALPHA, alphas);
RecentsView overview = mLauncher.getOverviewPanel();
ObjectAnimator alpha = ObjectAnimator.ofFloat(overview,
RecentsView.CONTENT_ALPHA, alphas);
alpha.setDuration(217);
alpha.setInterpolator(LINEAR);
launcherAnimator.play(alpha);
@@ -380,14 +381,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
transY.setDuration(350);
launcherAnimator.play(transY);
overview.setLayerType(View.LAYER_TYPE_HARDWARE, null);
endListener = () -> {
overview.setLayerType(View.LAYER_TYPE_NONE, null);
overview.setAlpha(1f);
overview.setTranslationY(0f);
mLauncher.getStateManager().reapplyState();
};
endListener = mLauncher.getStateManager()::reapplyState;
} else {
mDragLayerAlpha.setValue(alphas[0]);
ObjectAnimator alpha =
@@ -25,6 +25,7 @@ import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Workspace;
import com.android.launcher3.allapps.DiscoveryBounce;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
@@ -118,6 +119,11 @@ public class OverviewState extends LauncherState {
/ launcher.getAllAppsController().getShiftRange());
}
@Override
public String getDescription(Launcher launcher) {
return launcher.getString(R.string.accessibility_desc_recent_apps);
}
public static float getDefaultSwipeHeight(Launcher launcher) {
DeviceProfile dp = launcher.getDeviceProfile();
return dp.allAppsCellHeightPx - dp.allAppsIconTextSizePx;
@@ -139,7 +139,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr
cancelPendingAnim();
RecentsView recentsView = mLauncher.getOverviewPanel();
TaskView taskView = (TaskView) recentsView.getChildAt(recentsView.getNextPage());
TaskView taskView = recentsView.getTaskViewAt(recentsView.getNextPage());
if (recentsView.shouldSwipeDownLaunchApp() && mFromState == OVERVIEW && mToState == NORMAL
&& taskView != null) {
// Reset the state manager, when changing the interaction mode
@@ -25,7 +25,7 @@ import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR;
import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR;
import static com.android.quickstep.views.LauncherRecentsView.TRANSLATION_Y_FACTOR;
import static com.android.quickstep.views.RecentsViewContainer.CONTENT_ALPHA;
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
@@ -40,24 +40,21 @@ import com.android.launcher3.anim.AnimatorSetBuilder;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.PropertySetter;
import com.android.quickstep.views.LauncherRecentsView;
import com.android.quickstep.views.RecentsViewContainer;
@TargetApi(Build.VERSION_CODES.O)
public class RecentsViewStateController implements StateHandler {
private final Launcher mLauncher;
private final LauncherRecentsView mRecentsView;
private final RecentsViewContainer mRecentsViewContainer;
public RecentsViewStateController(Launcher launcher) {
mLauncher = launcher;
mRecentsView = launcher.getOverviewPanel();
mRecentsViewContainer = launcher.getOverviewPanelContainer();
}
@Override
public void setState(LauncherState state) {
mRecentsViewContainer.setContentAlpha(state.overviewUi ? 1 : 0);
mRecentsView.setContentAlpha(state.overviewUi ? 1 : 0);
float[] scaleTranslationYFactor = state.getOverviewScaleAndTranslationYFactor(mLauncher);
SCALE_PROPERTY.set(mRecentsView, scaleTranslationYFactor[0]);
mRecentsView.setTranslationYFactor(scaleTranslationYFactor[1]);
@@ -86,7 +83,7 @@ public class RecentsViewStateController implements StateHandler {
scaleAndTransYInterpolator);
setter.setFloat(mRecentsView, TRANSLATION_Y_FACTOR, scaleTranslationYFactor[1],
scaleAndTransYInterpolator);
setter.setFloat(mRecentsViewContainer, CONTENT_ALPHA, toState.overviewUi ? 1 : 0,
setter.setFloat(mRecentsView, CONTENT_ALPHA, toState.overviewUi ? 1 : 0,
builder.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT));
if (!toState.overviewUi) {
@@ -115,8 +115,8 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity>
} else {
mTaskBeingDragged = null;
for (int i = 0; i < mRecentsView.getChildCount(); i++) {
TaskView view = mRecentsView.getPageAt(i);
for (int i = 0; i < mRecentsView.getTaskViewCount(); i++) {
TaskView view = mRecentsView.getTaskViewAt(i);
if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer()
.isEventOverView(view, ev)) {
mTaskBeingDragged = view;
@@ -25,6 +25,7 @@ import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL;
import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB;
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_ROTATION;
@@ -67,7 +68,6 @@ import com.android.quickstep.util.RemoteAnimationTargetSet;
import com.android.quickstep.util.TransformedRect;
import com.android.quickstep.views.LauncherLayoutListener;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -293,7 +293,7 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
*/
private void playScaleDownAnim(AnimatorSet anim, Launcher launcher) {
RecentsView recentsView = launcher.getOverviewPanel();
TaskView v = recentsView.getPageAt(recentsView.getCurrentPage());
TaskView v = recentsView.getTaskViewAt(recentsView.getCurrentPage());
ClipAnimationHelper clipHelper = new ClipAnimationHelper();
clipHelper.fromTaskThumbnailView(v.getThumbnail(), (RecentsView) v.getParent(), null);
if (!clipHelper.getSourceRect().isEmpty() && !clipHelper.getTargetRect().isEmpty()) {
@@ -466,7 +466,7 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
return (transitionLength, interactionType) -> { };
}
RecentsViewContainer rv = activity.getOverviewPanelContainer();
RecentsView rv = activity.getOverviewPanel();
rv.setContentAlpha(0);
return new AnimationFactory() {
@@ -490,8 +490,7 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
return;
}
ObjectAnimator anim = ObjectAnimator
.ofFloat(rv, RecentsViewContainer.CONTENT_ALPHA, 0, 1);
ObjectAnimator anim = ObjectAnimator.ofFloat(rv, CONTENT_ALPHA, 0, 1);
anim.setDuration(transitionLength).setInterpolator(LINEAR);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(anim);
@@ -98,7 +98,7 @@ public class QuickScrubController implements OnAlarmListener {
}
int page = mRecentsView.getNextPage();
Runnable launchTaskRunnable = () -> {
TaskView taskView = mRecentsView.getPageAt(page);
TaskView taskView = mRecentsView.getTaskViewAt(page);
if (taskView != null) {
mWaitingForTaskLaunch = true;
taskView.launchTask(true, (result) -> {
@@ -222,7 +222,7 @@ public class QuickScrubController implements OnAlarmListener {
private void goToPageWithHaptic(int pageToGoTo, int overrideDuration, boolean forceHaptic,
Interpolator interpolator) {
pageToGoTo = Utilities.boundToRange(pageToGoTo, 0, mRecentsView.getPageCount() - 1);
pageToGoTo = Utilities.boundToRange(pageToGoTo, 0, mRecentsView.getTaskViewCount() - 1);
boolean snappingToPage = pageToGoTo != mRecentsView.getNextPage();
if (snappingToPage) {
int duration = overrideDuration > -1 ? overrideDuration
@@ -246,7 +246,7 @@ public class QuickScrubController implements OnAlarmListener {
return;
}
if (mQuickScrubSection == QUICK_SCRUB_THRESHOLDS.length
&& currPage < mRecentsView.getPageCount() - 1) {
&& currPage < mRecentsView.getTaskViewCount() - 1) {
goToPageWithHaptic(currPage + 1);
} else if (mQuickScrubSection == 0 && currPage > 0) {
goToPageWithHaptic(currPage - 1);
@@ -52,7 +52,6 @@ import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsRootView;
import com.android.quickstep.util.ClipAnimationHelper;
import com.android.quickstep.views.RecentsViewContainer;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.system.ActivityOptionsCompat;
import com.android.systemui.shared.system.RemoteAnimationAdapterCompat;
@@ -70,7 +69,6 @@ public class RecentsActivity extends BaseDraggingActivity {
private Handler mUiHandler = new Handler(Looper.getMainLooper());
private RecentsRootView mRecentsRootView;
private FallbackRecentsView mFallbackRecentsView;
private RecentsViewContainer mOverviewPanelContainer;
private Configuration mOldConfig;
@@ -84,7 +82,6 @@ public class RecentsActivity extends BaseDraggingActivity {
setContentView(R.layout.fallback_recents_activity);
mRecentsRootView = findViewById(R.id.drag_layer);
mFallbackRecentsView = findViewById(R.id.overview_panel);
mOverviewPanelContainer = findViewById(R.id.overview_panel_container);
mRecentsRootView.setup();
@@ -166,10 +163,6 @@ public class RecentsActivity extends BaseDraggingActivity {
return (T) mFallbackRecentsView;
}
public RecentsViewContainer getOverviewPanelContainer() {
return mOverviewPanelContainer;
}
@Override
public BadgeInfo getBadgeInfoForItem(ItemInfo info) {
return null;
@@ -104,8 +104,8 @@ public class TaskUtils {
ComponentName componentName = itemInfo.getTargetComponent();
int userId = itemInfo.user.getIdentifier();
if (componentName != null) {
for (int i = 0; i < recentsView.getChildCount(); i++) {
TaskView taskView = recentsView.getPageAt(i);
for (int i = 0; i < recentsView.getTaskViewCount(); i++) {
TaskView taskView = recentsView.getTaskViewAt(i);
if (recentsView.isTaskViewVisible(taskView)) {
Task.TaskKey key = taskView.getTask().key;
if (componentName.equals(key.getComponent()) && userId == key.userId) {
@@ -17,34 +17,57 @@
package com.android.quickstep.views;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
public class ClearAllButton extends Button {
RecentsView mRecentsView;
import com.android.launcher3.Utilities;
import com.android.quickstep.views.RecentsView.PageCallbacks;
import com.android.quickstep.views.RecentsView.ScrollState;
public ClearAllButton(Context context, @Nullable AttributeSet attrs) {
public class ClearAllButton extends Button implements PageCallbacks {
private float mScrollAlpha = 1;
private float mContentAlpha = 1;
private final boolean mIsRtl;
private int mScrollOffset;
public ClearAllButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setRecentsView(RecentsView recentsView) {
mRecentsView = recentsView;
mIsRtl = Utilities.isRtl(context.getResources());
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setParent(mRecentsView); // Pretend we are a part of the task carousel.
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
RecentsView parent = (RecentsView) getParent();
mScrollOffset = mIsRtl ? parent.getPaddingRight() / 2 : - parent.getPaddingLeft() / 2;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
mRecentsView.revealClearAllButton();
public boolean hasOverlappingRendering() {
return false;
}
public void setContentAlpha(float alpha) {
if (mContentAlpha != alpha) {
mContentAlpha = alpha;
setAlpha(mScrollAlpha * mContentAlpha);
}
}
@Override
public void onPageScroll(ScrollState scrollState) {
float width = getWidth();
if (width == 0) {
return;
}
float shift = Math.min(scrollState.scrollFromEdge, width);
setTranslationX(mIsRtl ? (mScrollOffset - shift) : (mScrollOffset + shift));
mScrollAlpha = 1 - shift / width;
setAlpha(mScrollAlpha * mContentAlpha);
}
}
@@ -40,7 +40,6 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.support.annotation.Nullable;
@@ -49,6 +48,7 @@ import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.SparseBooleanArray;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
@@ -90,7 +90,6 @@ import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
/**
@@ -101,6 +100,19 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
private static final String TAG = RecentsView.class.getSimpleName();
public static final FloatProperty<RecentsView> CONTENT_ALPHA =
new FloatProperty<RecentsView>("contentAlpha") {
@Override
public void setValue(RecentsView view, float v) {
view.setContentAlpha(v);
}
@Override
public Float get(RecentsView view) {
return view.getContentAlpha();
}
};
private final Rect mTempRect = new Rect();
private static final int DISMISS_TASK_DURATION = 300;
@@ -114,13 +126,12 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
private final float mFastFlingVelocity;
private final RecentsModel mModel;
private final int mTaskTopMargin;
private final ClearAllButton mClearAllButton;
private final ScrollState mScrollState = new ScrollState();
// Keeps track of the previously known visible tasks for purposes of loading/unloading task data
private final SparseBooleanArray mHasVisibleTaskData = new SparseBooleanArray();
private boolean mIsClearAllButtonFullyRevealed;
/**
* TODO: Call reloadIdNeeded in onTaskStackChanged.
*/
@@ -228,8 +239,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
// Keeps track of task views whose visual state should not be reset
private ArraySet<TaskView> mIgnoreResetTaskViews = new ArraySet<>();
private View mClearAllButton;
// Variables for empty state
private final Drawable mEmptyIcon;
private final CharSequence mEmptyMessage;
@@ -259,6 +268,10 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
mQuickScrubController = new QuickScrubController(mActivity, this);
mModel = RecentsModel.getInstance(context);
mClearAllButton = (ClearAllButton) LayoutInflater.from(context)
.inflate(R.layout.overview_clear_all_button, this, false);
mClearAllButton.setOnClickListener(this::dismissAllTasks);
mIsRtl = !Utilities.isRtl(getResources());
setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
mTaskTopMargin = getResources()
@@ -275,7 +288,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
.getDimensionPixelSize(R.dimen.recents_empty_message_text_padding);
setWillNotDraw(false);
updateEmptyMessage();
setFocusable(false);
}
public boolean isRtl() {
@@ -317,14 +329,15 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
super.onViewRemoved(child);
// Clear the task data for the removed child if it was visible
Task task = ((TaskView) child).getTask();
if (mHasVisibleTaskData.get(task.key.id)) {
mHasVisibleTaskData.delete(task.key.id);
RecentsTaskLoader loader = mModel.getRecentsTaskLoader();
loader.unloadTaskData(task);
loader.getHighResThumbnailLoader().onTaskInvisible(task);
if (child != mClearAllButton) {
Task task = ((TaskView) child).getTask();
if (mHasVisibleTaskData.get(task.key.id)) {
mHasVisibleTaskData.delete(task.key.id);
RecentsTaskLoader loader = mModel.getRecentsTaskLoader();
loader.unloadTaskData(task);
loader.getHighResThumbnailLoader().onTaskInvisible(task);
}
}
onChildViewsChanged();
}
public boolean isTaskViewVisible(TaskView tv) {
@@ -333,7 +346,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
}
public TaskView getTaskView(int taskId) {
for (int i = 0; i < getChildCount(); i++) {
for (int i = 0; i < getTaskViewCount(); i++) {
TaskView tv = (TaskView) getChildAt(i);
if (tv.getTask().key.id == taskId) {
return tv;
@@ -363,75 +376,14 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
}
}
private int getScrollEnd() {
return mIsRtl ? 0 : mMaxScrollX;
}
private float calculateClearAllButtonAlpha() {
final int childCount = getChildCount();
if (mShowEmptyMessage || childCount == 0 || mPageScrolls == null
|| childCount != mPageScrolls.length) {
return 0;
}
final int scrollEnd = getScrollEnd();
final int oldestChildScroll = getScrollForPage(childCount - 1);
final int clearAllButtonMotionRange = scrollEnd - oldestChildScroll;
if (clearAllButtonMotionRange == 0) return 0;
final float alphaUnbound = ((float) (getScrollX() - oldestChildScroll)) /
clearAllButtonMotionRange;
if (alphaUnbound > 1) return 0;
return Math.max(alphaUnbound, 0);
}
private void updateClearAllButtonAlpha() {
if (mClearAllButton != null) {
final float alpha = calculateClearAllButtonAlpha();
final boolean revealed = alpha == 1;
if (mIsClearAllButtonFullyRevealed != revealed) {
mIsClearAllButtonFullyRevealed = revealed;
mClearAllButton.setImportantForAccessibility(revealed ?
IMPORTANT_FOR_ACCESSIBILITY_YES :
IMPORTANT_FOR_ACCESSIBILITY_NO);
}
mClearAllButton.setAlpha(alpha * mContentAlpha);
}
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
updateClearAllButtonAlpha();
}
@Override
protected void restoreScrollOnLayout() {
if (mIsClearAllButtonFullyRevealed) {
scrollAndForceFinish(getScrollEnd());
} else {
super.restoreScrollOnLayout();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN && mTouchState == TOUCH_STATE_REST
&& mScroller.isFinished() && mIsClearAllButtonFullyRevealed) {
mClearAllButton.getHitRect(mTempRect);
mTempRect.offset(-getLeft(), -getTop());
if (mTempRect.contains((int) ev.getX(), (int) ev.getY())) {
// If nothing is in motion, let the Clear All button process the event.
return false;
}
}
super.onTouchEvent(ev);
if (ev.getAction() == MotionEvent.ACTION_UP && mShowEmptyMessage) {
onAllTasksRemoved();
}
return super.onTouchEvent(ev);
// Do not let touch escape to siblings below this view.
return true;
}
private void applyLoadPlan(RecentsTaskLoadPlan loadPlan) {
@@ -453,22 +405,30 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
final LayoutInflater inflater = LayoutInflater.from(getContext());
final ArrayList<Task> tasks = new ArrayList<>(stack.getTasks());
final int requiredChildCount = tasks.size();
for (int i = getChildCount(); i < requiredChildCount; i++) {
final TaskView taskView = (TaskView) inflater.inflate(R.layout.task, this, false);
addView(taskView);
}
while (getChildCount() > requiredChildCount) {
final TaskView taskView = (TaskView) getChildAt(getChildCount() - 1);
removeView(taskView);
final int requiredTaskCount = tasks.size();
if (getTaskViewCount() != requiredTaskCount) {
if (oldChildCount > 0) {
removeView(mClearAllButton);
}
for (int i = getChildCount(); i < requiredTaskCount; i++) {
final TaskView taskView = (TaskView) inflater.inflate(R.layout.task, this, false);
addView(taskView);
}
while (getChildCount() > requiredTaskCount) {
final TaskView taskView = (TaskView) getChildAt(getChildCount() - 1);
removeView(taskView);
}
if (requiredTaskCount > 0) {
addView(mClearAllButton);
}
}
// Unload existing visible task data
unloadVisibleTaskData();
// Rebind and reset all task views
for (int i = requiredChildCount - 1; i >= 0; i--) {
final int pageIndex = requiredChildCount - i - 1;
for (int i = requiredTaskCount - 1; i >= 0; i--) {
final int pageIndex = requiredTaskCount - i - 1;
final Task task = tasks.get(i);
final TaskView taskView = (TaskView) getChildAt(pageIndex);
taskView.bind(task);
@@ -481,10 +441,16 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
onTaskStackUpdated();
}
public int getTaskViewCount() {
// Account for the clear all button.
int childCount = getChildCount();
return childCount == 0 ? 0 : childCount - 1;
}
protected void onTaskStackUpdated() { }
public void resetTaskVisuals() {
for (int i = getChildCount() - 1; i >= 0; i--) {
for (int i = getTaskViewCount() - 1; i >= 0; i--) {
TaskView taskView = (TaskView) getChildAt(i);
if (!mIgnoreResetTaskViews.contains(taskView)) {
taskView.resetVisualProperties();
@@ -558,10 +524,12 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
if (getPageCount() == 0 || getPageAt(0).getMeasuredWidth() == 0) {
return;
}
int scrollX = getScrollX();
final int halfPageWidth = getNormalChildWidth() / 2;
final int screenCenter = mInsets.left + getPaddingLeft() + getScrollX() + halfPageWidth;
final int screenCenter = mInsets.left + getPaddingLeft() + scrollX + halfPageWidth;
final int halfScreenWidth = getMeasuredWidth() / 2;
final int pageSpacing = mPageSpacing;
mScrollState.scrollFromEdge = mIsRtl ? scrollX : (mMaxScrollX - scrollX);
final int pageCount = getPageCount();
for (int i = 0; i < pageCount; i++) {
@@ -587,9 +555,9 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
RecentsTaskLoader loader = mModel.getRecentsTaskLoader();
int centerPageIndex = getPageNearestToCenterOfScreen();
int numChildren = getTaskViewCount();
int lower = Math.max(0, centerPageIndex - 2);
int upper = Math.min(centerPageIndex + 2, getChildCount() - 1);
int numChildren = getChildCount();
int upper = Math.min(centerPageIndex + 2, numChildren - 1);
// Update the task data for the in/visible children
for (int i = 0; i < numChildren; i++) {
@@ -667,6 +635,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
final TaskView taskView = (TaskView) LayoutInflater.from(getContext())
.inflate(R.layout.task, this, false);
addView(taskView);
addView(mClearAllButton);
// The temporary running task is only used for the duration between the start of the
// gesture and the task list is loaded and applied
@@ -713,14 +682,14 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
TaskView runningTaskView = getTaskView(mRunningTaskId);
if (runningTaskView == null) {
// Launch the first task
if (getChildCount() > 0) {
if (getTaskViewCount() > 0) {
((TaskView) getChildAt(0)).launchTask(true /* animate */);
}
} else {
// Get the next launch task
int runningTaskIndex = indexOfChild(runningTaskView);
int nextTaskIndex = Math.max(0, Math.min(getChildCount() - 1, runningTaskIndex + 1));
if (nextTaskIndex < getChildCount()) {
int nextTaskIndex = Math.max(0, Math.min(getTaskViewCount() - 1, runningTaskIndex + 1));
if (nextTaskIndex < getTaskViewCount()) {
((TaskView) getChildAt(nextTaskIndex)).launchTask(true /* animate */);
}
}
@@ -763,7 +732,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
/**
* Updates the page UI based on scroll params.
*/
default void onPageScroll(ScrollState scrollState) {};
default void onPageScroll(ScrollState scrollState) {}
}
public static class ScrollState {
@@ -773,6 +742,11 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
* of the screen and 1 is the edge of the screen.
*/
public float linearInterpolation;
/**
* The amount by which all the content is scrolled relative to the end of the list.
*/
public float scrollFromEdge;
}
public void addIgnoreResetTask(TaskView taskView) {
@@ -809,7 +783,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
AnimatorSet anim = new AnimatorSet();
PendingAnimation pendingAnimation = new PendingAnimation(anim);
int count = getChildCount();
int count = getPageCount();
if (count == 0) {
return pendingAnimation;
}
@@ -820,12 +794,10 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
int[] newScroll = new int[count];
getPageScrolls(newScroll, false, (v) -> v.getVisibility() != GONE && v != taskView);
int taskCount = getTaskViewCount();
int scrollDiffPerPage = 0;
int leftmostPage = mIsRtl ? count -1 : 0;
int rightmostPage = mIsRtl ? 0 : count - 1;
if (count > 1) {
int secondRightmostPage = mIsRtl ? 1 : count - 2;
scrollDiffPerPage = oldScroll[rightmostPage] - oldScroll[secondRightmostPage];
scrollDiffPerPage = Math.abs(oldScroll[1] - oldScroll[0]);
}
int draggedIndex = indexOfChild(taskView);
@@ -845,7 +817,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
// - Dragging an adjacent page on the left side (right side for RTL)
int offset = mIsRtl ? scrollDiffPerPage : 0;
if (mCurrentPage == draggedIndex) {
int lastPage = mIsRtl ? leftmostPage : rightmostPage;
int lastPage = taskCount - 1;
if (mCurrentPage == lastPage) {
offset += mIsRtl ? -scrollDiffPerPage : scrollDiffPerPage;
}
@@ -883,13 +855,15 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
removeTask(taskView.getTask(), draggedIndex, onEndListener, true);
}
int pageToSnapTo = mCurrentPage;
if (draggedIndex < pageToSnapTo) {
if (draggedIndex < pageToSnapTo || pageToSnapTo == (getTaskViewCount() - 1)) {
pageToSnapTo -= 1;
}
removeView(taskView);
if (getChildCount() == 0) {
if (getTaskViewCount() == 0) {
removeView(mClearAllButton);
onAllTasksRemoved();
} else if (!mIsClearAllButtonFullyRevealed) {
} else {
snapToPageImmediately(pageToSnapTo);
}
}
@@ -906,7 +880,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
AnimatorSet anim = new AnimatorSet();
PendingAnimation pendingAnimation = new PendingAnimation(anim);
int count = getChildCount();
int count = getTaskViewCount();
for (int i = 0; i < count; i++) {
addDismissedTaskAnimations(getChildAt(i), anim, duration);
}
@@ -914,11 +888,11 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
mPendingAnimation = pendingAnimation;
mPendingAnimation.addEndListener((onEndListener) -> {
if (onEndListener.isSuccess) {
while (getChildCount() != 0) {
TaskView taskView = getPageAt(getChildCount() - 1);
removeTask(taskView.getTask(), -1, onEndListener, false);
removeView(taskView);
int taskViewCount = getTaskViewCount();
for (int i = 0; i < taskViewCount; i++) {
removeTask(getTaskViewAt(i).getTask(), -1, onEndListener, false);
}
removeAllViews();
onAllTasksRemoved();
}
mPendingAnimation = null;
@@ -932,15 +906,16 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
set.play(anim);
}
private boolean snapToPageRelative(int delta, boolean cycle) {
if (getPageCount() == 0) {
private boolean snapToPageRelative(int pageCount, int delta, boolean cycle) {
if (pageCount == 0) {
return false;
}
final int newPageUnbound = getNextPage() + delta;
if (!cycle && (newPageUnbound < 0 || newPageUnbound >= getChildCount())) {
if (!cycle && (newPageUnbound < 0 || newPageUnbound >= pageCount)) {
return false;
}
snapToPage((newPageUnbound + getPageCount()) % getPageCount());
snapToPage((newPageUnbound + pageCount) % pageCount);
getChildAt(getNextPage()).requestFocus();
return true;
}
@@ -958,31 +933,37 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
DISMISS_TASK_DURATION));
}
public void dismissAllTasks() {
@SuppressWarnings("unused")
private void dismissAllTasks(View view) {
runDismissAnimation(createAllTasksDismissAnimation(DISMISS_TASK_DURATION));
}
private void dismissCurrentTask() {
TaskView taskView = getTaskView(getNextPage());
if (taskView != null) {
dismissTask(taskView, true /*animateTaskView*/, true /*removeTask*/);
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_TAB:
return snapToPageRelative(event.isShiftPressed() ? -1 : 1,
return snapToPageRelative(getTaskViewCount(), event.isShiftPressed() ? -1 : 1,
event.isAltPressed() /* cycle */);
case KeyEvent.KEYCODE_DPAD_RIGHT:
return snapToPageRelative(mIsRtl ? -1 : 1, false /* cycle */);
return snapToPageRelative(getPageCount(), mIsRtl ? -1 : 1, false /* cycle */);
case KeyEvent.KEYCODE_DPAD_LEFT:
return snapToPageRelative(mIsRtl ? 1 : -1, false /* cycle */);
return snapToPageRelative(getPageCount(), mIsRtl ? 1 : -1, false /* cycle */);
case KeyEvent.KEYCODE_DEL:
case KeyEvent.KEYCODE_FORWARD_DEL:
dismissTask((TaskView) getChildAt(getNextPage()), true /*animateTaskView*/,
true /*removeTask*/);
dismissCurrentTask();
return true;
case KeyEvent.KEYCODE_NUMPAD_DOT:
if (event.isAltPressed()) {
// Numpad DEL pressed while holding Alt.
dismissTask((TaskView) getChildAt(getNextPage()), true /*animateTaskView*/,
true /*removeTask*/);
dismissCurrentTask();
return true;
}
}
@@ -1013,19 +994,24 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
}
public void setContentAlpha(float alpha) {
if (alpha == mContentAlpha) {
return;
}
alpha = Utilities.boundToRange(alpha, 0, 1);
mContentAlpha = alpha;
for (int i = getChildCount() - 1; i >= 0; i--) {
TaskView child = getPageAt(i);
for (int i = getTaskViewCount() - 1; i >= 0; i--) {
TaskView child = getTaskViewAt(i);
if (!mRunningTaskTileHidden || child.getTask().key.id != mRunningTaskId) {
getChildAt(i).setAlpha(alpha);
}
}
mClearAllButton.setContentAlpha(mContentAlpha);
int alphaInt = Math.round(alpha * 255);
mEmptyMessagePaint.setAlpha(alphaInt);
mEmptyIcon.setAlpha(alphaInt);
updateClearAllButtonAlpha();
setVisibility(alpha > 0 ? VISIBLE : GONE);
}
private float[] getAdjacentScaleAndTranslation(TaskView currTask,
@@ -1041,12 +1027,11 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
public void onViewAdded(View child) {
super.onViewAdded(child);
child.setAlpha(mContentAlpha);
onChildViewsChanged();
}
@Override
public TaskView getPageAt(int index) {
return (TaskView) getChildAt(index);
public TaskView getTaskViewAt(int index) {
View child = getChildAt(index);
return child == mClearAllButton ? null : (TaskView) child;
}
public void updateEmptyMessage() {
@@ -1080,7 +1065,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
mEmptyTextLayout = null;
mLastMeasureSize.set(getWidth(), getHeight());
}
updateClearAllButtonAlpha();
if (mShowEmptyMessage && hasValidSize && mEmptyTextLayout == null) {
int availableWidth = mLastMeasureSize.x - mEmptyMessagePadding - mEmptyMessagePadding;
@@ -1138,16 +1122,16 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
float toTranslationY = clipAnimationHelper.getSourceRect().centerY()
- clipAnimationHelper.getTargetRect().centerY();
if (launchingCenterTask) {
TaskView centerTask = getPageAt(centerTaskIndex);
TaskView centerTask = getTaskViewAt(centerTaskIndex);
if (taskIndex - 1 >= 0) {
TaskView adjacentTask = getPageAt(taskIndex - 1);
TaskView adjacentTask = getTaskViewAt(taskIndex - 1);
float[] scaleAndTranslation = getAdjacentScaleAndTranslation(centerTask,
toScale, toTranslationY);
scaleAndTranslation[1] = -scaleAndTranslation[1];
anim.play(createAnimForChild(adjacentTask, scaleAndTranslation));
}
if (taskIndex + 1 < getPageCount()) {
TaskView adjacentTask = getPageAt(taskIndex + 1);
if (taskIndex + 1 < getTaskViewCount()) {
TaskView adjacentTask = getTaskViewAt(taskIndex + 1);
float[] scaleAndTranslation = getAdjacentScaleAndTranslation(centerTask,
toScale, toTranslationY);
anim.play(createAnimForChild(adjacentTask, scaleAndTranslation));
@@ -1269,67 +1253,9 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
return "";
}
private int additionalScrollForClearAllButton() {
return (int) getResources().getDimension(
R.dimen.clear_all_container_width) - getPaddingEnd();
}
@Override
protected int computeMaxScrollX() {
if (getChildCount() == 0) {
return super.computeMaxScrollX();
}
// Allow a clear_all_container_width-sized gap after the last task.
return super.computeMaxScrollX() + (mIsRtl ? 0 : additionalScrollForClearAllButton());
}
@Override
protected int offsetForPageScrolls() {
return mIsRtl ? additionalScrollForClearAllButton() : 0;
}
public void setClearAllButton(View clearAllButton) {
mClearAllButton = clearAllButton;
updateClearAllButtonAlpha();
}
private void onChildViewsChanged() {
final int childCount = getChildCount();
mClearAllButton.setVisibility(childCount == 0 ? INVISIBLE : VISIBLE);
setFocusable(childCount != 0);
}
public void revealClearAllButton() {
setCurrentPage(getChildCount() - 1); // Loads tasks info if needed.
scrollTo(mIsRtl ? 0 : computeMaxScrollX(), 0);
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
if (getChildCount() > 0) {
switch (action) {
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
if (!mIsClearAllButtonFullyRevealed && getCurrentPage() == getPageCount() - 1) {
revealClearAllButton();
return true;
}
}
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
if (mIsClearAllButtonFullyRevealed) {
setCurrentPage(getChildCount() - 1);
return true;
}
}
break;
}
}
return super.performAccessibilityAction(action, arguments);
}
@Override
public void addChildrenForAccessibility(ArrayList<View> outChildren) {
outChildren.add(mClearAllButton);
// Add children in reverse order
for (int i = getChildCount() - 1; i >= 0; --i) {
outChildren.add(getChildAt(i));
}
@@ -1338,17 +1264,9 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
if (getChildCount() > 0) {
info.addAction(mIsClearAllButtonFullyRevealed ?
AccessibilityNodeInfo.ACTION_SCROLL_FORWARD :
AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
info.setScrollable(true);
}
final AccessibilityNodeInfo.CollectionInfo
collectionInfo = AccessibilityNodeInfo.CollectionInfo.obtain(
1, getChildCount(), false,
1, getTaskViewCount(), false,
AccessibilityNodeInfo.CollectionInfo.SELECTION_MODE_NONE);
info.setCollectionInfo(collectionInfo);
}
@@ -1357,15 +1275,14 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setScrollable(getPageCount() > 0);
final int taskViewCount = getTaskViewCount();
event.setScrollable(taskViewCount > 0);
if (!mIsClearAllButtonFullyRevealed
&& event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
final int childCount = getChildCount();
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
final int[] visibleTasks = getVisibleChildrenRange();
event.setFromIndex(childCount - visibleTasks[1] - 1);
event.setToIndex(childCount - visibleTasks[0] - 1);
event.setItemCount(childCount);
event.setFromIndex(taskViewCount - visibleTasks[1] - 1);
event.setToIndex(taskViewCount - visibleTasks[0] - 1);
event.setItemCount(taskViewCount);
}
}
@@ -1379,8 +1296,4 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
protected boolean isPageOrderFlipped() {
return true;
}
public boolean performTaskAccessibilityActionExtra(int action) {
return false;
}
}
@@ -1,132 +0,0 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.views;
import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.TAP;
import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.CLEAR_ALL_BUTTON;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.view.MotionEvent;
import android.view.View;
import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.R;
import java.util.ArrayList;
public class RecentsViewContainer extends InsettableFrameLayout {
public static final FloatProperty<RecentsViewContainer> CONTENT_ALPHA =
new FloatProperty<RecentsViewContainer>("contentAlpha") {
@Override
public void setValue(RecentsViewContainer view, float v) {
view.setContentAlpha(v);
}
@Override
public Float get(RecentsViewContainer view) {
return view.mRecentsView.getContentAlpha();
}
};
private final Rect mTempRect = new Rect();
private RecentsView mRecentsView;
private ClearAllButton mClearAllButton;
public RecentsViewContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mClearAllButton = findViewById(R.id.clear_all_button);
mClearAllButton.setOnClickListener((v) -> {
mRecentsView.mActivity.getUserEventDispatcher()
.logActionOnControl(TAP, CLEAR_ALL_BUTTON);
mRecentsView.dismissAllTasks();
});
mRecentsView = findViewById(R.id.overview_panel);
mClearAllButton.forceHasOverlappingRendering(false);
mRecentsView.setClearAllButton(mClearAllButton);
mClearAllButton.setRecentsView(mRecentsView);
if (mRecentsView.isRtl()) {
mClearAllButton.setNextFocusRightId(mRecentsView.getId());
mRecentsView.setNextFocusLeftId(mClearAllButton.getId());
} else {
mClearAllButton.setNextFocusLeftId(mRecentsView.getId());
mRecentsView.setNextFocusRightId(mClearAllButton.getId());
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mRecentsView.getTaskSize(mTempRect);
mClearAllButton.setTranslationX(
(mRecentsView.isRtl() ? 1 : -1) *
(getResources().getDimension(R.dimen.clear_all_container_width)
- mClearAllButton.getMeasuredWidth()) / 2);
mClearAllButton.setTranslationY(
mTempRect.top + (mTempRect.height() - mClearAllButton.getMeasuredHeight()) / 2
- mClearAllButton.getTop());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
// Do not let touch escape to siblings below this view. This prevents scrolling of the
// workspace while in Recents.
return true;
}
public void setContentAlpha(float alpha) {
if (alpha == mRecentsView.getContentAlpha()) {
return;
}
mRecentsView.setContentAlpha(alpha);
setVisibility(alpha > 0 ? VISIBLE : GONE);
}
@Override
public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
if (mRecentsView.getChildCount() > 0) {
// Carousel is first in tab order.
views.add(mRecentsView);
views.add(mClearAllButton);
}
}
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
return mRecentsView.requestFocus(direction, previouslyFocusedRect) ||
super.requestFocus(direction, previouslyFocusedRect);
}
@Override
public void addChildrenForAccessibility(ArrayList<View> outChildren) {
outChildren.add(mRecentsView);
}
}
@@ -121,6 +121,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback
TaskUtils.getLaunchComponentKeyForTask(getTask().key));
});
setOutlineProvider(new TaskOutlineProvider(getResources()));
setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
}
@Override
@@ -347,8 +348,6 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback
}
}
if (getRecentsView().performTaskAccessibilityActionExtra(action)) return true;
return super.performAccessibilityAction(action, arguments);
}
+1 -1
View File
@@ -39,7 +39,7 @@
launcher:pageIndicator="@+id/page_indicator" />
<include
android:id="@+id/overview_panel_container"
android:id="@+id/overview_panel"
layout="@layout/overview_panel"
android:visibility="gone" />
+1
View File
@@ -122,6 +122,7 @@
<item name="android:saveEnabled">false</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:includeFontPadding">false</item>
<item name="android:importantForAccessibility">no</item>
</style>
<!-- Base theme for BubbleTextView and sub classes -->
-7
View File
@@ -214,8 +214,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
// UI and state for the overview panel
private View mOverviewPanel;
private View mOverviewPanelContainer;
@Thunk boolean mWorkspaceLoading = true;
private OnResumeCallback mOnResumeCallback;
@@ -913,7 +911,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
mWorkspace = mDragLayer.findViewById(R.id.workspace);
mWorkspace.initParentViews(mDragLayer);
mOverviewPanel = findViewById(R.id.overview_panel);
mOverviewPanelContainer = findViewById(R.id.overview_panel_container);
mHotseat = findViewById(R.id.hotseat);
mHotseatSearchBox = findViewById(R.id.search_container_hotseat);
@@ -1174,10 +1171,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
return (T) mOverviewPanel;
}
public <T extends View> T getOverviewPanelContainer() {
return (T) mOverviewPanelContainer;
}
public DropTargetBar getDropTargetBar() {
return mDropTargetBar;
}
+16 -26
View File
@@ -24,7 +24,6 @@ import android.animation.TimeInterpolator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.Bundle;
import android.provider.Settings;
@@ -142,8 +141,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
protected T mPageIndicator;
// Convenience/caching
private static final Matrix sTmpInvMatrix = new Matrix();
private static final float[] sTmpPoint = new float[2];
private static final Rect sTmpRect = new Rect();
protected final Rect mInsets = new Rect();
@@ -242,12 +239,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
return index;
}
protected void scrollAndForceFinish(int scrollX) {
scrollTo(scrollX, 0);
mScroller.setFinalX(scrollX);
forceFinishScroller(true);
}
/**
* Updates the scroll of the current page immediately to its final scroll position. We use this
* in CustomizePagedView to allow tabs to share the same PagedView while resetting the scroll of
@@ -259,7 +250,9 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
if (0 <= mCurrentPage && mCurrentPage < getPageCount()) {
newX = getScrollForPage(mCurrentPage);
}
scrollAndForceFinish(newX);
scrollTo(newX, 0);
mScroller.setFinalX(newX);
forceFinishScroller(true);
}
private void abortScrollerAnimation(boolean resetNextPage) {
@@ -544,10 +537,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
setMeasuredDimension(widthSize, heightSize);
}
protected void restoreScrollOnLayout() {
setCurrentPage(getNextPage());
}
@SuppressLint("DrawAllocation")
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
@@ -599,7 +588,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
}
if (mScroller.isFinished() && pageScrollChanged) {
restoreScrollOnLayout();
setCurrentPage(getNextPage());
}
}
@@ -620,23 +609,26 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
- mInsets.bottom - getPaddingBottom()) / 2;
final int scrollOffsetLeft = mInsets.left + getPaddingLeft();
final int scrollOffsetRight = getWidth() - getPaddingRight() - mInsets.right;
boolean pageScrollChanged = false;
for (int i = startIndex, childLeft = scrollOffsetLeft + offsetForPageScrolls();
i != endIndex;
i += delta) {
for (int i = startIndex, childLeft = scrollOffsetLeft; i != endIndex; i += delta) {
final View child = getPageAt(i);
if (scrollLogic.shouldIncludeView(child)) {
final int childTop = verticalCenter - child.getMeasuredHeight() / 2;
final int childWidth = child.getMeasuredWidth();
final int childRight = childLeft + childWidth;
if (layoutChildren) {
final int childHeight = child.getMeasuredHeight();
child.layout(childLeft, childTop,
childLeft + child.getMeasuredWidth(), childTop + childHeight);
final int childTop = verticalCenter - childHeight / 2;
child.layout(childLeft, childTop, childRight, childTop + childHeight);
}
final int pageScroll = childLeft - scrollOffsetLeft;
// In case the pages are of different width, align the page to left or right edge
// based on the orientation.
final int pageScroll = mIsRtl
? (childLeft - scrollOffsetLeft)
: Math.max(0, childRight - scrollOffsetRight);
if (outPageScrolls[i] != pageScroll) {
pageScrollChanged = true;
outPageScrolls[i] = pageScroll;
@@ -666,10 +658,6 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
}
}
protected int offsetForPageScrolls() {
return 0;
}
public void setPageSpacing(int pageSpacing) {
mPageSpacing = pageSpacing;
requestLayout();
@@ -747,11 +735,13 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
if (direction == View.FOCUS_LEFT) {
if (getCurrentPage() > 0) {
snapToPage(getCurrentPage() - 1);
getChildAt(getCurrentPage() - 1).requestFocus(direction);
return true;
}
} else if (direction == View.FOCUS_RIGHT) {
if (getCurrentPage() < getPageCount() - 1) {
snapToPage(getCurrentPage() + 1);
getChildAt(getCurrentPage() + 1).requestFocus(direction);
return true;
}
}
@@ -490,6 +490,12 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
});
}
@Override
public void getDrawingRect(Rect outRect) {
super.getDrawingRect(outRect);
outRect.offset(0, (int) getTranslationY());
}
public class AdapterHolder {
public static final int MAIN = 0;
public static final int WORK = 1;