mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-19 10:48:19 +00:00
The application context for LauncherAppState is supplied by the application whenever it starts; don't ask for an instance before that. Change-Id: I1ca8ea04238a357a682f79250f08813ead7ae532
162 lines
5.4 KiB
Java
162 lines
5.4 KiB
Java
/*
|
|
* Copyright (C) 2010 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;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
|
|
/**
|
|
* An abstraction of the original CellLayout which supports laying out items
|
|
* which span multiple cells into a grid-like layout. Also supports dimming
|
|
* to give a preview of its contents.
|
|
*/
|
|
public class PagedViewCellLayoutChildren extends ViewGroup {
|
|
static final String TAG = "PagedViewCellLayout";
|
|
|
|
private boolean mCenterContent;
|
|
|
|
private int mCellWidth;
|
|
private int mCellHeight;
|
|
private int mWidthGap;
|
|
private int mHeightGap;
|
|
|
|
public PagedViewCellLayoutChildren(Context context) {
|
|
super(context);
|
|
}
|
|
|
|
@Override
|
|
public void cancelLongPress() {
|
|
super.cancelLongPress();
|
|
|
|
// Cancel long press for all children
|
|
final int count = getChildCount();
|
|
for (int i = 0; i < count; i++) {
|
|
final View child = getChildAt(i);
|
|
child.cancelLongPress();
|
|
}
|
|
}
|
|
|
|
public void setGap(int widthGap, int heightGap) {
|
|
mWidthGap = widthGap;
|
|
mHeightGap = heightGap;
|
|
requestLayout();
|
|
}
|
|
|
|
public void setCellDimensions(int width, int height) {
|
|
mCellWidth = width;
|
|
mCellHeight = height;
|
|
requestLayout();
|
|
}
|
|
|
|
@Override
|
|
public void requestChildFocus(View child, View focused) {
|
|
super.requestChildFocus(child, focused);
|
|
if (child != null) {
|
|
Rect r = new Rect();
|
|
child.getDrawingRect(r);
|
|
requestRectangleOnScreen(r);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
|
|
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
|
|
|
|
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
|
|
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) {
|
|
throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions");
|
|
}
|
|
|
|
final int count = getChildCount();
|
|
for (int i = 0; i < count; i++) {
|
|
View child = getChildAt(i);
|
|
PagedViewCellLayout.LayoutParams lp =
|
|
(PagedViewCellLayout.LayoutParams) child.getLayoutParams();
|
|
lp.setup(getContext(),
|
|
mCellWidth, mCellHeight, mWidthGap, mHeightGap,
|
|
getPaddingLeft(),
|
|
getPaddingTop());
|
|
|
|
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
|
|
MeasureSpec.EXACTLY);
|
|
int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
|
|
MeasureSpec.EXACTLY);
|
|
|
|
child.measure(childWidthMeasureSpec, childheightMeasureSpec);
|
|
}
|
|
|
|
setMeasuredDimension(widthSpecSize, heightSpecSize);
|
|
}
|
|
|
|
@Override
|
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
int count = getChildCount();
|
|
|
|
int offsetX = 0;
|
|
if (mCenterContent && count > 0) {
|
|
// determine the max width of all the rows and center accordingly
|
|
int maxRowX = 0;
|
|
int minRowX = Integer.MAX_VALUE;
|
|
for (int i = 0; i < count; i++) {
|
|
View child = getChildAt(i);
|
|
if (child.getVisibility() != GONE) {
|
|
PagedViewCellLayout.LayoutParams lp =
|
|
(PagedViewCellLayout.LayoutParams) child.getLayoutParams();
|
|
minRowX = Math.min(minRowX, lp.x);
|
|
maxRowX = Math.max(maxRowX, lp.x + lp.width);
|
|
}
|
|
}
|
|
int maxRowWidth = maxRowX - minRowX;
|
|
offsetX = (getMeasuredWidth() - maxRowWidth) / 2;
|
|
}
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
View child = getChildAt(i);
|
|
if (child.getVisibility() != GONE) {
|
|
PagedViewCellLayout.LayoutParams lp =
|
|
(PagedViewCellLayout.LayoutParams) child.getLayoutParams();
|
|
|
|
int childLeft = offsetX + lp.x;
|
|
int childTop = lp.y;
|
|
child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void enableCenteredContent(boolean enabled) {
|
|
mCenterContent = enabled;
|
|
}
|
|
|
|
@Override
|
|
protected void setChildrenDrawingCacheEnabled(boolean enabled) {
|
|
final int count = getChildCount();
|
|
for (int i = 0; i < count; i++) {
|
|
final View view = getChildAt(i);
|
|
view.setDrawingCacheEnabled(enabled);
|
|
// Update the drawing caches
|
|
if (!view.isHardwareAccelerated()) {
|
|
view.buildDrawingCache(true);
|
|
}
|
|
}
|
|
}
|
|
}
|