Making long-press of AllApps to jump directly to search.

Bug: 22210146
Change-Id: Iacf28416d6e31233a68e3b41576a8860b4b72b88
This commit is contained in:
Winson Chung
2015-07-10 14:33:23 -07:00
parent 4a0df75516
commit 76648c58d5
4 changed files with 52 additions and 20 deletions

View File

@@ -123,9 +123,10 @@ public class Hotseat extends FrameLayout
allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
allAppsButton.setOnKeyListener(new HotseatIconKeyEventListener());
if (mLauncher != null) {
allAppsButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener());
mLauncher.setAllAppsButton(allAppsButton);
allAppsButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener());
allAppsButton.setOnClickListener(mLauncher);
allAppsButton.setOnLongClickListener(mLauncher);
allAppsButton.setOnFocusChangeListener(mLauncher.mFocusHandler);
}

View File

@@ -990,7 +990,7 @@ public class Launcher extends Activity
// view after launching an app, as they may be depending on the UI to be static to
// switch to another app, otherwise, if it was
showAppsView(false /* animated */, false /* resetListToTop */,
!launchedFromApp /* updatePredictedApps */);
!launchedFromApp /* updatePredictedApps */, false /* focusSearchBar */);
} else if (mOnResumeState == State.WIDGETS) {
showWidgetsView(false, false);
}
@@ -2543,12 +2543,17 @@ public class Launcher extends Activity
*/
protected void onClickAllAppsButton(View v) {
if (LOGD) Log.d(TAG, "onClickAllAppsButton");
if (isAppsViewVisible()) {
showWorkspace(true);
} else {
// Try and refresh the set of predicted apps before we enter launcher
if (!isAppsViewVisible()) {
showAppsView(true /* animated */, false /* resetListToTop */,
true /* updatePredictedApps */);
true /* updatePredictedApps */, false /* focusSearchBar */);
}
}
protected void onLongClickAllAppsButton(View v) {
if (LOGD) Log.d(TAG, "onLongClickAllAppsButton");
if (!isAppsViewVisible()) {
showAppsView(true /* animated */, false /* resetListToTop */,
true /* updatePredictedApps */, true /* focusSearchBar */);
}
}
@@ -3125,6 +3130,11 @@ public class Launcher extends Activity
if (isWorkspaceLocked()) return false;
if (mState != State.WORKSPACE) return false;
if (v == mAllAppsButton) {
onLongClickAllAppsButton(v);
return true;
}
if (v instanceof Workspace) {
if (!mWorkspace.isInOverviewMode()) {
if (!mWorkspace.isTouchActive()) {
@@ -3317,14 +3327,15 @@ public class Launcher extends Activity
/**
* Shows the apps view.
*/
void showAppsView(boolean animated, boolean resetListToTop, boolean updatePredictedApps) {
void showAppsView(boolean animated, boolean resetListToTop, boolean updatePredictedApps,
boolean focusSearchBar) {
if (resetListToTop) {
mAppsView.scrollToTop();
}
if (updatePredictedApps) {
tryAndUpdatePredictedApps();
}
showAppsOrWidgets(animated, State.APPS);
showAppsOrWidgets(State.APPS, animated, focusSearchBar);
}
/**
@@ -3335,7 +3346,7 @@ public class Launcher extends Activity
if (resetPageToZero) {
mWidgetsView.scrollToTop();
}
showAppsOrWidgets(animated, State.WIDGETS);
showAppsOrWidgets(State.WIDGETS, animated, false);
mWidgetsView.post(new Runnable() {
@Override
@@ -3352,7 +3363,7 @@ public class Launcher extends Activity
*/
// TODO: calling method should use the return value so that when {@code false} is returned
// the workspace transition doesn't fall into invalid state.
private boolean showAppsOrWidgets(boolean animated, State toState) {
private boolean showAppsOrWidgets(State toState, boolean animated, boolean focusSearchBar) {
if (mState != State.WORKSPACE && mState != State.APPS_SPRING_LOADED &&
mState != State.WIDGETS_SPRING_LOADED) {
return false;
@@ -3362,7 +3373,7 @@ public class Launcher extends Activity
}
if (toState == State.APPS) {
mStateTransitionAnimation.startAnimationToAllApps(mState, animated);
mStateTransitionAnimation.startAnimationToAllApps(animated, focusSearchBar);
} else {
mStateTransitionAnimation.startAnimationToWidgets(animated);
}
@@ -3432,7 +3443,7 @@ public class Launcher extends Activity
void exitSpringLoadedDragMode() {
if (mState == State.APPS_SPRING_LOADED) {
showAppsView(true /* animated */, false /* resetListToTop */,
false /* updatePredictedApps */);
false /* updatePredictedApps */, false /* focusSearchBar */);
} else if (mState == State.WIDGETS_SPRING_LOADED) {
showWidgetsView(true, false);
}

View File

@@ -91,7 +91,6 @@ public class LauncherStateTransitionAnimation {
*/
static abstract class PrivateTransitionCallbacks {
void onRevealViewVisible(View revealView, View contentView, View allAppsButtonView) {}
void onAnimationComplete(View revealView, View contentView, View allAppsButtonView) {}
float getMaterialRevealViewFinalAlpha(View revealView) {
return 0;
}
@@ -108,6 +107,7 @@ public class LauncherStateTransitionAnimation {
View allAppsButtonView) {
return null;
}
void onTransitionComplete() {}
}
public static final String TAG = "LauncherStateTransitionAnimation";
@@ -128,8 +128,12 @@ public class LauncherStateTransitionAnimation {
/**
* Starts an animation to the apps view.
*
* @param startSearchAfterTransition Immediately starts app search after the transition to
* All Apps is completed.
*/
public void startAnimationToAllApps(final Launcher.State fromState, final boolean animated) {
public void startAnimationToAllApps(final boolean animated,
final boolean startSearchAfterTransition) {
final AllAppsContainerView toView = mLauncher.getAppsView();
PrivateTransitionCallbacks cb = new PrivateTransitionCallbacks() {
private int[] mAllAppsToPanelDelta;
@@ -171,10 +175,17 @@ public class LauncherStateTransitionAnimation {
}
};
}
@Override
void onTransitionComplete() {
if (startSearchAfterTransition) {
toView.startAppsSearch();
}
}
};
// Only animate the search bar if animating from spring loaded mode back to all apps
startAnimationToOverlay(Workspace.State.NORMAL_HIDDEN, toView, toView.getContentView(),
toView.getRevealView(), toView.getSearchBarView(), animated, true, cb);
toView.getRevealView(), toView.getSearchBarView(), animated,
true /* hideSearchBar */, cb);
}
/**
@@ -348,7 +359,6 @@ public class LauncherStateTransitionAnimation {
// Hide the reveal view
revealView.setVisibility(View.INVISIBLE);
pCb.onAnimationComplete(revealView, contentView, allAppsButtonView);
// Disable all necessary layers
for (View v : layerViews.keySet()) {
@@ -363,6 +373,7 @@ public class LauncherStateTransitionAnimation {
// This can hold unnecessary references to views.
mStateAnimation = null;
pCb.onTransitionComplete();
}
});
@@ -428,6 +439,7 @@ public class LauncherStateTransitionAnimation {
dispatchOnLauncherTransitionPrepare(toView, animated, false);
dispatchOnLauncherTransitionStart(toView, animated, false);
dispatchOnLauncherTransitionEnd(toView, animated, false);
pCb.onTransitionComplete();
}
}
@@ -682,9 +694,6 @@ public class LauncherStateTransitionAnimation {
onCompleteRunnable.run();
}
// Animation complete callback
pCb.onAnimationComplete(revealView, contentView, allAppsButtonView);
// Disable all necessary layers
for (View v : layerViews.keySet()) {
if (layerViews.get(v) == BUILD_AND_SET_LAYER) {
@@ -704,6 +713,7 @@ public class LauncherStateTransitionAnimation {
// This can hold unnecessary references to views.
mStateAnimation = null;
pCb.onTransitionComplete();
}
});
@@ -739,6 +749,7 @@ public class LauncherStateTransitionAnimation {
dispatchOnLauncherTransitionPrepare(toView, animated, true);
dispatchOnLauncherTransitionStart(toView, animated, true);
dispatchOnLauncherTransitionEnd(toView, animated, true);
pCb.onTransitionComplete();
// Run any queued runnables
if (onCompleteRunnable != null) {

View File

@@ -284,6 +284,15 @@ public class AllAppsContainerView extends BaseContainerView implements DragSourc
return new DefaultAppSearchController(getContext(), this, mAppsRecyclerView);
}
/**
* Focuses the search field and begins an app search.
*/
public void startAppsSearch() {
if (mSearchBarController != null) {
mSearchBarController.focusSearchField();
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();