summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher2')
-rw-r--r--src/com/android/launcher2/AllAppsPagedView.java8
-rw-r--r--src/com/android/launcher2/AllAppsTabbed.java12
-rw-r--r--src/com/android/launcher2/CustomizePagedView.java90
-rw-r--r--src/com/android/launcher2/Launcher.java85
-rw-r--r--src/com/android/launcher2/PagedViewWidget.java4
-rw-r--r--src/com/android/launcher2/PagedViewWithDraggableItems.java8
-rw-r--r--src/com/android/launcher2/Workspace.java6
7 files changed, 147 insertions, 66 deletions
diff --git a/src/com/android/launcher2/AllAppsPagedView.java b/src/com/android/launcher2/AllAppsPagedView.java
index c9c069f..8ed1f46 100644
--- a/src/com/android/launcher2/AllAppsPagedView.java
+++ b/src/com/android/launcher2/AllAppsPagedView.java
@@ -221,11 +221,13 @@ public class AllAppsPagedView extends PagedViewWithDraggableItems implements All
public void run() {
DeleteZone allAppsDeleteZone =
(DeleteZone) mLauncher.findViewById(R.id.all_apps_delete_zone);
- allAppsDeleteZone.setDragAndDropEnabled(false);
+ // if onDestroy was called on Launcher, we might have already deleted the
+ // all apps delete zone / info button, so check if they are null
+ if (allAppsDeleteZone != null) allAppsDeleteZone.setDragAndDropEnabled(false);
ApplicationInfoDropTarget allAppsInfoButton =
(ApplicationInfoDropTarget) mLauncher.findViewById(R.id.all_apps_info_target);
- allAppsInfoButton.setDragAndDropEnabled(false);
+ if (allAppsInfoButton != null) allAppsInfoButton.setDragAndDropEnabled(false);
}
});
resetCheckedGrandchildren();
@@ -269,6 +271,7 @@ public class AllAppsPagedView extends PagedViewWithDraggableItems implements All
}
// Start the drag
+ mLauncher.lockScreenOrientation();
mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
mDragController.startDrag(v, b, this, app, DragController.DRAG_ACTION_COPY, null);
b.recycle();
@@ -287,6 +290,7 @@ public class AllAppsPagedView extends PagedViewWithDraggableItems implements All
}
tearDownDragMode();
mLauncher.getWorkspace().onDragStopped();
+ mLauncher.unlockScreenOrientation();
}
@Override
diff --git a/src/com/android/launcher2/AllAppsTabbed.java b/src/com/android/launcher2/AllAppsTabbed.java
index 2cc0a6b..47a5bf7 100644
--- a/src/com/android/launcher2/AllAppsTabbed.java
+++ b/src/com/android/launcher2/AllAppsTabbed.java
@@ -48,6 +48,7 @@ public class AllAppsTabbed extends TabHost implements AllAppsView {
private AllAppsPagedView mAllApps;
private Context mContext;
private final LayoutInflater mInflater;
+ private boolean mFirstLayout = true;
public AllAppsTabbed(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -135,6 +136,11 @@ public class AllAppsTabbed extends TabHost implements AllAppsView {
@Override
public void setVisibility(int visibility) {
+ if (visibility == View.GONE && mFirstLayout) {
+ // It needs to be INVISIBLE so that it will be measured in the layout.
+ // Otherwise the animations is messed up when we show it for the first time.
+ visibility = View.INVISIBLE;
+ }
final boolean isVisible = (visibility == View.VISIBLE);
super.setVisibility(visibility);
float zoom = (isVisible ? 1.0f : 0.0f);
@@ -147,6 +153,12 @@ public class AllAppsTabbed extends TabHost implements AllAppsView {
}
@Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ mFirstLayout = false;
+ super.onLayout(changed, l, t, r, b);
+ }
+
+ @Override
public boolean isAnimating() {
return (getAnimation() != null);
}
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index 6a563f2..d9a6612 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -308,8 +308,8 @@ public class CustomizePagedView extends PagedViewWithDraggableItems
}
public void setCustomizationFilter(CustomizationType filterType) {
- mCustomizationType = filterType;
cancelDragging();
+ mCustomizationType = filterType;
if (getChildCount() > 0) {
setCurrentPage(0);
updateCurrentPageScroll();
@@ -328,6 +328,7 @@ public class CustomizePagedView extends PagedViewWithDraggableItems
public void onDropCompleted(View target, boolean success) {
resetCheckedGrandchildren();
mLauncher.getWorkspace().onDragStopped();
+ mLauncher.unlockScreenOrientation();
}
@Override
@@ -500,60 +501,67 @@ public class CustomizePagedView extends PagedViewWithDraggableItems
endChoiceMode();
}
boolean result = false;
+ mLauncher.lockScreenOrientation();
switch (mCustomizationType) {
case WidgetCustomization: {
- // Get the widget preview as the drag representation
- final LinearLayout l = (LinearLayout) v;
- final ImageView i = (ImageView) l.findViewById(R.id.widget_preview);
- final Drawable icon = i.getDrawable();
- Bitmap b = drawableToBitmap(icon, i);
- PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) v.getTag();
-
- int[] spanXY = CellLayout.rectToCell(
- getResources(), createWidgetInfo.minWidth, createWidgetInfo.minHeight, null);
- createWidgetInfo.spanX = spanXY[0];
- createWidgetInfo.spanY = spanXY[1];
- mLauncher.getWorkspace().onDragStartedWithItemSpans(spanXY[0], spanXY[1], b);
- mDragController.startDrag(
- i, b, this, createWidgetInfo, DragController.DRAG_ACTION_COPY, null);
- b.recycle();
- result = true;
+ if (v instanceof PagedViewWidget) {
+ // Get the widget preview as the drag representation
+ final LinearLayout l = (LinearLayout) v;
+ final ImageView i = (ImageView) l.findViewById(R.id.widget_preview);
+ final Drawable icon = i.getDrawable();
+ Bitmap b = drawableToBitmap(icon, i);
+ PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) v.getTag();
+
+ int[] spanXY = CellLayout.rectToCell(
+ getResources(), createWidgetInfo.minWidth, createWidgetInfo.minHeight, null);
+ createWidgetInfo.spanX = spanXY[0];
+ createWidgetInfo.spanY = spanXY[1];
+ mLauncher.getWorkspace().onDragStartedWithItemSpans(spanXY[0], spanXY[1], b);
+ mDragController.startDrag(
+ i, b, this, createWidgetInfo, DragController.DRAG_ACTION_COPY, null);
+ b.recycle();
+ result = true;
+ }
break;
}
case ShortcutCustomization: {
- // get icon (top compound drawable, index is 1)
- final TextView tv = (TextView) v;
- final Drawable icon = tv.getCompoundDrawables()[1];
- Bitmap b = drawableToBitmap(icon, tv);
- PendingAddItemInfo createItemInfo = (PendingAddItemInfo) v.getTag();
-
- mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
- mDragController.startDrag(v, b, this, createItemInfo, DragController.DRAG_ACTION_COPY,
- null);
- b.recycle();
- result = true;
+ if (v instanceof PagedViewIcon) {
+ // get icon (top compound drawable, index is 1)
+ final TextView tv = (TextView) v;
+ final Drawable icon = tv.getCompoundDrawables()[1];
+ Bitmap b = drawableToBitmap(icon, tv);
+ PendingAddItemInfo createItemInfo = (PendingAddItemInfo) v.getTag();
+
+ mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
+ mDragController.startDrag(v, b, this, createItemInfo, DragController.DRAG_ACTION_COPY,
+ null);
+ b.recycle();
+ result = true;
+ }
break;
}
case ApplicationCustomization: {
- // Pick up the application for dropping
- // get icon (top compound drawable, index is 1)
- final TextView tv = (TextView) v;
- final Drawable icon = tv.getCompoundDrawables()[1];
- Bitmap b = drawableToBitmap(icon, tv);
- ApplicationInfo app = (ApplicationInfo) v.getTag();
- app = new ApplicationInfo(app);
-
- mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
- mDragController.startDrag(v, b, this, app, DragController.DRAG_ACTION_COPY, null);
- b.recycle();
- result = true;
+ if (v instanceof PagedViewIcon) {
+ // Pick up the application for dropping
+ // get icon (top compound drawable, index is 1)
+ final TextView tv = (TextView) v;
+ final Drawable icon = tv.getCompoundDrawables()[1];
+ Bitmap b = drawableToBitmap(icon, tv);
+ ApplicationInfo app = (ApplicationInfo) v.getTag();
+ app = new ApplicationInfo(app);
+
+ mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
+ mDragController.startDrag(v, b, this, app, DragController.DRAG_ACTION_COPY, null);
+ b.recycle();
+ result = true;
+ }
break;
}
}
// We toggle the checked state _after_ we create the view for the drag in case toggling the
// checked state changes the view's look
- if (v instanceof Checkable) {
+ if (result && (v instanceof Checkable)) {
// In preparation for drag, we always reset the checked grand children regardless of
// what choice mode we are in
resetCheckedGrandchildren();
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index bef4e84..9b5dac7 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -17,17 +17,19 @@
package com.android.launcher2;
-import com.android.common.Search;
-import com.android.launcher.R;
-import com.android.launcher2.CustomizePagedView.CustomizationType;
-import com.android.launcher2.Workspace.ShrinkState;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
-import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.app.AlertDialog;
@@ -45,12 +47,12 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.Intent.ShortcutIconResource;
+import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -77,16 +79,18 @@ import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.method.TextKeyListener;
import android.util.Log;
+import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.Surface;
import android.view.View;
+import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.view.View.OnLongClickListener;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.InputMethodManager;
@@ -96,20 +100,16 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TabHost;
+import android.widget.TabHost.OnTabChangeListener;
+import android.widget.TabHost.TabContentFactory;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.Toast;
-import android.widget.TabHost.OnTabChangeListener;
-import android.widget.TabHost.TabContentFactory;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import com.android.common.Search;
+import com.android.launcher.R;
+import com.android.launcher2.CustomizePagedView.CustomizationType;
+import com.android.launcher2.Workspace.ShrinkState;
/**
@@ -264,6 +264,10 @@ public final class Launcher extends Activity
private HashMap<View, AppWidgetProviderInfo> mWidgetsToAdvance =
new HashMap<View, AppWidgetProviderInfo>();
+ // Determines how long to wait after a rotation before restoring the screen orientation to
+ // match the sensor state.
+ private final int mRestoreScreenOrientationDelay = 500;
+
// External icons saved in case of resource changes, orientation, etc.
private static Drawable.ConstantState sGlobalSearchIcon;
private static Drawable.ConstantState sVoiceSearchIcon;
@@ -1710,7 +1714,7 @@ public final class Launcher extends Activity
final ClipDescription clipDesc = clipData.getDescription();
for (int i = 0; i < clipDesc.getMimeTypeCount(); ++i) {
if (clipDesc.getMimeType(i).equals(mimeType)) {
- final ClipData.Item item = clipData.getItem(i);
+ final ClipData.Item item = clipData.getItemAt(i);
final CharSequence stringData = item.getText();
final Uri uriData = item.getUri();
final Intent intentData = item.getIntent();
@@ -3576,6 +3580,49 @@ public final class Launcher extends Activity
}
}
+ private int mapConfigurationOriActivityInfoOri(int configOri) {
+ final Display d = getWindowManager().getDefaultDisplay();
+ int naturalOri = Configuration.ORIENTATION_LANDSCAPE;
+ switch (d.getRotation()) {
+ case Surface.ROTATION_0:
+ case Surface.ROTATION_180:
+ // We are currently in the same basic orientation as the natural orientation
+ naturalOri = configOri;
+ break;
+ case Surface.ROTATION_90:
+ case Surface.ROTATION_270:
+ // We are currently in the other basic orientation to the natural orientation
+ naturalOri = (configOri == Configuration.ORIENTATION_LANDSCAPE) ?
+ Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
+ break;
+ }
+
+ int[] oriMap = {
+ ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
+ ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
+ ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT,
+ ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
+ };
+ // Since the map starts at portrait, we need to offset if this device's natural orientation
+ // is landscape.
+ int indexOffset = 0;
+ if (naturalOri == Configuration.ORIENTATION_LANDSCAPE) {
+ indexOffset = 1;
+ }
+ return oriMap[(d.getRotation() + indexOffset) % 4];
+ }
+ public void lockScreenOrientation() {
+ setRequestedOrientation(mapConfigurationOriActivityInfoOri(getResources()
+ .getConfiguration().orientation));
+ }
+ public void unlockScreenOrientation() {
+ mHandler.postDelayed(new Runnable() {
+ public void run() {
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+ }
+ }, mRestoreScreenOrientationDelay);
+ }
+
/**
* Prints out out state for debugging.
*/
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 07a59ee..9b83f48 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -33,6 +33,7 @@ import android.os.HandlerThread;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
+import android.view.View;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -159,8 +160,10 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
image.setImageDrawable(preview);
final TextView name = (TextView) findViewById(R.id.widget_name);
name.setText(info.label);
+ name.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
final TextView dims = (TextView) findViewById(R.id.widget_dims);
dims.setText(mContext.getString(R.string.widget_dims_format, cellSpan[0], cellSpan[1]));
+ dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
if (createHolographicOutline) {
mIconCache = cache;
@@ -178,6 +181,7 @@ public class PagedViewWidget extends LinearLayout implements Checkable {
image.setImageDrawable(preview);
TextView name = (TextView) findViewById(R.id.wallpaper_name);
name.setText(info.loadLabel(packageManager));
+ name.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
if (createHolographicOutline) {
mIconCache = cache;
diff --git a/src/com/android/launcher2/PagedViewWithDraggableItems.java b/src/com/android/launcher2/PagedViewWithDraggableItems.java
index 3f72292..5fa7be7 100644
--- a/src/com/android/launcher2/PagedViewWithDraggableItems.java
+++ b/src/com/android/launcher2/PagedViewWithDraggableItems.java
@@ -35,6 +35,7 @@ public abstract class PagedViewWithDraggableItems extends PagedView
implements View.OnLongClickListener, View.OnTouchListener {
private View mLastTouchedItem;
private boolean mIsDragging;
+ private boolean mIsDragEnabled;
private float mDragSlopeThreshold;
public PagedViewWithDraggableItems(Context context) {
@@ -58,6 +59,7 @@ public abstract class PagedViewWithDraggableItems extends PagedView
protected void cancelDragging() {
mIsDragging = false;
mLastTouchedItem = null;
+ mIsDragEnabled = false;
}
private void handleTouchEvent(MotionEvent ev) {
@@ -65,9 +67,10 @@ public abstract class PagedViewWithDraggableItems extends PagedView
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
cancelDragging();
+ mIsDragEnabled = true;
break;
case MotionEvent.ACTION_MOVE:
- if (mTouchState != TOUCH_STATE_SCROLLING && !mIsDragging) {
+ if (mTouchState != TOUCH_STATE_SCROLLING && !mIsDragging && mIsDragEnabled) {
determineDraggingStart(ev);
}
break;
@@ -89,6 +92,7 @@ public abstract class PagedViewWithDraggableItems extends PagedView
@Override
public boolean onTouch(View v, MotionEvent event) {
mLastTouchedItem = v;
+ mIsDragEnabled = true;
return false;
}
@@ -153,7 +157,7 @@ public abstract class PagedViewWithDraggableItems extends PagedView
@Override
protected void onDetachedFromWindow() {
- mLastTouchedItem = null;
+ cancelDragging();
super.onDetachedFromWindow();
}
}
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 2e2c441..a25db39 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1439,6 +1439,7 @@ public class Workspace extends SmoothPagedView
}
void unshrink(boolean animated, boolean springLoaded) {
+ mWaitingToShrink = false;
if (mIsSmall) {
float finalScaleFactor = 1.0f;
float finalBackgroundAlpha = 0.0f;
@@ -1647,6 +1648,7 @@ public class Workspace extends SmoothPagedView
child.getLocationOnScreen(mTempXY);
final int screenX = (int) mTempXY[0] + (child.getWidth() - bmpWidth) / 2;
final int screenY = (int) mTempXY[1] + (child.getHeight() - bmpHeight) / 2;
+ mLauncher.lockScreenOrientation();
mDragController.startDrag(b, screenX, screenY, 0, 0, bmpWidth, bmpHeight, this,
child.getTag(), DragController.DRAG_ACTION_MOVE, null);
b.recycle();
@@ -2010,7 +2012,7 @@ public class Workspace extends SmoothPagedView
final boolean isShortcut = (widgets == null);
final String mimeType = desc.getMimeType(index);
if (isShortcut) {
- final Intent intent = data.getItem(index).getIntent();
+ final Intent intent = data.getItemAt(index).getIntent();
Object info = model.infoFromShortcutIntent(mContext, intent, data.getIcon());
onDropExternal(x, y, info, layout, false);
} else {
@@ -2453,7 +2455,7 @@ public class Workspace extends SmoothPagedView
boolean animateDrop = !mWasSpringLoadedOnDragExit;
((CellLayout) getChildAt(mDragInfo.screen)).onDropChild(mDragInfo.cell, animateDrop);
}
-
+ mLauncher.unlockScreenOrientation();
mDragOutline = null;
mDragInfo = null;
}