diff options
author | Winson Chung <winsonc@google.com> | 2013-10-09 15:50:52 -0700 |
---|---|---|
committer | Winson Chung <winsonc@google.com> | 2013-10-09 17:53:32 -0700 |
commit | 3a6e7f330e680ef718ca7c0921d842efb4d8bbae (patch) | |
tree | 260e400c897a77d6727e5ea5f933864fa2ac1ace /src/com/android/launcher3 | |
parent | 558f1c2ac73c3a0c3c0c316222b6b7f9c76e2501 (diff) | |
download | android_packages_apps_Trebuchet-3a6e7f330e680ef718ca7c0921d842efb4d8bbae.tar.gz android_packages_apps_Trebuchet-3a6e7f330e680ef718ca7c0921d842efb4d8bbae.tar.bz2 android_packages_apps_Trebuchet-3a6e7f330e680ef718ca7c0921d842efb4d8bbae.zip |
Initial changes for new clings. (Bug 11142616)
Change-Id: Id66ebceb99449941921d9e617dfe0cc05a2e3b65
Diffstat (limited to 'src/com/android/launcher3')
-rw-r--r-- | src/com/android/launcher3/CellLayout.java | 34 | ||||
-rw-r--r-- | src/com/android/launcher3/Cling.java | 100 | ||||
-rw-r--r-- | src/com/android/launcher3/Hotseat.java | 22 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 37 | ||||
-rw-r--r-- | src/com/android/launcher3/ShortcutAndWidgetContainer.java | 7 | ||||
-rw-r--r-- | src/com/android/launcher3/Utilities.java | 17 |
6 files changed, 181 insertions, 36 deletions
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index e3312d557..dafb79ffc 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -169,6 +169,8 @@ public class CellLayout extends ViewGroup { private static final int INVALID_DIRECTION = -100; private DropTarget.DragEnforcer mDragEnforcer; + private Rect mTempRect = new Rect(); + private final static PorterDuffXfermode sAddBlendMode = new PorterDuffXfermode(PorterDuff.Mode.ADD); private final static Paint sPaint = new Paint(); @@ -397,25 +399,6 @@ public class CellLayout extends ViewGroup { } } - public void scaleRect(Rect r, float scale) { - if (scale != 1.0f) { - r.left = (int) (r.left * scale + 0.5f); - r.top = (int) (r.top * scale + 0.5f); - r.right = (int) (r.right * scale + 0.5f); - r.bottom = (int) (r.bottom * scale + 0.5f); - } - } - - Rect temp = new Rect(); - void scaleRectAboutCenter(Rect in, Rect out, float scale) { - int cx = in.centerX(); - int cy = in.centerY(); - out.set(in); - out.offset(-cx, -cy); - scaleRect(out, scale); - out.offset(cx, cy); - } - @Override protected void onDraw(Canvas canvas) { // When we're large, we are either drawn in a "hover" state (ie when dragging an item to @@ -443,10 +426,11 @@ public class CellLayout extends ViewGroup { final float alpha = mDragOutlineAlphas[i]; if (alpha > 0) { final Rect r = mDragOutlines[i]; - scaleRectAboutCenter(r, temp, getChildrenScale()); + mTempRect.set(r); + Utilities.scaleRectAboutCenter(mTempRect, getChildrenScale()); final Bitmap b = (Bitmap) mDragOutlineAnims[i].getTag(); paint.setAlpha((int)(alpha + .5f)); - canvas.drawBitmap(b, null, temp, paint); + canvas.drawBitmap(b, null, mTempRect, paint); } } @@ -456,9 +440,13 @@ public class CellLayout extends ViewGroup { final int padding = mPressedOrFocusedIcon.getPressedOrFocusedBackgroundPadding(); final Bitmap b = mPressedOrFocusedIcon.getPressedOrFocusedBackground(); if (b != null) { + int offset = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - + (mCountX * mCellWidth); + int left = getPaddingLeft() + (int) Math.ceil(offset / 2f); + int top = getPaddingTop(); canvas.drawBitmap(b, - mPressedOrFocusedIcon.getLeft() + getPaddingLeft() - padding, - mPressedOrFocusedIcon.getTop() + getPaddingTop() - padding, + mPressedOrFocusedIcon.getLeft() + left - padding, + mPressedOrFocusedIcon.getTop() + top - padding, null); } } diff --git a/src/com/android/launcher3/Cling.java b/src/com/android/launcher3/Cling.java index de92605d9..338b722ab 100644 --- a/src/com/android/launcher3/Cling.java +++ b/src/com/android/launcher3/Cling.java @@ -18,17 +18,13 @@ package com.android.launcher3; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; +import android.app.ActivityOptions; import android.content.Context; +import android.content.ComponentName; +import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; +import android.graphics.*; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -37,8 +33,10 @@ import android.view.MotionEvent; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.widget.FrameLayout; +import android.widget.TextView; -public class Cling extends FrameLayout implements Insettable, View.OnLongClickListener { +public class Cling extends FrameLayout implements Insettable, View.OnClickListener, + View.OnLongClickListener, View.OnTouchListener { static final String FIRST_RUN_CLING_DISMISSED_KEY = "cling_gel.first_run.dismissed"; static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed"; @@ -66,6 +64,12 @@ public class Cling extends FrameLayout implements Insettable, View.OnLongClickLi private String mDrawIdentifier; private Drawable mBackground; + private int[] mTouchDownPt = new int[2]; + + private Drawable mFocusedHotseatApp; + private ComponentName mFocusedHotseatAppComponent; + private Rect mFocusedHotseatAppBounds; + private Paint mErasePaint; private Paint mBubblePaint; private Paint mDotPaint; @@ -100,6 +104,8 @@ public class Cling extends FrameLayout implements Insettable, View.OnLongClickLi mScrimView = scrim; mBackgroundColor = 0xdd000000; setOnLongClickListener(this); + setOnClickListener(this); + setOnTouchListener(this); mErasePaint = new Paint(); mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); @@ -121,6 +127,46 @@ public class Cling extends FrameLayout implements Insettable, View.OnLongClickLi } } + void setFocusedHotseatApp(int drawableId, int appRank, ComponentName cn, String title, + String description) { + // Get the app to draw + Resources r = getResources(); + int appIconId = drawableId; + Hotseat hotseat = mLauncher.getHotseat(); + if (hotseat != null && appIconId > -1 && appRank > -1 && !title.isEmpty() && + !description.isEmpty()) { + // Set the app bounds + int x = hotseat.getCellXFromOrder(appRank); + int y = hotseat.getCellYFromOrder(appRank); + Rect pos = hotseat.getCellCoordinates(x, y); + LauncherAppState app = LauncherAppState.getInstance(); + DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); + mFocusedHotseatApp = getResources().getDrawable(appIconId); + mFocusedHotseatAppComponent = cn; + mFocusedHotseatAppBounds = new Rect(pos.left, pos.top, + pos.left + Utilities.sIconTextureWidth, + pos.top + Utilities.sIconTextureHeight); + Utilities.scaleRectAboutCenter(mFocusedHotseatAppBounds, + (grid.hotseatIconSize / grid.iconSize)); + + // Set the title + TextView v = (TextView) findViewById(R.id.focused_hotseat_app_title); + if (v != null) { + v.setText(title); + } + + // Set the description + v = (TextView) findViewById(R.id.focused_hotseat_app_description); + if (v != null) { + v.setText(description); + } + + // Show the bubble + View bubble = findViewById(R.id.focused_hotseat_app_bubble); + bubble.setVisibility(View.VISIBLE); + } + } + void show(boolean animate, int duration) { setVisibility(View.VISIBLE); setLayerType(View.LAYER_TYPE_HARDWARE, null); @@ -275,6 +321,32 @@ public class Cling extends FrameLayout implements Insettable, View.OnLongClickLi }; @Override + public boolean onTouch(View v, MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mTouchDownPt[0] = (int) ev.getX(); + mTouchDownPt[1] = (int) ev.getY(); + } + return false; + } + + @Override + public void onClick(View v) { + if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || + mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || + mDrawIdentifier.equals(WORKSPACE_LARGE)) { + if (mFocusedHotseatAppBounds != null && + mFocusedHotseatAppBounds.contains(mTouchDownPt[0], mTouchDownPt[1])) { + // Launch the activity that is being highlighted + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setComponent(mFocusedHotseatAppComponent); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + mLauncher.startActivity(intent, null); + mLauncher.dismissWorkspaceCling(this); + } + } + } + + @Override public boolean onLongClick(View v) { if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) || mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) || @@ -354,8 +426,16 @@ public class Cling extends FrameLayout implements Insettable, View.OnLongClickLi canvas.drawBitmap(eraseBg, 0, 0, null); eraseCanvas.setBitmap(null); eraseBg = null; - } + // Draw the focused hotseat app icon + if (mFocusedHotseatAppBounds != null && mFocusedHotseatApp != null) { + mFocusedHotseatApp.setBounds(mFocusedHotseatAppBounds.left, + mFocusedHotseatAppBounds.top, mFocusedHotseatAppBounds.right, + mFocusedHotseatAppBounds.bottom); + mFocusedHotseatApp.setAlpha((int) (255 * alpha)); + mFocusedHotseatApp.draw(canvas); + } + } canvas.restore(); } diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 986a89b5d..1f876fd6b 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -20,12 +20,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Bitmap; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; @@ -102,6 +101,25 @@ public class Hotseat extends FrameLayout { } } + /** This returns the coordinates of an app in a given cell, relative to the DragLayer */ + Rect getCellCoordinates(int cellX, int cellY) { + Rect coords = new Rect(); + mContent.cellToRect(cellX, cellY, 1, 1, coords); + int[] hotseatInParent = new int[2]; + Utilities.getDescendantCoordRelativeToParent(this, mLauncher.getDragLayer(), + hotseatInParent, false); + coords.offset(hotseatInParent[0], hotseatInParent[1]); + + // Center the icon + int cWidth = mContent.getShortcutsAndWidgets().getCellContentWidth(); + int cHeight = mContent.getShortcutsAndWidgets().getCellContentHeight(); + int cellPaddingX = (int) Math.max(0, ((coords.width() - cWidth) / 2f)); + int cellPaddingY = (int) Math.max(0, ((coords.height() - cHeight) / 2f)); + coords.offset(cellPaddingX, cellPaddingY); + + return coords; + } + @Override protected void onFinishInflate() { super.onFinishInflate(); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 5aec399b5..61b46a7be 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -4082,6 +4082,13 @@ public class Launcher extends Activity return false; } + // For now, limit only to phones + LauncherAppState app = LauncherAppState.getInstance(); + DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); + if (grid.isTablet()) { + return false; + } + // disable clings when running in a test harness if(ActivityManager.isRunningInTestHarness()) return false; @@ -4234,12 +4241,34 @@ public class Launcher extends Activity protected String getFirstRunCustomContentHint() { return ""; } + protected int getFirstRunFocusedHotseatAppDrawableId() { + return -1; + } + protected ComponentName getFirstRunFocusedHotseatAppComponentName() { + return null; + } + protected int getFirstRunFocusedHotseatAppRank() { + return -1; + } + protected String getFirstRunFocusedHotseatAppBubbleTitle() { + return ""; + } + protected String getFirstRunFocusedHotseatAppBubbleDescription() { + return ""; + } public void showFirstRunWorkspaceCling() { // Enable the clings only if they have not been dismissed before if (isClingsEnabled() && !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) { - initCling(R.id.workspace_cling, 0, false, true); + Cling c = initCling(R.id.workspace_cling, 0, false, true); + + // Set the focused hotseat app if there is one + c.setFocusedHotseatApp(getFirstRunFocusedHotseatAppDrawableId(), + getFirstRunFocusedHotseatAppRank(), + getFirstRunFocusedHotseatAppComponentName(), + getFirstRunFocusedHotseatAppBubbleTitle(), + getFirstRunFocusedHotseatAppBubbleDescription()); } else { removeCling(R.id.workspace_cling); } @@ -4276,6 +4305,9 @@ public class Launcher extends Activity }; dismissCling(cling, cb, Cling.FIRST_RUN_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION, false); + + // Fade out the search bar for the workspace cling coming up + mSearchDropTargetBar.hideSearchBar(true); } public void dismissWorkspaceCling(View v) { Cling cling = (Cling) findViewById(R.id.workspace_cling); @@ -4289,6 +4321,9 @@ public class Launcher extends Activity } dismissCling(cling, cb, Cling.WORKSPACE_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION, true); + + // Fade in the search bar + mSearchDropTargetBar.showSearchBar(true); } public void dismissFolderCling(View v) { Cling cling = (Cling) findViewById(R.id.folder_cling); diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index 1cf4c11b6..bb5601e90 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -123,6 +123,13 @@ public class ShortcutAndWidgetContainer extends ViewGroup { mIsHotseatLayout = isHotseat; } + int getCellContentWidth() { + final LauncherAppState app = LauncherAppState.getInstance(); + final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); + return Math.min(getMeasuredHeight(), mIsHotseatLayout ? + grid.hotseatCellWidthPx: grid.cellWidthPx); + } + int getCellContentHeight() { final LauncherAppState app = LauncherAppState.getInstance(); final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index b6900fe52..2cb9314e1 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -295,6 +295,23 @@ final class Utilities { sIconTextureWidth = sIconTextureHeight = widthPx; } + public static void scaleRect(Rect r, float scale) { + if (scale != 1.0f) { + r.left = (int) (r.left * scale + 0.5f); + r.top = (int) (r.top * scale + 0.5f); + r.right = (int) (r.right * scale + 0.5f); + r.bottom = (int) (r.bottom * scale + 0.5f); + } + } + + public static void scaleRectAboutCenter(Rect r, float scale) { + int cx = r.centerX(); + int cy = r.centerY(); + r.offset(-cx, -cy); + Utilities.scaleRect(r, scale); + r.offset(cx, cy); + } + public static void startActivityForResultSafely( Activity activity, Intent intent, int requestCode) { try { |