Merge "Adding a custom view for DragHandle" into ub-launcher3-master

This commit is contained in:
TreeHugger Robot
2018-03-26 23:03:53 +00:00
committed by Android (Google) Code Review
20 changed files with 348 additions and 225 deletions
@@ -0,0 +1,23 @@
<?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" />
+3
View File
@@ -29,4 +29,7 @@
<!-- Text that shows above the navigation bar after launching a few apps -->
<string name="recents_swipe_up_onboarding">Swipe up from the bottom to switch apps</string>
<!-- Content description for the recent apps panel (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_desc_recent_apps">Overview</string>
</resources>
@@ -112,8 +112,9 @@ public class OverviewState extends LauncherState {
if (launcher.getDeviceProfile().isVerticalBarLayout()) {
return NONE;
} else {
return launcher.getAppsView().getFloatingHeaderView().hasVisibleContent()
? HOTSEAT_EXTRA | ALL_APPS_HEADER_EXTRA : HOTSEAT_ICONS | HOTSEAT_EXTRA;
return HOTSEAT_SEARCH_BOX | DRAG_HANDLE_INDICATOR |
(launcher.getAppsView().getFloatingHeaderView().hasVisibleContent()
? ALL_APPS_HEADER_EXTRA : HOTSEAT_ICONS);
}
}
@@ -21,14 +21,10 @@ import static com.android.quickstep.OverviewInteractionState.KEY_SWIPE_UP_ENABLE
import android.content.Context;
import android.content.SharedPreferences;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.Hotseat;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherStateManager.StateHandler;
import com.android.launcher3.R;
import com.android.launcher3.util.TouchController;
import com.android.quickstep.OverviewInteractionState;
import com.android.quickstep.RecentsModel;
@@ -59,10 +55,6 @@ public class UiFactory {
}
}
public static AccessibilityDelegate newPageIndicatorAccessibilityDelegate() {
return null;
}
public static StateHandler[] getStateHandler(Launcher launcher) {
return new StateHandler[] {
launcher.getAllAppsController(), launcher.getWorkspace(),
@@ -99,11 +91,4 @@ public class UiFactory {
model.onTrimMemory(level);
}
}
public static View[] getHotseatExtraContent(Hotseat hotseat) {
return new View[] {
hotseat.findViewById(R.id.drag_indicator),
hotseat.findViewById(R.id.search_container_hotseat),
};
}
}
@@ -0,0 +1,78 @@
/*
* 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);
if (isInOverview()) {
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) {
if (isInOverview()) {
mLauncher.getUserEventDispatcher().logActionOnControl(
Action.Touch.TAP, ControlType.ALL_APPS_BUTTON, ContainerType.TASKSWITCHER);
mLauncher.getStateManager().goToState(ALL_APPS);
super.onClick(view);
} else {
mLauncher.getUserEventDispatcher().logActionOnControl(
Action.Touch.TAP, ControlType.ALL_APPS_BUTTON, ContainerType.WORKSPACE);
mLauncher.getStateManager().goToState(OVERVIEW);
}
}
}
+23
View File
@@ -0,0 +1,23 @@
<?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" />
-9
View File
@@ -18,15 +18,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/drag_indicator"
android:layout_width="@dimen/hotseat_drag_indicator_height"
android:layout_height="@dimen/hotseat_drag_indicator_height"
android:src="@drawable/ic_drag_indicator"
android:tint="?attr/workspaceTextColor"
android:scaleType="centerInside"
android:layout_gravity="top|center_horizontal"/>
<com.android.launcher3.CellLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
+5 -1
View File
@@ -49,7 +49,8 @@
<com.android.launcher3.pageindicators.WorkspacePageIndicator
android:id="@+id/page_indicator"
android:layout_width="match_parent"
android:layout_height="@dimen/dynamic_grid_min_page_indicator_size"
android:layout_height="4dp"
android:layout_gravity="bottom|center_horizontal"
android:theme="@style/HomeScreenElementTheme" />
<include
@@ -63,6 +64,9 @@
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"
-1
View File
@@ -37,7 +37,6 @@
<dimen name="dynamic_grid_hotseat_bottom_padding">2dp</dimen>
<dimen name="dynamic_grid_hotseat_size">80dp</dimen>
<dimen name="dynamic_grid_hotseat_side_padding">0dp</dimen>
<dimen name="hotseat_drag_indicator_height">24dp</dimen>
<!-- Hotseat/all-apps scrim -->
<dimen name="all_apps_scrim_radius">8dp</dimen>
@@ -117,6 +117,7 @@ public class DeviceProfile {
// Insets
private final Rect mInsets = new Rect();
public final Rect workspacePadding = new Rect();
private final Rect mHotseatPadding = new Rect();
// Icon badges
public BadgeRenderer mBadgeRenderer;
@@ -456,6 +457,33 @@ public class DeviceProfile {
}
}
public Rect getHotseatLayoutPadding() {
if (isVerticalBarLayout()) {
if (isSeascape()) {
mHotseatPadding.set(
mInsets.left, mInsets.top, hotseatBarSidePaddingPx, mInsets.bottom);
} else {
mHotseatPadding.set(
hotseatBarSidePaddingPx, mInsets.top, mInsets.right, mInsets.bottom);
}
} else {
// We want the edges of the hotseat to line up with the edges of the workspace, but the
// icons in the hotseat are a different size, and so don't line up perfectly. To account
// for this, we pad the left and right of the hotseat with half of the difference of a
// workspace cell vs a hotseat cell.
float workspaceCellWidth = (float) widthPx / inv.numColumns;
float hotseatCellWidth = (float) widthPx / inv.numHotseatIcons;
int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
mHotseatPadding.set(
hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx,
hotseatBarTopPaddingPx,
hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx,
hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx);
}
return mHotseatPadding;
}
/**
* @return the bounds for which the open folders should be contained within
*/
+3 -21
View File
@@ -152,19 +152,13 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett
if (mHasVerticalHotseat) {
mContent.setGridSize(1, grid.inv.numHotseatIcons);
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
if (grid.isSeascape()) {
lp.gravity = Gravity.LEFT;
lp.width = grid.hotseatBarSizePx + insets.left + grid.hotseatBarSidePaddingPx;
getLayout().setPadding(
insets.left, insets.top, grid.hotseatBarSidePaddingPx, insets.bottom);
} else {
lp.gravity = Gravity.RIGHT;
lp.width = grid.hotseatBarSizePx + insets.right + grid.hotseatBarSidePaddingPx;
getLayout().setPadding(
grid.hotseatBarSidePaddingPx, insets.top, insets.right, insets.bottom);
}
} else {
mContent.setGridSize(grid.inv.numHotseatIcons, 1);
@@ -172,22 +166,10 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett
lp.gravity = Gravity.BOTTOM;
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = grid.hotseatBarSizePx + insets.bottom;
// We want the edges of the hotseat to line up with the edges of the workspace, but the
// icons in the hotseat are a different size, and so don't line up perfectly. To account for
// this, we pad the left and right of the hotseat with half of the difference of a workspace
// cell vs a hotseat cell.
float workspaceCellWidth = (float) grid.widthPx / grid.inv.numColumns;
float hotseatCellWidth = (float) grid.widthPx / grid.inv.numHotseatIcons;
int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
Rect workspacePadding = grid.workspacePadding;
getLayout().setPadding(
hotseatAdjustment + workspacePadding.left + grid.cellLayoutPaddingLeftRightPx,
grid.hotseatBarTopPaddingPx,
hotseatAdjustment + workspacePadding.right + grid.cellLayoutPaddingLeftRightPx,
grid.hotseatBarBottomPaddingPx + insets.bottom + grid.cellLayoutBottomPaddingPx);
}
Rect padding = grid.getHotseatLayoutPadding();
getLayout().setPadding(padding.left, padding.top, padding.right, padding.bottom);
setLayoutParams(lp);
InsettableFrameLayout.dispatchInsets(this, insets);
}
+12
View File
@@ -197,6 +197,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, L
private final int[] mTmpAddItemCellCoordinates = new int[2];
@Thunk Hotseat mHotseat;
private View mDragHandleIndicator;
@Nullable private View mHotseatSearchBox;
private DropTargetBar mDropTargetBar;
@@ -938,6 +940,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, L
mWorkspace.initParentViews(mDragLayer);
mOverviewPanel = findViewById(R.id.overview_panel);
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
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
@@ -1201,6 +1205,14 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, L
return mHotseat;
}
public View getDragHandleIndicator() {
return mDragHandleIndicator;
}
public View getHotseatSearchBox() {
return mHotseatSearchBox;
}
public <T extends View> T getOverviewPanel() {
return (T) mOverviewPanel;
}
+4 -3
View File
@@ -47,10 +47,11 @@ public class LauncherState {
*/
public static final int NONE = 0;
public static final int HOTSEAT_ICONS = 1 << 0;
public static final int HOTSEAT_EXTRA = 1 << 1; // e.g. a search box
public static final int HOTSEAT_SEARCH_BOX = 1 << 1;
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_SHOW_SCRIM = 1 << 0;
protected static final int FLAG_MULTI_PAGE = 1 << 1;
@@ -201,9 +202,9 @@ public class LauncherState {
public int getVisibleElements(Launcher launcher) {
if (launcher.getDeviceProfile().isVerticalBarLayout()) {
return HOTSEAT_ICONS;
return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR;
}
return HOTSEAT_ICONS | HOTSEAT_EXTRA;
return HOTSEAT_ICONS | DRAG_HANDLE_INDICATOR | HOTSEAT_SEARCH_BOX;
}
/**
-11
View File
@@ -443,12 +443,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
setWallpaperDimension();
}
@Override
public void initParentViews(View parent) {
super.initParentViews(parent);
mPageIndicator.setAccessibilityDelegate(UiFactory.newPageIndicatorAccessibilityDelegate());
}
private void setupLayoutTransition() {
// We want to show layout transitions when pages are deleted, to close the gap.
mLayoutTransition = new LayoutTransition();
@@ -3350,11 +3344,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
? mLauncher.getDeviceProfile().widthPx : getMeasuredWidth();
}
@Override
protected String getPageIndicatorDescription() {
return getResources().getString(R.string.all_apps_button_label);
}
@Override
protected String getCurrentPageDescription() {
int page = (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
@@ -18,8 +18,9 @@ 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.HOTSEAT_EXTRA;
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;
import android.view.View;
@@ -81,16 +82,19 @@ public class WorkspaceStateTransitionAnimation {
int elements = state.getVisibleElements(mLauncher);
float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0;
float hotseatExtraAlpha = (elements & HOTSEAT_EXTRA) != 0 ? 1 : 0;
propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha,
pageAlphaProvider.interpolator);
for (View hotseatExtraContent : UiFactory.getHotseatExtraContent(mLauncher.getHotseat())) {
propertySetter.setViewAlpha(hotseatExtraContent, hotseatExtraAlpha,
pageAlphaProvider.interpolator);
}
propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(),
hotseatIconsAlpha, pageAlphaProvider.interpolator);
propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(),
(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.hasScrim ? 1 : 0, Interpolators.LINEAR);
@@ -122,6 +122,7 @@ public class AllAppsTransitionController
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
@@ -1,9 +1,5 @@
package com.android.launcher3.pageindicators;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static com.android.launcher3.LauncherState.ALL_APPS;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -20,9 +16,7 @@ import android.util.AttributeSet;
import android.util.Property;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
import com.android.launcher3.DeviceProfile;
@@ -31,18 +25,13 @@ import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.dynamicui.WallpaperColorInfo;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
/**
* A PageIndicator that briefly shows a fraction of a line when moving between pages in
* portrait mode. In Landscape simply draws the caret drawable bottom-corner aligned in
* the drag-layer.
* A PageIndicator that briefly shows a fraction of a line when moving between pages
*
* The fraction is 1 / number of pages and the position is based on the progress of the page scroll.
*/
public class WorkspacePageIndicator extends View
implements Insettable, OnClickListener, PageIndicator {
public class WorkspacePageIndicator extends View implements Insettable, PageIndicator {
private static final int LINE_ANIMATE_DURATION = ViewConfiguration.getScrollBarFadeDuration();
private static final int LINE_FADE_DELAY = ViewConfiguration.getScrollDefaultDelay();
@@ -57,7 +46,6 @@ public class WorkspacePageIndicator extends View
private final Handler mDelayedLineFadeHandler = new Handler(Looper.getMainLooper());
private final Launcher mLauncher;
private final AccessibilityManager mAccessibilityManager;
private boolean mShouldAutoHide = true;
@@ -72,8 +60,6 @@ public class WorkspacePageIndicator extends View
private Paint mLinePaint;
private final int mLineHeight;
private boolean mIsLandscapeUi;
private static final Property<WorkspacePageIndicator, Integer> PAINT_ALPHA
= new Property<WorkspacePageIndicator, Integer>(Integer.class, "paint_alpha") {
@Override
@@ -84,7 +70,7 @@ public class WorkspacePageIndicator extends View
@Override
public void set(WorkspacePageIndicator obj, Integer alpha) {
obj.mLinePaint.setAlpha(alpha);
obj.invalidateIfPortrait();
obj.invalidate();
}
};
@@ -98,7 +84,7 @@ public class WorkspacePageIndicator extends View
@Override
public void set(WorkspacePageIndicator obj, Float numPages) {
obj.mNumPagesFloat = numPages;
obj.invalidateIfPortrait();
obj.invalidate();
}
};
@@ -112,7 +98,7 @@ public class WorkspacePageIndicator extends View
@Override
public void set(WorkspacePageIndicator obj, Integer totalScroll) {
obj.mTotalScroll = totalScroll;
obj.invalidateIfPortrait();
obj.invalidate();
}
};
@@ -139,24 +125,23 @@ public class WorkspacePageIndicator extends View
boolean darkText = WallpaperColorInfo.getInstance(context).supportsDarkText();
mActiveAlpha = darkText ? BLACK_ALPHA : WHITE_ALPHA;
mLinePaint.setColor(darkText ? Color.BLACK : Color.WHITE);
mAccessibilityManager = (AccessibilityManager)
getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
}
@Override
protected void onDraw(Canvas canvas) {
if (mTotalScroll == 0 || mNumPagesFloat == 0 || mIsLandscapeUi) {
if (mTotalScroll == 0 || mNumPagesFloat == 0) {
return;
}
// Compute and draw line rect.
float progress = Utilities.boundToRange(((float) mCurrentScroll) / mTotalScroll, 0f, 1f);
int availableWidth = canvas.getWidth();
int availableWidth = getWidth();
int lineWidth = (int) (availableWidth / mNumPagesFloat);
int lineLeft = (int) (progress * (availableWidth - lineWidth));
int lineRight = lineLeft + lineWidth;
canvas.drawRoundRect(lineLeft, canvas.getHeight() / 2 - mLineHeight / 2, lineRight,
canvas.getHeight() / 2 + mLineHeight / 2, mLineHeight, mLineHeight, mLinePaint);
canvas.drawRoundRect(lineLeft, getHeight() / 2 - mLineHeight / 2, lineRight,
getHeight() / 2 + mLineHeight / 2, mLineHeight, mLineHeight, mLinePaint);
}
@Override
@@ -172,7 +157,7 @@ public class WorkspacePageIndicator extends View
} else if (mTotalScroll != totalScroll) {
animateToTotalScroll(totalScroll);
} else {
invalidateIfPortrait();
invalidate();
}
if (mShouldAutoHide) {
@@ -191,7 +176,13 @@ public class WorkspacePageIndicator extends View
@Override
public void setMarkersCount(int numMarkers) {
if (Float.compare(numMarkers, mNumPagesFloat) != 0) {
animateToNumPages(numMarkers);
setupAndRunAnimation(ObjectAnimator.ofFloat(this, NUM_PAGES, numMarkers),
NUM_PAGES_ANIMATOR_INDEX);
} else {
if (mAnimators[NUM_PAGES_ANIMATOR_INDEX] != null) {
mAnimators[NUM_PAGES_ANIMATOR_INDEX].cancel();
mAnimators[NUM_PAGES_ANIMATOR_INDEX] = null;
}
}
}
@@ -219,11 +210,6 @@ public class WorkspacePageIndicator extends View
LINE_ALPHA_ANIMATOR_INDEX);
}
private void animateToNumPages(int numPages) {
setupAndRunAnimation(ObjectAnimator.ofFloat(this, NUM_PAGES, numPages),
NUM_PAGES_ANIMATOR_INDEX);
}
private void animateToTotalScroll(int totalScroll) {
setupAndRunAnimation(ObjectAnimator.ofInt(this, TOTAL_SCROLL, totalScroll),
TOTAL_SCROLL_ANIMATOR_INDEX);
@@ -254,54 +240,18 @@ public class WorkspacePageIndicator extends View
@Override
public void setInsets(Rect insets) {
DeviceProfile grid = mLauncher.getDeviceProfile();
mIsLandscapeUi = grid.isVerticalBarLayout();
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
if (mIsLandscapeUi) {
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;
lp.width = lp.height = getResources()
.getDimensionPixelSize(R.dimen.dynamic_grid_min_page_indicator_size);
setBackgroundResource(R.drawable.all_apps_handle_landscape);
setOnFocusChangeListener(mLauncher.mFocusHandler);
setOnClickListener(this);
if (grid.isVerticalBarLayout()) {
Rect padding = grid.workspacePadding;
lp.leftMargin = padding.left + grid.workspaceCellPaddingXPx;
lp.rightMargin = padding.right + grid.workspaceCellPaddingXPx;
lp.bottomMargin = padding.bottom;
} else {
lp.leftMargin = lp.rightMargin = 0;
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.height = grid.pageIndicatorSizePx;
lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;
lp.width = MATCH_PARENT;
setBackgroundResource(0);
setOnFocusChangeListener(null);
setOnClickListener(mAccessibilityManager.isTouchExplorationEnabled() ? this : null);
}
setLayoutParams(lp);
}
private void invalidateIfPortrait() {
if (!mIsLandscapeUi) {
invalidate();
}
}
@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);
}
}
}
@@ -0,0 +1,132 @@
/*
* 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) {
Launcher launcher = Launcher.getLauncher(getContext());
if (action == WALLPAPERS) {
launcher.onClickWallpaperPicker(this);
return true;
} else if (action == WIDGETS) {
return OptionsPopupView.onWidgetsClicked(launcher);
} else if (action == SETTINGS) {
OptionsPopupView.startSettings(launcher);
return true;
}
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);
}
}
}
@@ -1,68 +0,0 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.launcher3.uioverrides;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.views.OptionsPopupView;
/**
* Accessibility delegate with actions pointing to various Overview entry points.
*/
public class OverviewAccessibilityDelegate extends AccessibilityDelegate {
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;
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
Context context = host.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(View host, int action, Bundle args) {
Launcher launcher = Launcher.getLauncher(host.getContext());
if (action == WALLPAPERS) {
launcher.onClickWallpaperPicker(host);
return true;
} else if (action == WIDGETS) {
return OptionsPopupView.onWidgetsClicked(launcher);
} else if (action == SETTINGS) {
OptionsPopupView.startSettings(launcher);
return true;
}
return super.performAccessibilityAction(host, action, args);
}
}
@@ -16,13 +16,8 @@
package com.android.launcher3.uioverrides;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import com.android.launcher3.Hotseat;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherStateManager.StateHandler;
import com.android.launcher3.R;
import com.android.launcher3.util.TouchController;
public class UiFactory {
@@ -32,10 +27,6 @@ public class UiFactory {
launcher.getDragController(), new AllAppsSwipeController(launcher)};
}
public static AccessibilityDelegate newPageIndicatorAccessibilityDelegate() {
return new OverviewAccessibilityDelegate();
}
public static StateHandler[] getStateHandler(Launcher launcher) {
return new StateHandler[] {
launcher.getAllAppsController(), launcher.getWorkspace() };
@@ -48,10 +39,4 @@ public class UiFactory {
public static void onStart(Launcher launcher) { }
public static void onTrimMemory(Launcher launcher, int level) { }
public static View[] getHotseatExtraContent(Hotseat hotseat) {
return new View[] {
hotseat.findViewById(R.id.drag_indicator),
};
}
}