Merge changes from topic "new-caret" into ub-launcher3-master

* changes:
  [automerger] Adding a carent in the scrim am: ef39540dde
  Adding a carent in the scrim
This commit is contained in:
android-build-team Robot 2018-05-09 20:12:59 +00:00 committed by Android (Google) Code Review
commit ae59144edb
17 changed files with 254 additions and 316 deletions

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.quickstep.views.QuickstepDragIndicator
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drag_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/accessibility_desc_recent_apps"
android:scaleType="centerInside"
android:tint="?attr/workspaceTextColor" />

View File

@ -51,5 +51,4 @@
<dimen name="clear_all_container_width">168dp</dimen>
<dimen name="shelf_surface_radius">16dp</dimen>
<dimen name="shelf_surface_top_padding">4dp</dimen>
</resources>

View File

@ -92,9 +92,9 @@ public class OverviewState extends LauncherState {
@Override
public int getVisibleElements(Launcher launcher) {
if (launcher.getDeviceProfile().isVerticalBarLayout()) {
return DRAG_HANDLE_INDICATOR;
return 0;
} else {
return HOTSEAT_SEARCH_BOX | DRAG_HANDLE_INDICATOR |
return HOTSEAT_SEARCH_BOX |
(launcher.getAppsView().getFloatingHeaderView().hasVisibleContent()
? ALL_APPS_HEADER_EXTRA : HOTSEAT_ICONS);
}

View File

@ -43,8 +43,7 @@ public class LayoutUtils {
extraSpace = 0;
} else {
Resources res = context.getResources();
extraSpace = dp.hotseatBarSizePx + res.getDimension(R.dimen.shelf_surface_top_padding)
+ res.getDimension(R.dimen.shelf_surface_radius);
extraSpace = dp.hotseatBarSizePx + res.getDimension(R.dimen.vertical_drag_handle_size);
}
calculateTaskSize(context, dp, extraSpace, MULTI_WINDOW_STRATEGY_HALF_SCREEN, outRect);
}

View File

@ -1,70 +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.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.OVERVIEW;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import com.android.launcher3.R;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
import com.android.launcher3.views.LauncherDragIndicator;
public class QuickstepDragIndicator extends LauncherDragIndicator {
public QuickstepDragIndicator(Context context) {
super(context);
}
public QuickstepDragIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
}
public QuickstepDragIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private boolean isInOverview() {
return mLauncher.isInState(OVERVIEW);
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setContentDescription(getContext().getString(R.string.all_apps_button_label));
}
@Override
protected void initCustomActions(AccessibilityNodeInfo info) {
if (!isInOverview()) {
super.initCustomActions(info);
}
}
@Override
public void onClick(View view) {
mLauncher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
ControlType.ALL_APPS_BUTTON,
isInOverview() ? ContainerType.TASKSWITCHER : ContainerType.WORKSPACE);
mLauncher.getStateManager().goToState(ALL_APPS);
}
}

View File

@ -31,7 +31,6 @@ import android.graphics.Path.Op;
import android.util.AttributeSet;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.uioverrides.OverviewState;
import com.android.launcher3.util.Themes;
@ -49,8 +48,6 @@ public class ShelfScrimView extends ScrimView {
private static final int THRESHOLD_ALPHA_DARK = 102;
private static final int THRESHOLD_ALPHA_LIGHT = 46;
private final Launcher mLauncher;
// In transposed layout, we simply draw a flat color.
private boolean mDrawingFlatColor;
@ -58,7 +55,6 @@ public class ShelfScrimView extends ScrimView {
private final int mEndAlpha;
private final int mThresholdAlpha;
private final float mRadius;
private final float mTopPadding;
private final float mMaxScrimAlpha;
private final Paint mPaint;
@ -77,15 +73,12 @@ public class ShelfScrimView extends ScrimView {
public ShelfScrimView(Context context, AttributeSet attrs) {
super(context, attrs);
mLauncher = Launcher.getLauncher(context);
mMaxScrimAlpha = OVERVIEW.getWorkspaceScrimAlpha(mLauncher);
mEndAlpha = Color.alpha(mEndScrim);
mThresholdAlpha = Themes.getAttrBoolean(mLauncher, R.attr.isMainColorDark)
? THRESHOLD_ALPHA_DARK : THRESHOLD_ALPHA_LIGHT;
mRadius = mLauncher.getResources().getDimension(R.dimen.shelf_surface_radius);
mTopPadding = mLauncher.getResources().getDimension(R.dimen.shelf_surface_top_padding);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
// Just assume the easiest UI for now, until we have the proper layout information.
@ -110,10 +103,10 @@ public class ShelfScrimView extends ScrimView {
mRemainingScreenPathValid = false;
updateColors();
}
updateDragHandleAlpha();
invalidate();
}
@Override
public void updateColors() {
super.updateColors();
@ -131,6 +124,7 @@ public class ShelfScrimView extends ScrimView {
(1 - mProgress) / (1 - mMoveThreshold)));
mShelfColor = setAlphaComponent(mEndScrim, alpha);
}
mRemainingScreenColor = 0;
} else if (mProgress <= 0) {
mScrimMoveFactor = 0;
@ -149,24 +143,43 @@ public class ShelfScrimView extends ScrimView {
}
}
@Override
protected void updateDragHandleAlpha() {
if (mDrawingFlatColor) {
super.updateDragHandleAlpha();
} else if (mDragHandle != null) {
mDragHandle.setAlpha(255);
}
}
@Override
protected void onDraw(Canvas canvas) {
float translate = drawBackground(canvas);
if (mDragHandle != null) {
canvas.translate(0, -translate);
mDragHandle.draw(canvas);
canvas.translate(0, translate);
}
}
private float drawBackground(Canvas canvas) {
if (mDrawingFlatColor) {
if (mCurrentFlatColor != 0) {
canvas.drawColor(mCurrentFlatColor);
}
return;
return 0;
}
if (mShelfColor == 0) {
return;
return 0;
} else if (mScrimMoveFactor <= 0) {
canvas.drawColor(mShelfColor);
return;
return getHeight();
}
float minTop = getHeight() - mMinSize;
float top = minTop * mScrimMoveFactor - mTopPadding - mRadius;
float top = minTop * mScrimMoveFactor - mDragHandleSize;
// Draw the scrim over the remaining screen if needed.
if (mRemainingScreenColor != 0) {
@ -192,5 +205,6 @@ public class ShelfScrimView extends ScrimView {
mPaint.setColor(mShelfColor);
canvas.drawRoundRect(0, top, getWidth(), getHeight() + mRadius,
mRadius, mRadius, mPaint);
return minTop - mDragHandleSize - top;
}
}

View File

@ -15,25 +15,25 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="@dimen/dynamic_grid_min_page_indicator_size"
android:height="@dimen/dynamic_grid_min_page_indicator_size"
android:viewportWidth="48.0"
android:viewportHeight="48.0" >
android:width="@dimen/vertical_drag_handle_size"
android:height="@dimen/vertical_drag_handle_size"
android:viewportWidth="36.0"
android:viewportHeight="36.0" >
<group
android:translateX="17.5"
android:translateY="17.5">
android:translateX="11.5"
android:translateY="11.5">
<path
android:pathData="M2 8.5L6.5 4L11 8.5"
android:strokeColor="?attr/workspaceAmbientShadowColor"
android:strokeWidth="4"
android:strokeWidth="3.6"
android:strokeLineCap="round"
android:strokeLineJoin="round" />
<path
android:pathData="M2 8.5L6.5 4L11 8.5"
android:strokeColor="?attr/workspaceTextColor"
android:strokeWidth="2"
android:strokeWidth="1.8"
android:strokeLineCap="round"
android:strokeLineJoin="round" />
</group>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="2dp"
android:width="16dp"
android:viewportHeight="2.0"
android:viewportWidth="16.0">
<path
android:fillColor="@android:color/white"
android:pathData="M1,0h14c0.55,0,1,0.45,1,1s-0.45,1-1,1H1C0.45,2,0,1.55,0,1S0.45,0,1,0z"/>
</vector>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.launcher3.views.LauncherDragIndicator
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drag_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/all_apps_button_label"
android:scaleType="centerInside"
android:tint="?attr/workspaceTextColor" />

View File

@ -67,9 +67,6 @@
android:layout_height="match_parent"
android:visibility="invisible" />
<include android:id="@+id/drag_indicator"
layout="@layout/drag_handle_indicator" />
<!-- DO NOT CHANGE THE ID -->
<include
android:id="@+id/hotseat"

View File

@ -42,6 +42,7 @@
<dimen name="all_apps_scrim_radius">8dp</dimen>
<dimen name="all_apps_scrim_margin">8dp</dimen>
<dimen name="all_apps_scrim_blur">4dp</dimen>
<dimen name="vertical_drag_handle_size">24dp</dimen>
<!-- Drop target bar -->
<dimen name="dynamic_grid_drop_target_size">48dp</dimen>

View File

@ -196,7 +196,6 @@ public class Launcher extends BaseDraggingActivity
private final int[] mTmpAddItemCellCoordinates = new int[2];
@Thunk Hotseat mHotseat;
private View mDragHandleIndicator;
@Nullable private View mHotseatSearchBox;
private DropTargetBar mDropTargetBar;
@ -933,7 +932,6 @@ public class Launcher extends BaseDraggingActivity
mOverviewPanel = findViewById(R.id.overview_panel);
mOverviewPanelContainer = findViewById(R.id.overview_panel_container);
mHotseat = findViewById(R.id.hotseat);
mDragHandleIndicator = findViewById(R.id.drag_indicator);
mHotseatSearchBox = findViewById(R.id.search_container_hotseat);
mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@ -1194,10 +1192,6 @@ public class Launcher extends BaseDraggingActivity
return mHotseat;
}
public View getDragHandleIndicator() {
return mDragHandleIndicator;
}
public View getHotseatSearchBox() {
return mHotseatSearchBox;
}

View File

@ -50,7 +50,6 @@ public class LauncherState {
public static final int ALL_APPS_HEADER = 1 << 2;
public static final int ALL_APPS_HEADER_EXTRA = 1 << 3; // e.g. app predictions
public static final int ALL_APPS_CONTENT = 1 << 4;
public static final int DRAG_HANDLE_INDICATOR = 1 << 5;
protected static final int FLAG_MULTI_PAGE = 1 << 0;
protected static final int FLAG_DISABLE_ACCESSIBILITY = 1 << 1;
@ -194,9 +193,9 @@ public class LauncherState {
public int getVisibleElements(Launcher launcher) {
if (launcher.getDeviceProfile().isVerticalBarLayout()) {
return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR;
return HOTSEAT_ICONS;
}
return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR | HOTSEAT_SEARCH_BOX;
return HOTSEAT_ICONS | HOTSEAT_SEARCH_BOX;
}
/**

View File

@ -18,7 +18,6 @@ package com.android.launcher3;
import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherState.DRAG_HANDLE_INDICATOR;
import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
import static com.android.launcher3.LauncherState.HOTSEAT_SEARCH_BOX;
import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER;
@ -90,10 +89,6 @@ public class WorkspaceStateTransitionAnimation {
(elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0,
pageAlphaProvider.interpolator);
propertySetter.setViewAlpha(mLauncher.getDragHandleIndicator(),
(elements & DRAG_HANDLE_INDICATOR) != 0 ? 1 : 0,
pageAlphaProvider.interpolator);
// Set scrim
propertySetter.setFloat(ViewScrim.get(mWorkspace), ViewScrim.PROGRESS,
state.getWorkspaceScrimAlpha(mLauncher), Interpolators.LINEAR);

View File

@ -101,7 +101,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
mAppsView.setAlpha(1);
mLauncher.getHotseat().setTranslationY(0);
mLauncher.getWorkspace().getPageIndicator().setTranslationY(0);
mLauncher.getDragHandleIndicator().setTranslationY(0);
}
}
@ -125,7 +124,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
if (!mIsVerticalLayout) {
mLauncher.getHotseat().setTranslationY(hotseatTranslation);
mLauncher.getWorkspace().getPageIndicator().setTranslationY(hotseatTranslation);
mLauncher.getDragHandleIndicator().setTranslationY(hotseatTranslation);
}
// Use a light system UI (dark icons) if all apps is behind at least half of the

View File

@ -1,129 +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.launcher3.views;
import static com.android.launcher3.LauncherState.ALL_APPS;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
public class LauncherDragIndicator extends ImageView implements Insettable, OnClickListener {
private static final int WALLPAPERS = R.string.wallpaper_button_text;
private static final int WIDGETS = R.string.widget_button_text;
private static final int SETTINGS = R.string.settings_button_text;
protected final Launcher mLauncher;
public LauncherDragIndicator(Context context) {
this(context, null);
}
public LauncherDragIndicator(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LauncherDragIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mLauncher = Launcher.getLauncher(context);
setOnClickListener(this);
}
@Override
public void setInsets(Rect insets) {
DeviceProfile grid = mLauncher.getDeviceProfile();
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
if (grid.isVerticalBarLayout()) {
if (grid.isSeascape()) {
lp.leftMargin = grid.hotseatBarSidePaddingPx;
lp.rightMargin = insets.right;
lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
} else {
lp.leftMargin = insets.left;
lp.rightMargin = grid.hotseatBarSidePaddingPx;
lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
}
lp.bottomMargin = grid.workspacePadding.bottom;
setImageResource(R.drawable.all_apps_handle_landscape);
} else {
lp.leftMargin = lp.rightMargin = 0;
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.bottomMargin = getPortraitBottomMargin(grid, insets);
setImageResource(R.drawable.ic_drag_indicator);
}
lp.width = lp.height = grid.pageIndicatorSizePx;
setLayoutParams(lp);
}
protected int getPortraitBottomMargin(DeviceProfile grid, Rect insets) {
return grid.hotseatBarSizePx + insets.bottom - grid.pageIndicatorSizePx;
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
initCustomActions(info);
}
protected void initCustomActions(AccessibilityNodeInfo info) {
Context context = getContext();
if (Utilities.isWallpaperAllowed(context)) {
info.addAction(new AccessibilityAction(WALLPAPERS, context.getText(WALLPAPERS)));
}
info.addAction(new AccessibilityAction(WIDGETS, context.getText(WIDGETS)));
info.addAction(new AccessibilityAction(SETTINGS, context.getText(SETTINGS)));
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
if (action == WALLPAPERS) {
return OptionsPopupView.startWallpaperPicker(this);
} else if (action == WIDGETS) {
return OptionsPopupView.onWidgetsClicked(this);
} else if (action == SETTINGS) {
return OptionsPopupView.startSettings(this);
}
return super.performAccessibilityAction(action, arguments);
}
@Override
public void onClick(View view) {
if (!mLauncher.isInState(ALL_APPS)) {
mLauncher.getUserEventDispatcher().logActionOnControl(
Action.Touch.TAP, ControlType.ALL_APPS_BUTTON);
mLauncher.getStateManager().goToState(ALL_APPS);
}
}
}

View File

@ -15,28 +15,63 @@
*/
package com.android.launcher3.views;
import static android.content.Context.ACCESSIBILITY_SERVICE;
import static android.support.v4.graphics.ColorUtils.compositeColors;
import static android.support.v4.graphics.ColorUtils.setAlphaComponent;
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.NORMAL;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
import android.support.v4.widget.ExploreByTouchHelper;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.LauncherStateManager;
import com.android.launcher3.LauncherStateManager.StateListener;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.uioverrides.WallpaperColorInfo;
import com.android.launcher3.uioverrides.WallpaperColorInfo.OnChangeListener;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
import com.android.launcher3.util.Themes;
import java.util.List;
/**
* Simple scrim which draws a flat color
*/
public class ScrimView extends View implements Insettable, OnChangeListener {
public class ScrimView extends View implements Insettable, OnChangeListener,
AccessibilityStateChangeListener, StateListener {
private static final int WALLPAPERS = R.string.wallpaper_button_text;
private static final int WIDGETS = R.string.widget_button_text;
private static final int SETTINGS = R.string.settings_button_text;
private final Rect mTempRect = new Rect();
private final int[] mTempPos = new int[2];
protected final Launcher mLauncher;
private final WallpaperColorInfo mWallpaperColorInfo;
private final AccessibilityManager mAM;
protected final int mEndScrim;
protected float mMaxScrimAlpha;
@ -48,28 +83,56 @@ public class ScrimView extends View implements Insettable, OnChangeListener {
protected int mEndFlatColor;
protected int mEndFlatColorAlpha;
protected final int mDragHandleSize;
private final Rect mDragHandleBounds;
private final AccessibilityHelper mAccessibilityHelper;
@Nullable
protected Drawable mDragHandle;
public ScrimView(Context context, AttributeSet attrs) {
super(context, attrs);
mLauncher = Launcher.getLauncher(context);
mWallpaperColorInfo = WallpaperColorInfo.getInstance(context);
mEndScrim = Themes.getAttrColor(context, R.attr.allAppsScrimColor);
mMaxScrimAlpha = 0.7f;
mDragHandleSize = context.getResources()
.getDimensionPixelSize(R.dimen.vertical_drag_handle_size);
mDragHandleBounds = new Rect(0, 0, mDragHandleSize, mDragHandleSize);
mAccessibilityHelper = new AccessibilityHelper();
ViewCompat.setAccessibilityDelegate(this, mAccessibilityHelper);
mAM = (AccessibilityManager) context.getSystemService(ACCESSIBILITY_SERVICE);
}
@Override
public void setInsets(Rect insets) { }
public void setInsets(Rect insets) {
updateDragHandleBounds();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
updateDragHandleBounds();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mWallpaperColorInfo.addOnChangeListener(this);
onExtractedColorsChanged(mWallpaperColorInfo);
mAM.addAccessibilityStateChangeListener(this);
onAccessibilityStateChanged(mAM.isEnabled());
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mWallpaperColorInfo.removeOnChangeListener(this);
mAM.removeAccessibilityStateChangeListener(this);
}
@Override
@ -91,6 +154,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener {
if (mProgress != progress) {
mProgress = progress;
updateColors();
updateDragHandleAlpha();
invalidate();
}
}
@ -102,10 +166,158 @@ public class ScrimView extends View implements Insettable, OnChangeListener {
mEndFlatColor, Math.round((1 - mProgress) * mEndFlatColorAlpha));
}
protected void updateDragHandleAlpha() {
if (mDragHandle != null) {
mDragHandle.setAlpha(Math.round(255 * Utilities.boundToRange(mProgress, 0, 1)));
}
}
@Override
protected void onDraw(Canvas canvas) {
if (mCurrentFlatColor != 0) {
canvas.drawColor(mCurrentFlatColor);
}
}
protected void updateDragHandleBounds() {
DeviceProfile grid = mLauncher.getDeviceProfile();
final int left;
final int width = getMeasuredWidth();
final int top = getMeasuredHeight() - mDragHandleSize - grid.getInsets().bottom;
final int topMargin;
if (grid.isVerticalBarLayout()) {
topMargin = grid.workspacePadding.bottom;
if (grid.isSeascape()) {
left = width - grid.getInsets().right - mDragHandleSize;
} else {
left = mDragHandleSize + grid.getInsets().left;
}
} else {
left = (width - mDragHandleSize) / 2;
topMargin = grid.hotseatBarSizePx;
}
mDragHandleBounds.offsetTo(left, top - topMargin);
if (mDragHandle != null) {
mDragHandle.setBounds(mDragHandleBounds);
}
}
@Override
public void onAccessibilityStateChanged(boolean enabled) {
LauncherStateManager stateManager = mLauncher.getStateManager();
stateManager.removeStateListener(this);
if (enabled) {
mDragHandle = mLauncher.getDrawable(R.drawable.drag_handle_indicator);
mDragHandle.setBounds(mDragHandleBounds);
stateManager.addStateListener(this);
onStateSetImmediately(mLauncher.getStateManager().getState());
updateDragHandleAlpha();
} else {
mDragHandle = null;
}
invalidate();
}
@Override
public boolean dispatchHoverEvent(MotionEvent event) {
return mAccessibilityHelper.dispatchHoverEvent(event) || super.dispatchHoverEvent(event);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return mAccessibilityHelper.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}
@Override
public void onFocusChanged(boolean gainFocus, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
mAccessibilityHelper.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
}
@Override
public void onStateTransitionStart(LauncherState toState) {}
@Override
public void onStateTransitionComplete(LauncherState finalState) {
onStateSetImmediately(finalState);
}
@Override
public void onStateSetImmediately(LauncherState state) {
setImportantForAccessibility(state == ALL_APPS
? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
: IMPORTANT_FOR_ACCESSIBILITY_AUTO);
}
private class AccessibilityHelper extends ExploreByTouchHelper {
private static final int DRAG_HANDLE_ID = 1;
public AccessibilityHelper() {
super(ScrimView.this);
}
@Override
protected int getVirtualViewAt(float x, float y) {
return mDragHandleBounds.contains((int) x, (int) y)
? DRAG_HANDLE_ID : INVALID_ID;
}
@Override
protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
virtualViewIds.add(DRAG_HANDLE_ID);
}
@Override
protected void onPopulateNodeForVirtualView(int virtualViewId,
AccessibilityNodeInfoCompat node) {
node.setContentDescription(getContext().getString(R.string.all_apps_button_label));
node.setBoundsInParent(mDragHandleBounds);
getLocationOnScreen(mTempPos);
mTempRect.set(mDragHandleBounds);
mTempRect.offset(mTempPos[0], mTempPos[1]);
node.setBoundsInScreen(mTempRect);
node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
node.setClickable(true);
node.setFocusable(true);
if (mLauncher.isInState(NORMAL)) {
Context context = getContext();
if (Utilities.isWallpaperAllowed(context)) {
node.addAction(
new AccessibilityActionCompat(WALLPAPERS, context.getText(WALLPAPERS)));
}
node.addAction(new AccessibilityActionCompat(WIDGETS, context.getText(WIDGETS)));
node.addAction(new AccessibilityActionCompat(SETTINGS, context.getText(SETTINGS)));
}
}
@Override
protected boolean onPerformActionForVirtualView(
int virtualViewId, int action, Bundle arguments) {
if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) {
mLauncher.getUserEventDispatcher().logActionOnControl(
Action.Touch.TAP, ControlType.ALL_APPS_BUTTON,
mLauncher.getStateManager().getState().containerType);
mLauncher.getStateManager().goToState(ALL_APPS);
return true;
} else if (action == WALLPAPERS) {
return OptionsPopupView.startWallpaperPicker(ScrimView.this);
} else if (action == WIDGETS) {
return OptionsPopupView.onWidgetsClicked(ScrimView.this);
} else if (action == SETTINGS) {
return OptionsPopupView.startSettings(ScrimView.this);
}
return false;
}
}
}