Fix 2209039 and 2220106

Improve trackball handling and menu interaction
This commit is contained in:
Mike Cleron
2009-11-03 10:17:05 -08:00
parent a13f574e3a
commit 4a5c1e1ec9

View File

@@ -16,54 +16,40 @@
package com.android.launcher2;
import java.io.Writer;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.lang.Float;
import java.util.Collections;
import java.util.Comparator;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScript;
import android.renderscript.RenderScript;
import android.renderscript.ProgramVertex;
import android.renderscript.Element;
import android.renderscript.Dimension;
import android.renderscript.Allocation;
import android.renderscript.Type;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ProgramFragment;
import android.renderscript.ProgramStore;
import android.renderscript.Sampler;
import android.renderscript.SimpleMesh;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Message;
import android.os.SystemClock;
import android.renderscript.Allocation;
import android.renderscript.Dimension;
import android.renderscript.Element;
import android.renderscript.ProgramFragment;
import android.renderscript.ProgramStore;
import android.renderscript.ProgramVertex;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScript;
import android.renderscript.Sampler;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.SimpleMesh;
import android.renderscript.Type;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.graphics.PixelFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class AllAppsView extends RSSurfaceView
@@ -97,7 +83,11 @@ public class AllAppsView extends RSSurfaceView
*/
private boolean mArrowNavigation = false;
private int mPageCount;
/**
* Used to keep track of the selection when AllAppsView loses window focus
*/
private int mLastSelectedIcon;
private boolean mStartedScrolling;
private VelocityTracker mVelocity;
private int mTouchTracking;
@@ -105,8 +95,7 @@ public class AllAppsView extends RSSurfaceView
private int mMotionDownRawY;
private int mDownIconIndex = -1;
private int mCurrentIconIndex = -1;
private int mHomeButtonTop;
private long mTouchTime;
static class Defines {
public static final int ALLOC_PARAMS = 0;
@@ -198,12 +187,41 @@ public class AllAppsView extends RSSurfaceView
Resources res = getContext().getResources();
int barHeight = (int)res.getDimension(R.dimen.button_bar_height);
mHomeButtonTop = h - barHeight;
long endTime = SystemClock.uptimeMillis();
Log.d(TAG, "surfaceChanged took " + (endTime-startTime) + "ms");
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (mArrowNavigation) {
if (!hasWindowFocus) {
// Clear selection when we lose window focus
mLastSelectedIcon = mRollo.mState.selectedIconIndex;
mRollo.clearSelectedIcon();
mRollo.mState.save();
} else if (hasWindowFocus) {
if (mRollo.mState.iconCount > 0) {
int selection = mLastSelectedIcon;
final int firstIcon = Math.round(mRollo.mMessageProc.mPosX) *
Defines.COLUMNS_PER_PAGE;
if (selection < 0 || // No selection
selection < firstIcon || // off the top of the screen
selection >= mRollo.mState.iconCount || // past last icon
selection >= firstIcon + // past last icon on screen
(Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE)) {
selection = firstIcon;
}
// Select the first icon when we gain window focus
mRollo.selectIcon(selection);
mRollo.mState.save();
}
}
}
}
@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
@@ -232,6 +250,8 @@ public class AllAppsView extends RSSurfaceView
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean handled = false;
if (!isVisible()) {
return false;
}
@@ -244,6 +264,7 @@ public class AllAppsView extends RSSurfaceView
if (whichApp >= 0) {
ApplicationInfo app = mAllAppsList.get(whichApp);
mLauncher.startActivitySafely(app.intent);
handled = true;
}
}
}
@@ -251,8 +272,8 @@ public class AllAppsView extends RSSurfaceView
if (mArrowNavigation && iconCount > 0) {
mArrowNavigation = true;
final int currentSelection = mRollo.mState.selectedIconIndex;
final int currentTopRow = (int) mRollo.mMessageProc.mPosX;
int currentSelection = mRollo.mState.selectedIconIndex;
int currentTopRow = Math.round(mRollo.mMessageProc.mPosX);
// The column of the current selection, in the range 0..COLUMNS_PER_PAGE-1
final int currentPageCol = currentSelection % Defines.COLUMNS_PER_PAGE;
@@ -268,10 +289,12 @@ public class AllAppsView extends RSSurfaceView
if (currentPageRow > 0) {
newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
} else if (currentTopRow > 0) {
mRollo.moveTo(currentTopRow - 1);
newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
mRollo.moveTo(newSelection / Defines.COLUMNS_PER_PAGE);
}
handled = true;
break;
case KeyEvent.KEYCODE_DPAD_DOWN: {
final int rowCount = iconCount / Defines.COLUMNS_PER_PAGE
+ (iconCount % Defines.COLUMNS_PER_PAGE == 0 ? 0 : 1);
@@ -285,21 +308,25 @@ public class AllAppsView extends RSSurfaceView
newSelection = iconCount - 1;
}
if (currentPageRow >= Defines.ROWS_PER_PAGE - 1) {
mRollo.moveTo(currentTopRow + 1);
mRollo.moveTo((newSelection / Defines.COLUMNS_PER_PAGE) -
Defines.ROWS_PER_PAGE + 1);
}
}
handled = true;
break;
}
case KeyEvent.KEYCODE_DPAD_LEFT:
if (currentPageCol > 0) {
newSelection = currentSelection - 1;
}
handled = true;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if ((currentPageCol < Defines.COLUMNS_PER_PAGE - 1) &&
(currentSelection < iconCount - 1)) {
newSelection = currentSelection + 1;
}
handled = true;
break;
}
if (newSelection != currentSelection) {
@@ -307,11 +334,9 @@ public class AllAppsView extends RSSurfaceView
mRollo.mState.save();
}
}
return true;
return handled;
}
private int mRSMode = 0;
@Override
public boolean onTouchEvent(MotionEvent ev)
{
@@ -481,7 +506,6 @@ public class AllAppsView extends RSSurfaceView
* Zoom to the specifed amount.
*
* @param amount [0..1] 0 is hidden, 1 is open
* @param animate Whether to animate.
*/
public void zoom(float amount) {
if (mRollo == null) {
@@ -527,7 +551,6 @@ public class AllAppsView extends RSSurfaceView
if (mRollo != null) {
mRollo.setApps(list);
}
mPageCount = countPages(list.size());
mLocks &= ~LOCK_ICONS_PENDING;
}