Removing layout handling in DeviceProfile and moving it to

individual views

Bug: 71709920
Change-Id: I8300fa7a84b31898bdb135d774cca576d2928525
This commit is contained in:
Sunny Goyal 2018-01-08 14:19:34 -08:00
parent 228153d92a
commit 07b6929cd9
19 changed files with 228 additions and 332 deletions

View File

@ -217,7 +217,7 @@ public class RecentsView extends PagedView {
DeviceProfile profile = launcher.getDeviceProfile(); DeviceProfile profile = launcher.getDeviceProfile();
Rect stableInsets = new Rect(); Rect stableInsets = new Rect();
WindowManagerWrapper.getInstance().getStableInsets(stableInsets); WindowManagerWrapper.getInstance().getStableInsets(stableInsets);
Rect padding = profile.getWorkspacePadding(null); Rect padding = new Rect(profile.workspacePadding);
float taskWidth = profile.widthPx - stableInsets.left - stableInsets.right; float taskWidth = profile.widthPx - stableInsets.left - stableInsets.right;
float taskHeight = profile.heightPx - stableInsets.top - stableInsets.bottom; float taskHeight = profile.heightPx - stableInsets.top - stableInsets.bottom;

View File

@ -63,9 +63,7 @@
<include layout="@layout/hotseat" <include layout="@layout/hotseat"
android:id="@+id/hotseat" android:id="@+id/hotseat"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
android:layout_gravity="right"
launcher:layout_ignoreInsets="true" />
<include <include
android:id="@+id/drop_target_bar" android:id="@+id/drop_target_bar"

View File

@ -57,8 +57,7 @@
<include layout="@layout/hotseat" <include layout="@layout/hotseat"
android:id="@+id/hotseat" android:id="@+id/hotseat"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
launcher:layout_ignoreInsets="true" />
<!-- Keep these behind the workspace so that they are not visible when <!-- Keep these behind the workspace so that they are not visible when
we go into AllApps --> we go into AllApps -->

View File

@ -56,8 +56,7 @@
<include layout="@layout/hotseat" <include layout="@layout/hotseat"
android:id="@+id/hotseat" android:id="@+id/hotseat"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
launcher:layout_ignoreInsets="true" />
<include <include
android:id="@+id/drop_target_bar" android:id="@+id/drop_target_bar"

View File

@ -47,10 +47,6 @@
<!-- Out of 100, the percent to shrink the workspace during spring loaded mode. --> <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
<integer name="config_workspaceSpringLoadShrinkPercentage">90</integer> <integer name="config_workspaceSpringLoadShrinkPercentage">90</integer>
<!-- This constant stores the ratio of the all apps button drawable which
is used for internal (baked-in) padding -->
<integer name="config_allAppsButtonPaddingPercent">17</integer>
<!-- The duration of the animation from search hint to text entry --> <!-- The duration of the animation from search hint to text entry -->
<integer name="config_searchHintAnimationDuration">50</integer> <integer name="config_searchHintAnimationDuration">50</integer>

View File

@ -25,24 +25,12 @@ import android.graphics.Point;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import com.android.launcher3.CellLayout.ContainerType; import com.android.launcher3.CellLayout.ContainerType;
import com.android.launcher3.allapps.AllAppsContainerView;
import com.android.launcher3.badge.BadgeRenderer; import com.android.launcher3.badge.BadgeRenderer;
import com.android.launcher3.views.AllAppsScrim;
import java.util.ArrayList;
public class DeviceProfile { public class DeviceProfile {
public interface LauncherLayoutChangeListener {
void onLauncherLayoutChanged();
}
public final InvariantDeviceProfile inv; public final InvariantDeviceProfile inv;
// Device properties // Device properties
@ -66,20 +54,19 @@ public class DeviceProfile {
private static final float TALL_DEVICE_ASPECT_RATIO_THRESHOLD = 2.0f; private static final float TALL_DEVICE_ASPECT_RATIO_THRESHOLD = 2.0f;
// Workspace // Workspace
private final int desiredWorkspaceLeftRightMarginPx; public final int desiredWorkspaceLeftRightMarginPx;
public final int cellLayoutPaddingLeftRightPx; public final int cellLayoutPaddingLeftRightPx;
public final int cellLayoutBottomPaddingPx; public final int cellLayoutBottomPaddingPx;
public final int edgeMarginPx; public final int edgeMarginPx;
public final Rect defaultWidgetPadding; public final Rect defaultWidgetPadding;
private final int defaultPageSpacingPx; public final int defaultPageSpacingPx;
private final int topWorkspacePadding; private final int topWorkspacePadding;
public float workspaceSpringLoadShrinkFactor; public float workspaceSpringLoadShrinkFactor;
public final int workspaceSpringLoadedBottomSpace; public final int workspaceSpringLoadedBottomSpace;
// Page indicator // Page indicator
private int pageIndicatorSizePx; public final int pageIndicatorSizePx;
// Workspace icons // Workspace icons
public int iconSizePx; public int iconSizePx;
@ -109,15 +96,14 @@ public class DeviceProfile {
public int hotseatCellHeightPx; public int hotseatCellHeightPx;
// In portrait: size = height, in landscape: size = width // In portrait: size = height, in landscape: size = width
public int hotseatBarSizePx; public int hotseatBarSizePx;
public int hotseatBarTopPaddingPx; public final int hotseatBarTopPaddingPx;
public int hotseatBarBottomPaddingPx; public final int hotseatBarBottomPaddingPx;
public int hotseatBarSidePaddingPx; public final int hotseatBarSidePaddingPx;
// All apps // All apps
public int allAppsCellHeightPx; public int allAppsCellHeightPx;
public int allAppsNumCols; public int allAppsNumCols;
public int allAppsNumPredictiveCols; public int allAppsNumPredictiveCols;
public int allAppsButtonVisualSize;
public int allAppsIconSizePx; public int allAppsIconSizePx;
public int allAppsIconDrawablePaddingPx; public int allAppsIconDrawablePaddingPx;
public float allAppsIconTextSizePx; public float allAppsIconTextSizePx;
@ -129,10 +115,8 @@ public class DeviceProfile {
public int dropTargetBarSizePx; public int dropTargetBarSizePx;
// Insets // Insets
private Rect mInsets = new Rect(); private final Rect mInsets = new Rect();
public final Rect workspacePadding = new Rect();
// Listeners
private ArrayList<LauncherLayoutChangeListener> mListeners = new ArrayList<>();
// Icon badges // Icon badges
public BadgeRenderer mBadgeRenderer; public BadgeRenderer mBadgeRenderer;
@ -224,8 +208,7 @@ public class DeviceProfile {
// Recalculate the available dimensions using the new hotseat size. // Recalculate the available dimensions using the new hotseat size.
updateAvailableDimensions(dm, res); updateAvailableDimensions(dm, res);
} }
updateWorkspacePadding();
computeAllAppsButtonSize(context);
// This is done last, after iconSizePx is calculated above. // This is done last, after iconSizePx is calculated above.
mBadgeRenderer = new BadgeRenderer(iconSizePx); mBadgeRenderer = new BadgeRenderer(iconSizePx);
@ -254,22 +237,11 @@ public class DeviceProfile {
float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x; float appWidgetScaleX = (float) profile.getCellSize().x / getCellSize().x;
float appWidgetScaleY = (float) profile.getCellSize().y / getCellSize().y; float appWidgetScaleY = (float) profile.getCellSize().y / getCellSize().y;
profile.appWidgetScale.set(appWidgetScaleX, appWidgetScaleY); profile.appWidgetScale.set(appWidgetScaleX, appWidgetScaleY);
profile.updateWorkspacePadding();
return profile; return profile;
} }
public void addLauncherLayoutChangedListener(LauncherLayoutChangeListener listener) {
if (!mListeners.contains(listener)) {
mListeners.add(listener);
}
}
public void removeLauncherLayoutChangedListener(LauncherLayoutChangeListener listener) {
if (mListeners.contains(listener)) {
mListeners.remove(listener);
}
}
/** /**
* Adjusts the profile so that the labels on the Workspace are hidden. * Adjusts the profile so that the labels on the Workspace are hidden.
* It is important to call this method after the All Apps variables have been set. * It is important to call this method after the All Apps variables have been set.
@ -288,17 +260,6 @@ public class DeviceProfile {
+ topBottomPadding * 2; + topBottomPadding * 2;
} }
/**
* Determine the exact visual footprint of the all apps button, taking into account scaling
* and internal padding of the drawable.
*/
private void computeAllAppsButtonSize(Context context) {
Resources res = context.getResources();
float padding = res.getInteger(R.integer.config_allAppsButtonPaddingPercent) / 100f;
allAppsButtonVisualSize = (int) (iconSizePx * (1 - padding)) - context.getResources()
.getDimensionPixelSize(R.dimen.all_apps_button_scale_down);
}
private void updateAvailableDimensions(DisplayMetrics dm, Resources res) { private void updateAvailableDimensions(DisplayMetrics dm, Resources res) {
updateIconSize(1f, res, dm); updateIconSize(1f, res, dm);
@ -314,7 +275,8 @@ public class DeviceProfile {
private void updateIconSize(float scale, Resources res, DisplayMetrics dm) { private void updateIconSize(float scale, Resources res, DisplayMetrics dm) {
// Workspace // Workspace
float invIconSizePx = isVerticalBarLayout() ? inv.landscapeIconSize : inv.iconSize; final boolean isVerticalLayout = isVerticalBarLayout();
float invIconSizePx = isVerticalLayout ? inv.landscapeIconSize : inv.iconSize;
iconSizePx = (int) (Utilities.pxFromDp(invIconSizePx, dm) * scale); iconSizePx = (int) (Utilities.pxFromDp(invIconSizePx, dm) * scale);
iconTextSizePx = (int) (Utilities.pxFromSp(inv.iconTextSize, dm) * scale); iconTextSizePx = (int) (Utilities.pxFromSp(inv.iconTextSize, dm) * scale);
iconDrawablePaddingPx = (int) (iconDrawablePaddingOriginalPx * scale); iconDrawablePaddingPx = (int) (iconDrawablePaddingOriginalPx * scale);
@ -322,7 +284,7 @@ public class DeviceProfile {
cellHeightPx = iconSizePx + iconDrawablePaddingPx cellHeightPx = iconSizePx + iconDrawablePaddingPx
+ Utilities.calculateTextHeight(iconTextSizePx); + Utilities.calculateTextHeight(iconTextSizePx);
int cellYPadding = (getCellSize().y - cellHeightPx) / 2; int cellYPadding = (getCellSize().y - cellHeightPx) / 2;
if (iconDrawablePaddingPx > cellYPadding && !isVerticalBarLayout() if (iconDrawablePaddingPx > cellYPadding && !isVerticalLayout
&& !inMultiWindowMode()) { && !inMultiWindowMode()) {
// Ensures that the label is closer to its corresponding icon. This is not an issue // Ensures that the label is closer to its corresponding icon. This is not an issue
// with vertical bar layout or multi-window mode since the issue is handled separately // with vertical bar layout or multi-window mode since the issue is handled separately
@ -338,18 +300,18 @@ public class DeviceProfile {
allAppsIconDrawablePaddingPx = iconDrawablePaddingPx; allAppsIconDrawablePaddingPx = iconDrawablePaddingPx;
allAppsCellHeightPx = getCellSize().y; allAppsCellHeightPx = getCellSize().y;
if (isVerticalBarLayout()) { if (isVerticalLayout) {
// Always hide the Workspace text with vertical bar layout. // Always hide the Workspace text with vertical bar layout.
adjustToHideWorkspaceLabels(); adjustToHideWorkspaceLabels();
} }
// Hotseat // Hotseat
if (isVerticalBarLayout()) { if (isVerticalLayout) {
hotseatBarSizePx = iconSizePx; hotseatBarSizePx = iconSizePx;
} }
hotseatCellHeightPx = iconSizePx; hotseatCellHeightPx = iconSizePx;
if (!isVerticalBarLayout()) { if (!isVerticalLayout) {
int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx
- pageIndicatorSizePx - topWorkspacePadding; - pageIndicatorSizePx - topWorkspacePadding;
float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace; float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace;
@ -376,15 +338,16 @@ public class DeviceProfile {
// Don't let the folder get too close to the edges of the screen. // Don't let the folder get too close to the edges of the screen.
int folderMargin = edgeMarginPx; int folderMargin = edgeMarginPx;
Point totalWorkspacePadding = getTotalWorkspacePadding();
// Check if the icons fit within the available height. // Check if the icons fit within the available height.
float usedHeight = folderCellHeightPx * inv.numFolderRows + folderBottomPanelSize; float usedHeight = folderCellHeightPx * inv.numFolderRows + folderBottomPanelSize;
int maxHeight = availableHeightPx - getTotalWorkspacePadding().y - folderMargin; int maxHeight = availableHeightPx - totalWorkspacePadding.y - folderMargin;
float scaleY = maxHeight / usedHeight; float scaleY = maxHeight / usedHeight;
// Check if the icons fit within the available width. // Check if the icons fit within the available width.
float usedWidth = folderCellWidthPx * inv.numFolderColumns; float usedWidth = folderCellWidthPx * inv.numFolderColumns;
int maxWidth = availableWidthPx - getTotalWorkspacePadding().x - folderMargin; int maxWidth = availableWidthPx - totalWorkspacePadding.x - folderMargin;
float scaleX = maxWidth / usedWidth; float scaleX = maxWidth / usedWidth;
float scale = Math.min(scaleX, scaleY); float scale = Math.min(scaleX, scaleY);
@ -410,33 +373,13 @@ public class DeviceProfile {
public void updateInsets(Rect insets) { public void updateInsets(Rect insets) {
mInsets.set(insets); mInsets.set(insets);
updateWorkspacePadding();
} }
public void updateAppsViewNumCols() { public void updateAppsViewNumCols() {
allAppsNumCols = allAppsNumPredictiveCols = inv.numColumns; allAppsNumCols = allAppsNumPredictiveCols = inv.numColumns;
} }
/** Returns the width and height of the search bar, ignoring any padding. */
public Point getSearchBarDimensForWidgetOpts() {
if (isVerticalBarLayout()) {
return new Point(dropTargetBarSizePx, availableHeightPx - 2 * edgeMarginPx);
} else {
int gap;
if (isTablet) {
// Pad the left and right of the workspace to ensure consistent spacing
// between all icons
// XXX: If the icon size changes across orientations, we will have to take
// that into account here too.
gap = ((widthPx - 2 * edgeMarginPx
- (inv.numColumns * cellWidthPx)) / (2 * (inv.numColumns + 1)))
+ edgeMarginPx;
} else {
gap = desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.right;
}
return new Point(availableWidthPx - 2 * gap, dropTargetBarSizePx);
}
}
public Point getCellSize() { public Point getCellSize() {
Point result = new Point(); Point result = new Point();
// Since we are only concerned with the overall padding, layout direction does // Since we are only concerned with the overall padding, layout direction does
@ -450,15 +393,17 @@ public class DeviceProfile {
} }
public Point getTotalWorkspacePadding() { public Point getTotalWorkspacePadding() {
Rect padding = getWorkspacePadding(null); updateWorkspacePadding();
return new Point(padding.left + padding.right, padding.top + padding.bottom); return new Point(workspacePadding.left + workspacePadding.right,
workspacePadding.top + workspacePadding.bottom);
} }
/** /**
* Returns the workspace padding in the specified orientation. * Updates {@link #workspacePadding} as a result of any internal value change to reflect the
* new workspace padding
*/ */
public Rect getWorkspacePadding(Rect recycle) { private void updateWorkspacePadding() {
Rect padding = recycle == null ? new Rect() : recycle; Rect padding = workspacePadding;
if (isVerticalBarLayout()) { if (isVerticalBarLayout()) {
padding.top = 0; padding.top = 0;
padding.bottom = edgeMarginPx; padding.bottom = edgeMarginPx;
@ -480,7 +425,7 @@ public class DeviceProfile {
int availablePaddingX = Math.max(0, widthPx - ((inv.numColumns * cellWidthPx) + int availablePaddingX = Math.max(0, widthPx - ((inv.numColumns * cellWidthPx) +
((inv.numColumns - 1) * cellWidthPx))); ((inv.numColumns - 1) * cellWidthPx)));
availablePaddingX = (int) Math.min(availablePaddingX, availablePaddingX = (int) Math.min(availablePaddingX,
widthPx * MAX_HORIZONTAL_PADDING_PERCENT); widthPx * MAX_HORIZONTAL_PADDING_PERCENT);
int availablePaddingY = Math.max(0, heightPx - topWorkspacePadding - paddingBottom int availablePaddingY = Math.max(0, heightPx - topWorkspacePadding - paddingBottom
- (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx - (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx
- hotseatBarBottomPaddingPx); - hotseatBarBottomPaddingPx);
@ -494,7 +439,6 @@ public class DeviceProfile {
paddingBottom); paddingBottom);
} }
} }
return padding;
} }
/** /**
@ -517,18 +461,6 @@ public class DeviceProfile {
} }
} }
private int getWorkspacePageSpacing() {
if (isVerticalBarLayout() || isLargeTablet) {
// In landscape mode the page spacing is set to the default.
return defaultPageSpacingPx;
} else {
// In portrait, we want the pages spaced such that there is no
// overhang of the previous / next page into the current page viewport.
// We assume symmetrical padding in portrait mode.
return Math.max(defaultPageSpacingPx, getWorkspacePadding(null).left + 1);
}
}
public static int calculateCellWidth(int width, int countX) { public static int calculateCellWidth(int width, int countX) {
return width / countX; return width / countX;
} }
@ -545,133 +477,10 @@ public class DeviceProfile {
return isLandscape && transposeLayoutWithOrientation; return isLandscape && transposeLayoutWithOrientation;
} }
boolean shouldFadeAdjacentWorkspaceScreens() { public boolean shouldFadeAdjacentWorkspaceScreens() {
return isVerticalBarLayout() || isLargeTablet; return isVerticalBarLayout() || isLargeTablet;
} }
private static void setLayoutGravity(View v, int gravity) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) v.getLayoutParams();
lp.gravity = gravity;
v.setLayoutParams(lp);
}
public void layout(Launcher launcher, boolean notifyListeners) {
FrameLayout.LayoutParams lp;
boolean hasVerticalBarLayout = isVerticalBarLayout();
// Layout the search bar space
Point searchBarBounds = getSearchBarDimensForWidgetOpts();
View searchBar = launcher.getDropTargetBar();
lp = (FrameLayout.LayoutParams) searchBar.getLayoutParams();
lp.width = searchBarBounds.x;
lp.height = searchBarBounds.y;
lp.topMargin = mInsets.top + edgeMarginPx;
searchBar.setLayoutParams(lp);
// Layout the workspace
PagedView workspace = launcher.getWorkspace();
Rect workspacePadding = getWorkspacePadding(null);
workspace.setPadding(workspacePadding.left, workspacePadding.top, workspacePadding.right,
workspacePadding.bottom);
workspace.setPageSpacing(getWorkspacePageSpacing());
AllAppsScrim allAppsScrim = launcher.findViewById(R.id.all_apps_scrim);
// Layout the hotseat
Hotseat hotseat = launcher.getHotseat();
lp = (FrameLayout.LayoutParams) hotseat.getLayoutParams();
// 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);
float scrimMargin = launcher.getResources().getDimension(R.dimen.all_apps_scrim_margin);
if (hasVerticalBarLayout) {
// Vertical hotseat, on left or right based on the insets
lp.height = LayoutParams.MATCH_PARENT;
if (mInsets.left > mInsets.right) {
lp.gravity = Gravity.LEFT;
lp.width = hotseatBarSizePx + mInsets.left + hotseatBarSidePaddingPx;
hotseat.getLayout().setPadding(
mInsets.left, mInsets.top, hotseatBarSidePaddingPx, mInsets.bottom);
setLayoutGravity(launcher.getDropTargetBar(), Gravity.RIGHT);
} else {
lp.gravity = Gravity.RIGHT;
lp.width = hotseatBarSizePx + mInsets.right + hotseatBarSidePaddingPx;
hotseat.getLayout().setPadding(
hotseatBarSidePaddingPx, mInsets.top, mInsets.right, mInsets.bottom);
setLayoutGravity(launcher.getDropTargetBar(), Gravity.LEFT);
}
} else if (isTablet) {
// Pad the hotseat with the workspace padding calculated above
lp.gravity = Gravity.BOTTOM;
lp.width = LayoutParams.MATCH_PARENT;
lp.height = hotseatBarSizePx + mInsets.bottom;
allAppsScrim.setDrawRegion(lp.height + scrimMargin);
hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left
+ cellLayoutPaddingLeftRightPx,
hotseatBarTopPaddingPx,
hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx,
hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx);
} else {
// For phones, layout the hotseat without any bottom margin
// to ensure that we have space for the folders
lp.gravity = Gravity.BOTTOM;
lp.width = LayoutParams.MATCH_PARENT;
lp.height = hotseatBarSizePx + mInsets.bottom;
allAppsScrim.setDrawRegion(lp.height + scrimMargin);
hotseat.getLayout().setPadding(hotseatAdjustment + workspacePadding.left
+ cellLayoutPaddingLeftRightPx,
hotseatBarTopPaddingPx,
hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx,
hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx);
}
hotseat.setLayoutParams(lp);
// Layout the page indicators
View pageIndicator = launcher.findViewById(R.id.page_indicator);
if (pageIndicator != null) {
lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams();
if (hasVerticalBarLayout) {
if (mInsets.left > mInsets.right) {
lp.leftMargin = hotseatBarSidePaddingPx;
lp.rightMargin = mInsets.right;
lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
} else {
lp.leftMargin = mInsets.left;
lp.rightMargin = hotseatBarSidePaddingPx;
lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
}
lp.bottomMargin = workspacePadding.bottom;
} else {
// Put the page indicators above the hotseat
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.height = pageIndicatorSizePx;
lp.bottomMargin = hotseatBarSizePx + mInsets.bottom;
}
pageIndicator.setLayoutParams(lp);
}
// Layout the AllAppsRecyclerView
AllAppsContainerView appsView = launcher.findViewById(R.id.apps_view);
int paddingLeftRight = desiredWorkspaceLeftRightMarginPx + cellLayoutPaddingLeftRightPx;
appsView.setRecyclerViewSidePadding(paddingLeftRight, paddingLeftRight);
if (notifyListeners) {
for (int i = mListeners.size() - 1; i >= 0; i--) {
mListeners.get(i).onLauncherLayoutChanged();
}
}
}
public int getCellHeight(@ContainerType int containerType) { public int getCellHeight(@ContainerType int containerType) {
switch (containerType) { switch (containerType) {
case CellLayout.WORKSPACE: case CellLayout.WORKSPACE:

View File

@ -21,15 +21,19 @@ import static com.android.launcher3.compat.AccessibilityManagerCompat.isAccessib
import android.animation.TimeInterpolator; import android.animation.TimeInterpolator;
import android.content.Context; import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.ViewDebug; import android.view.ViewDebug;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewPropertyAnimator; import android.view.ViewPropertyAnimator;
import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.dragndrop.DragController.DragListener;
import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragOptions;
import java.util.ArrayList; import java.util.ArrayList;
@ -37,18 +41,14 @@ import java.util.ArrayList;
/* /*
* The top bar containing various drop targets: Delete/App Info/Uninstall. * The top bar containing various drop targets: Delete/App Info/Uninstall.
*/ */
public class DropTargetBar extends LinearLayout implements DragController.DragListener { public class DropTargetBar extends LinearLayout
implements DragListener, Insettable {
protected static final int DEFAULT_DRAG_FADE_DURATION = 175; protected static final int DEFAULT_DRAG_FADE_DURATION = 175;
protected static final TimeInterpolator DEFAULT_INTERPOLATOR = Interpolators.ACCEL; protected static final TimeInterpolator DEFAULT_INTERPOLATOR = Interpolators.ACCEL;
private final Runnable mFadeAnimationEndRunnable = new Runnable() { private final Runnable mFadeAnimationEndRunnable =
() -> updateVisibility(DropTargetBar.this, isAccessibilityEnabled(getContext()));
@Override
public void run() {
updateVisibility(DropTargetBar.this, isAccessibilityEnabled(getContext()));
}
};
@ViewDebug.ExportedProperty(category = "launcher") @ViewDebug.ExportedProperty(category = "launcher")
protected boolean mDeferOnDragEnd; protected boolean mDeferOnDragEnd;
@ -75,6 +75,40 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
setAlpha(0f); setAlpha(0f);
} }
@Override
public void setInsets(Rect insets) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile();
lp.leftMargin = insets.left;
lp.topMargin = insets.top;
lp.bottomMargin = insets.bottom;
lp.rightMargin = insets.right;
if (grid.isVerticalBarLayout()) {
lp.width = grid.dropTargetBarSizePx;
lp.height = grid.availableHeightPx - 2 * grid.edgeMarginPx;
lp.gravity = insets.left > insets.right ? Gravity.RIGHT : Gravity.LEFT;
} else {
int gap;
if (grid.isTablet) {
// XXX: If the icon size changes across orientations, we will have to take
// that into account here too.
gap = ((grid.widthPx - 2 * grid.edgeMarginPx
- (grid.inv.numColumns * grid.cellWidthPx))
/ (2 * (grid.inv.numColumns + 1)))
+ grid.edgeMarginPx;
} else {
gap = grid.desiredWorkspaceLeftRightMarginPx - grid.defaultWidgetPadding.right;
}
lp.width = grid.availableWidthPx - 2 * gap;
lp.topMargin += grid.edgeMarginPx;
lp.height = grid.dropTargetBarSizePx;
}
setLayoutParams(lp);
}
public void setup(DragController dragController) { public void setup(DragController dragController) {
dragController.addDragListener(this); dragController.addDragListener(this);
ArrayList<ButtonDropTarget> outList = new ArrayList<>(); ArrayList<ButtonDropTarget> outList = new ArrayList<>();

View File

@ -22,27 +22,29 @@ import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewDebug; import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.TextView; import android.widget.TextView;
import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher;
import com.android.launcher3.logging.UserEventDispatcher.LogContainerProvider;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
public class Hotseat extends FrameLayout public class Hotseat extends FrameLayout implements LogContainerProvider, Insettable {
implements UserEventDispatcher.LogContainerProvider {
private final Launcher mLauncher;
private CellLayout mContent; private CellLayout mContent;
private Launcher mLauncher;
@ViewDebug.ExportedProperty(category = "launcher") @ViewDebug.ExportedProperty(category = "launcher")
private final boolean mHasVerticalHotseat; private final boolean mHasVerticalHotseat;
@ -64,13 +66,6 @@ public class Hotseat extends FrameLayout
return mContent; return mContent;
} }
/**
* Returns whether there are other icons than the all apps button in the hotseat.
*/
public boolean hasIcons() {
return mContent.getShortcutsAndWidgets().getChildCount() > 1;
}
/** /**
* Registers the specified listener on the cell layout of the hotseat. * Registers the specified listener on the cell layout of the hotseat.
*/ */
@ -165,4 +160,46 @@ public class Hotseat extends FrameLayout
target.gridY = info.cellY; target.gridY = info.cellY;
targetParent.containerType = ContainerType.HOTSEAT; targetParent.containerType = ContainerType.HOTSEAT;
} }
@Override
public void setInsets(Rect insets) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
DeviceProfile grid = mLauncher.getDeviceProfile();
if (mHasVerticalHotseat) {
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
if (insets.left > insets.right) {
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 {
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);
}
setLayoutParams(lp);
InsettableFrameLayout.dispatchInsets(this, insets);
}
} }

View File

@ -97,4 +97,14 @@ public class InsettableFrameLayout extends FrameLayout implements Insettable {
super.onViewAdded(child); super.onViewAdded(child);
setFrameLayoutChildInsets(child, mInsets, new Rect()); setFrameLayoutChildInsets(child, mInsets, new Rect());
} }
public static void dispatchInsets(ViewGroup parent, Rect insets) {
final int n = parent.getChildCount();
for (int i = 0; i < n; i++) {
final View child = parent.getChildAt(i);
if (child instanceof Insettable) {
((Insettable) child).setInsets(insets);
}
}
}
} }

View File

@ -337,8 +337,6 @@ public class Launcher extends BaseActivity
mLauncherView = LayoutInflater.from(this).inflate(R.layout.launcher, null); mLauncherView = LayoutInflater.from(this).inflate(R.layout.launcher, null);
setupViews(); setupViews();
mDeviceProfile.layout(this, false /* notifyListeners */);
mPopupDataProvider = new PopupDataProvider(this); mPopupDataProvider = new PopupDataProvider(this);
mRotationEnabled = getResources().getBoolean(R.bool.allow_rotation); mRotationEnabled = getResources().getBoolean(R.bool.allow_rotation);
@ -392,6 +390,7 @@ public class Launcher extends BaseActivity
? SCREEN_ORIENTATION_UNSPECIFIED : SCREEN_ORIENTATION_NOSENSOR); ? SCREEN_ORIENTATION_UNSPECIFIED : SCREEN_ORIENTATION_NOSENSOR);
setContentView(mLauncherView); setContentView(mLauncherView);
((LauncherRootView) mLauncherView).dispatchInsets();
// Listen for broadcasts // Listen for broadcasts
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
@ -441,11 +440,6 @@ public class Launcher extends BaseActivity
private LauncherCallbacks mLauncherCallbacks; private LauncherCallbacks mLauncherCallbacks;
public void onInsetsChanged(Rect insets) {
mDeviceProfile.updateInsets(insets);
mDeviceProfile.layout(this, true /* notifyListeners */);
}
/** /**
* Call this after onCreate to set or clear overlay. * Call this after onCreate to set or clear overlay.
*/ */

View File

@ -16,6 +16,8 @@ import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW;
public class LauncherRootView extends InsettableFrameLayout { public class LauncherRootView extends InsettableFrameLayout {
private final Launcher mLauncher;
private final Paint mOpaquePaint; private final Paint mOpaquePaint;
@ViewDebug.ExportedProperty(category = "launcher") @ViewDebug.ExportedProperty(category = "launcher")
private boolean mDrawSideInsetBar; private boolean mDrawSideInsetBar;
@ -32,6 +34,8 @@ public class LauncherRootView extends InsettableFrameLayout {
mOpaquePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mOpaquePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mOpaquePaint.setColor(Color.BLACK); mOpaquePaint.setColor(Color.BLACK);
mOpaquePaint.setStyle(Paint.Style.FILL); mOpaquePaint.setStyle(Paint.Style.FILL);
mLauncher = Launcher.getLauncher(context);
} }
@Override @Override
@ -57,10 +61,11 @@ public class LauncherRootView extends InsettableFrameLayout {
} else { } else {
mLeftInsetBarWidth = mRightInsetBarWidth = 0; mLeftInsetBarWidth = mRightInsetBarWidth = 0;
} }
Launcher.getLauncher(getContext()).getSystemUiController().updateUiState( mLauncher.getSystemUiController().updateUiState(
UI_STATE_ROOT_VIEW, mDrawSideInsetBar ? FLAG_DARK_NAV : 0); UI_STATE_ROOT_VIEW, mDrawSideInsetBar ? FLAG_DARK_NAV : 0);
boolean rawInsetsChanged = !mInsets.equals(insets); // Update device profile before notifying th children.
mLauncher.getDeviceProfile().updateInsets(insets);
setInsets(insets); setInsets(insets);
if (mAlignedView != null) { if (mAlignedView != null) {
@ -73,15 +78,13 @@ public class LauncherRootView extends InsettableFrameLayout {
} }
} }
if (rawInsetsChanged) {
// Update the grid again
Launcher launcher = Launcher.getLauncher(getContext());
launcher.onInsetsChanged(insets);
}
return true; // I'll take it from here return true; // I'll take it from here
} }
public void dispatchInsets() {
fitSystemWindows(mInsets);
}
@Override @Override
protected void dispatchDraw(Canvas canvas) { protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas); super.dispatchDraw(canvas);

View File

@ -310,6 +310,20 @@ public class Workspace extends PagedView
@Override @Override
public void setInsets(Rect insets) { public void setInsets(Rect insets) {
mInsets.set(insets); mInsets.set(insets);
DeviceProfile grid = mLauncher.getDeviceProfile();
Rect padding = grid.workspacePadding;
setPadding(padding.left, padding.top, padding.right, padding.bottom);
if (grid.shouldFadeAdjacentWorkspaceScreens()) {
// In landscape mode the page spacing is set to the default.
setPageSpacing(grid.defaultPageSpacingPx);
} else {
// In portrait, we want the pages spaced such that there is no
// overhang of the previous / next page into the current page viewport.
// We assume symmetrical padding in portrait mode.
setPageSpacing(Math.max(grid.defaultPageSpacingPx, padding.left + 1));
}
} }
/** /**

View File

@ -44,6 +44,7 @@ import com.android.launcher3.DragSource;
import com.android.launcher3.DropTarget; import com.android.launcher3.DropTarget;
import com.android.launcher3.DropTarget.DragObject; import com.android.launcher3.DropTarget.DragObject;
import com.android.launcher3.Insettable; import com.android.launcher3.Insettable;
import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.ItemInfo; import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher; import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherState;
@ -69,8 +70,7 @@ import java.util.Set;
* The all apps view container. * The all apps view container.
*/ */
public class AllAppsContainerView extends RelativeLayout implements DragSource, public class AllAppsContainerView extends RelativeLayout implements DragSource,
View.OnLongClickListener, Insettable, DeviceProfile.LauncherLayoutChangeListener, View.OnLongClickListener, Insettable, BubbleTextView.BubbleTextShadowHandler {
BubbleTextView.BubbleTextShadowHandler {
private final Launcher mLauncher; private final Launcher mLauncher;
private final AdapterHolder[] mAH; private final AdapterHolder[] mAH;
@ -126,11 +126,6 @@ public class AllAppsContainerView extends RelativeLayout implements DragSource,
@Override @Override
protected void onAttachedToWindow() { protected void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile();
grid.addLauncherLayoutChangedListener(this);
onLauncherLayoutChanged();
applyTouchDelegate(); applyTouchDelegate();
} }
@ -138,28 +133,6 @@ public class AllAppsContainerView extends RelativeLayout implements DragSource,
// TODO: Reimplement once fast scroller is fixed. // TODO: Reimplement once fast scroller is fixed.
} }
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
DeviceProfile grid = Launcher.getLauncher(getContext()).getDeviceProfile();
grid.removeLauncherLayoutChangedListener(this);
}
/**
* Calculate the background padding as it can change due to insets/content padding change.
*/
@Override
public void onLauncherLayoutChanged() {
DeviceProfile grid = mLauncher.getDeviceProfile();
if (!grid.isVerticalBarLayout()) {
return;
}
Rect workspacePadding = grid.getWorkspacePadding(null);
setPadding(workspacePadding.left, 0, workspacePadding.right, 0);
}
@Override @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); super.onLayout(changed, left, top, right, bottom);
@ -364,8 +337,12 @@ public class AllAppsContainerView extends RelativeLayout implements DragSource,
@Override @Override
public void setInsets(Rect insets) { public void setInsets(Rect insets) {
DeviceProfile grid = mLauncher.getDeviceProfile(); DeviceProfile grid = mLauncher.getDeviceProfile();
int leftRightPadding = grid.desiredWorkspaceLeftRightMarginPx
+ grid.cellLayoutPaddingLeftRightPx;
for (int i = 0; i < mAH.length; i++) { for (int i = 0; i < mAH.length; i++) {
mAH[i].padding.bottom = insets.bottom; mAH[i].padding.bottom = insets.bottom;
mAH[i].padding.left = mAH[i].padding.right = leftRightPadding;
mAH[i].applyPadding(); mAH[i].applyPadding();
} }
if (grid.isVerticalBarLayout()) { if (grid.isVerticalBarLayout()) {
@ -374,12 +351,14 @@ public class AllAppsContainerView extends RelativeLayout implements DragSource,
mlp.topMargin = insets.top; mlp.topMargin = insets.top;
mlp.rightMargin = insets.right; mlp.rightMargin = insets.right;
setLayoutParams(mlp); setLayoutParams(mlp);
setPadding(grid.workspacePadding.left, 0, grid.workspacePadding.right, 0);
} else { } else {
View navBarBg = findViewById(R.id.nav_bar_bg); View navBarBg = findViewById(R.id.nav_bar_bg);
ViewGroup.LayoutParams navBarBgLp = navBarBg.getLayoutParams(); ViewGroup.LayoutParams navBarBgLp = navBarBg.getLayoutParams();
navBarBgLp.height = insets.bottom; navBarBgLp.height = insets.bottom;
navBarBg.setLayoutParams(navBarBgLp); navBarBg.setLayoutParams(navBarBgLp);
} }
InsettableFrameLayout.dispatchInsets(this, insets);
} }
public void updateIconBadges(Set<PackageUserKey> updatedBadges) { public void updateIconBadges(Set<PackageUserKey> updatedBadges) {
@ -575,14 +554,6 @@ public class AllAppsContainerView extends RelativeLayout implements DragSource,
} }
} }
public void setRecyclerViewSidePadding(int left, int right) {
for (int i = 0; i < mAH.length; i++) {
mAH[i].padding.left = left;
mAH[i].padding.right = right;
mAH[i].applyPadding();
}
}
public void setRecyclerViewVerticalFadingEdgeEnabled(boolean enabled) { public void setRecyclerViewVerticalFadingEdgeEnabled(boolean enabled) {
for (int i = 0; i < mAH.length; i++) { for (int i = 0; i < mAH.length; i++) {
mAH[i].applyVerticalFadingEdgeEnabled(enabled); mAH[i].applyVerticalFadingEdgeEnabled(enabled);

View File

@ -18,10 +18,16 @@ package com.android.launcher3.pageindicators;
import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.ALL_APPS;
import android.content.Context; import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.FrameLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher; import com.android.launcher3.Launcher;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
@ -31,9 +37,11 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
* a view with as large an area as we want (for touching) while maintaining a caret of size * a view with as large an area as we want (for touching) while maintaining a caret of size
* all_apps_caret_size. Used only for the landscape layout. * all_apps_caret_size. Used only for the landscape layout.
*/ */
public class PageIndicatorLandscape extends PageIndicator implements OnClickListener { public class PageIndicatorLandscape extends PageIndicator implements OnClickListener, Insettable {
// all apps pull up handle drawable. // all apps pull up handle drawable.
private final Launcher mLauncher;
public PageIndicatorLandscape(Context context) { public PageIndicatorLandscape(Context context) {
this(context, null); this(context, null);
} }
@ -45,7 +53,8 @@ public class PageIndicatorLandscape extends PageIndicator implements OnClickList
public PageIndicatorLandscape(Context context, AttributeSet attrs, int defStyle) { public PageIndicatorLandscape(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
setOnClickListener(this); setOnClickListener(this);
setOnFocusChangeListener(Launcher.getLauncher(context).mFocusHandler); mLauncher = Launcher.getLauncher(context);
setOnFocusChangeListener(mLauncher.mFocusHandler);
} }
@Override @Override
@ -57,4 +66,21 @@ public class PageIndicatorLandscape extends PageIndicator implements OnClickList
l.getStateManager().goToState(ALL_APPS); l.getStateManager().goToState(ALL_APPS);
} }
} }
@Override
public void setInsets(Rect insets) {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
DeviceProfile grid = mLauncher.getDeviceProfile();
if (insets.left > insets.right) {
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;
setLayoutParams(lp);
}
} }

View File

@ -9,12 +9,17 @@ import android.content.res.Resources;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Property; import android.util.Property;
import android.view.Gravity;
import android.view.ViewConfiguration; import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher; import com.android.launcher3.Launcher;
import com.android.launcher3.R; import com.android.launcher3.R;
import com.android.launcher3.Utilities; import com.android.launcher3.Utilities;
@ -25,7 +30,7 @@ import com.android.launcher3.dynamicui.WallpaperColorInfo;
* *
* The fraction is 1 / number of pages and the position is based on the progress of the page scroll. * The fraction is 1 / number of pages and the position is based on the progress of the page scroll.
*/ */
public class PageIndicatorLine extends PageIndicator { public class PageIndicatorLine extends PageIndicator implements Insettable {
private static final int LINE_ANIMATE_DURATION = ViewConfiguration.getScrollBarFadeDuration(); private static final int LINE_ANIMATE_DURATION = ViewConfiguration.getScrollBarFadeDuration();
private static final int LINE_FADE_DELAY = ViewConfiguration.getScrollDefaultDelay(); private static final int LINE_FADE_DELAY = ViewConfiguration.getScrollDefaultDelay();
@ -39,6 +44,7 @@ public class PageIndicatorLine extends PageIndicator {
private ValueAnimator[] mAnimators = new ValueAnimator[3]; private ValueAnimator[] mAnimators = new ValueAnimator[3];
private final Handler mDelayedLineFadeHandler = new Handler(Looper.getMainLooper()); private final Handler mDelayedLineFadeHandler = new Handler(Looper.getMainLooper());
private final Launcher mLauncher;
private boolean mShouldAutoHide = true; private boolean mShouldAutoHide = true;
@ -51,7 +57,6 @@ public class PageIndicatorLine extends PageIndicator {
private int mCurrentScroll; private int mCurrentScroll;
private int mTotalScroll; private int mTotalScroll;
private Paint mLinePaint; private Paint mLinePaint;
private Launcher mLauncher;
private final int mLineHeight; private final int mLineHeight;
private static final Property<PageIndicatorLine, Integer> PAINT_ALPHA private static final Property<PageIndicatorLine, Integer> PAINT_ALPHA
@ -224,4 +229,14 @@ public class PageIndicatorLine extends PageIndicator {
mAnimators[animatorIndex].setDuration(LINE_ANIMATE_DURATION); mAnimators[animatorIndex].setDuration(LINE_ANIMATE_DURATION);
mAnimators[animatorIndex].start(); mAnimators[animatorIndex].start();
} }
@Override
public void setInsets(Rect insets) {
DeviceProfile grid = mLauncher.getDeviceProfile();
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.height = grid.pageIndicatorSizePx;
lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;
setLayoutParams(lp);
}
} }

View File

@ -65,7 +65,7 @@ public class SpringLoadedState extends LauncherState {
float scaledHeight = scale * ws.getNormalChildHeight(); float scaledHeight = scale * ws.getNormalChildHeight();
float shrunkTop = insets.top + grid.dropTargetBarSizePx; float shrunkTop = insets.top + grid.dropTargetBarSizePx;
float shrunkBottom = ws.getMeasuredHeight() - insets.bottom float shrunkBottom = ws.getMeasuredHeight() - insets.bottom
- grid.getWorkspacePadding(null).bottom - grid.workspacePadding.bottom
- grid.workspaceSpringLoadedBottomSpace; - grid.workspaceSpringLoadedBottomSpace;
float totalShrunkSpace = shrunkBottom - shrunkTop; float totalShrunkSpace = shrunkBottom - shrunkTop;

View File

@ -30,14 +30,14 @@ import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher; import com.android.launcher3.Launcher;
import com.android.launcher3.R; import com.android.launcher3.R;
import com.android.launcher3.dynamicui.WallpaperColorInfo; import com.android.launcher3.dynamicui.WallpaperColorInfo;
import com.android.launcher3.dynamicui.WallpaperColorInfo.OnChangeListener;
import com.android.launcher3.graphics.NinePatchDrawHelper; import com.android.launcher3.graphics.NinePatchDrawHelper;
import com.android.launcher3.graphics.ShadowGenerator; import com.android.launcher3.graphics.ShadowGenerator;
import com.android.launcher3.util.Themes; import com.android.launcher3.util.Themes;
import static com.android.launcher3.graphics.NinePatchDrawHelper.EXTENSION_PX; import static com.android.launcher3.graphics.NinePatchDrawHelper.EXTENSION_PX;
public class AllAppsScrim extends View implements WallpaperColorInfo.OnChangeListener, Insettable, public class AllAppsScrim extends View implements OnChangeListener, Insettable {
DeviceProfile.LauncherLayoutChangeListener {
private static final int MAX_ALPHA = 235; private static final int MAX_ALPHA = 235;
private static final int MIN_ALPHA_PORTRAIT = 100; private static final int MIN_ALPHA_PORTRAIT = 100;
@ -112,15 +112,12 @@ public class AllAppsScrim extends View implements WallpaperColorInfo.OnChangeLis
protected void onAttachedToWindow() { protected void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
mWallpaperColorInfo.addOnChangeListener(this); mWallpaperColorInfo.addOnChangeListener(this);
mGrid.addLauncherLayoutChangedListener(this);
onLauncherLayoutChanged();
} }
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
mWallpaperColorInfo.removeOnChangeListener(this); mWallpaperColorInfo.removeOnChangeListener(this);
mGrid.removeLauncherLayoutChangedListener(this);
} }
@Override @Override
@ -171,19 +168,16 @@ public class AllAppsScrim extends View implements WallpaperColorInfo.OnChangeLis
@Override @Override
public void setInsets(Rect insets) { public void setInsets(Rect insets) {
mInsets.set(insets); mInsets.set(insets);
onLauncherLayoutChanged(); if (mGrid.isVerticalBarLayout()) {
} mPadding.set(mGrid.workspacePadding);
mPadding.bottom = 0;
@Override mPadding.left += mInsets.left;
public void onLauncherLayoutChanged() { mPadding.top = mInsets.top;
if (!mGrid.isVerticalBarLayout()) { mPadding.right += mInsets.right;
return; } else {
float scrimMargin = getResources().getDimension(R.dimen.all_apps_scrim_margin);
setDrawRegion(mGrid.hotseatBarSizePx + insets.bottom + scrimMargin);
} }
mGrid.getWorkspacePadding(mPadding);
mPadding.bottom = 0;
mPadding.left += mInsets.left;
mPadding.top = mInsets.top;
mPadding.right += mInsets.right;
invalidate(); invalidate();
} }
} }

View File

@ -42,8 +42,6 @@ public class WidgetsFullSheet extends BaseWidgetSheet
private static final long FADE_IN_DURATION = 150; private static final long FADE_IN_DURATION = 150;
private static final float VERTICAL_START_POSITION = 0.3f; private static final float VERTICAL_START_POSITION = 0.3f;
private static final Rect sTempRect = new Rect();
private final Rect mInsets = new Rect(); private final Rect mInsets = new Rect();
private final WidgetsListAdapter mAdapter; private final WidgetsListAdapter mAdapter;
@ -115,8 +113,8 @@ public class WidgetsFullSheet extends BaseWidgetSheet
mGradientView.setVisibility(View.INVISIBLE); mGradientView.setVisibility(View.INVISIBLE);
widthUsed = 0; widthUsed = 0;
} else { } else {
mLauncher.getDeviceProfile().getWorkspacePadding(sTempRect); Rect padding = mLauncher.getDeviceProfile().workspacePadding;
widthUsed = Math.max(sTempRect.left + sTempRect.right, widthUsed = Math.max(padding.left + padding.right,
2 * (mInsets.left + mInsets.right)); 2 * (mInsets.left + mInsets.right));
} }

View File

@ -51,9 +51,8 @@ public class OverviewState extends LauncherState {
int overviewButtonBarHeight = OverviewPanel.getButtonBarHeight(launcher); int overviewButtonBarHeight = OverviewPanel.getButtonBarHeight(launcher);
int scaledHeight = (int) (SCALE_FACTOR * ws.getNormalChildHeight()); int scaledHeight = (int) (SCALE_FACTOR * ws.getNormalChildHeight());
Rect workspacePadding = grid.getWorkspacePadding(null); int workspaceTop = insets.top + grid.workspacePadding.top;
int workspaceTop = insets.top + workspacePadding.top; int workspaceBottom = ws.getHeight() - insets.bottom - grid.workspacePadding.bottom;
int workspaceBottom = ws.getHeight() - insets.bottom - workspacePadding.bottom;
int overviewTop = insets.top; int overviewTop = insets.top;
int overviewBottom = ws.getHeight() - insets.bottom - overviewButtonBarHeight; int overviewBottom = ws.getHeight() - insets.bottom - overviewButtonBarHeight;
int workspaceOffsetTopEdge = int workspaceOffsetTopEdge =