Moving the QSB to the workspace grid.

The QSB will only be resent on the first screen of the workspace
covering the full width of the first row. If will not be movable.
The first screen of the workspace will not be movable.
The searchDropTargetBar no longer contains the QSB (it can be
renamed in aseparate cl).

Refactoring all QSB related logic by moving it to a custom view
inflated only using xml.
Change-Id: Icb4fd6eb855df1af15f685961c38351bf4fd4f4a
This commit is contained in:
Sunny Goyal
2016-05-26 16:05:17 -07:00
parent c54c701a94
commit da4fe1a624
20 changed files with 577 additions and 367 deletions
+50 -11
View File
@@ -73,7 +73,6 @@ import com.android.launcher3.dragndrop.SpringLoadedDragController;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.logging.UserEventDispatcher;
import com.android.launcher3.pageindicators.PageIndicator;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
import com.android.launcher3.util.LongArrayMap;
@@ -109,7 +108,10 @@ public class Workspace extends PagedView
private static final boolean MAP_RECURSE = true;
// The screen id used for the empty screen always present to the right.
public final static long EXTRA_EMPTY_SCREEN_ID = -201;
public static final long EXTRA_EMPTY_SCREEN_ID = -201;
// The is the first screen. It is always present, even if its empty.
public static final long FIRST_SCREEN_ID = 0;
private final static long CUSTOM_CONTENT_SCREEN_ID = -301;
private static final long CUSTOM_CONTENT_GESTURE_DELAY = 200;
@@ -180,8 +182,8 @@ public class Workspace extends PagedView
// in all apps or customize mode)
enum State {
NORMAL (SearchDropTargetBar.State.SEARCH_BAR, false, false),
NORMAL_HIDDEN (SearchDropTargetBar.State.INVISIBLE_TRANSLATED, false, false),
NORMAL (SearchDropTargetBar.State.INVISIBLE, false, false),
NORMAL_HIDDEN (SearchDropTargetBar.State.INVISIBLE, false, false),
SPRING_LOADED (SearchDropTargetBar.State.DROP_TARGET, false, true),
OVERVIEW (SearchDropTargetBar.State.INVISIBLE, true, true),
OVERVIEW_HIDDEN (SearchDropTargetBar.State.INVISIBLE, true, false);
@@ -501,6 +503,32 @@ public class Workspace extends PagedView
return mTouchState != TOUCH_STATE_REST;
}
/**
* Initializes and binds the first page
* @param qsb an exisitng qsb to recycle or null.
*/
public void bindAndInitFirstWorkspaceScreen(View qsb) {
// Add the first page
CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, 0);
if (qsb == null) {
// Always add a QSB on the first screen.
qsb = mLauncher.getLayoutInflater().inflate(R.layout.qsb_container,
firstPage, false);
}
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) qsb.getLayoutParams();
lp.cellX = 0;
lp.cellY = 0;
lp.cellHSpan = firstPage.getCountX();
lp.cellVSpan = 1;
lp.canReorder = false;
if (!firstPage.addViewToCellLayout(qsb, 0, R.id.qsb_container, lp, true)) {
Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
}
}
public void removeAllWorkspaceScreens() {
// Disable all layout transitions before removing all pages to ensure that we don't get the
// transition animations competing with us changing the scroll when we add pages or the
@@ -513,30 +541,39 @@ public class Workspace extends PagedView
removeCustomContentPage();
}
// Recycle the QSB widget
View qsb = findViewById(R.id.qsb_container);
if (qsb != null) {
((ViewGroup) qsb.getParent()).removeView(qsb);
}
// Remove the pages and clear the screen models
removeAllViews();
mScreenOrder.clear();
mWorkspaceScreens.clear();
// Ensure that the first page is always present
bindAndInitFirstWorkspaceScreen(qsb);
// Re-enable the layout transitions
enableLayoutTransitions();
}
public long insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) {
public void insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) {
// Find the index to insert this view into. If the empty screen exists, then
// insert it before that.
int insertIndex = mScreenOrder.indexOf(EXTRA_EMPTY_SCREEN_ID);
if (insertIndex < 0) {
insertIndex = mScreenOrder.size();
}
return insertNewWorkspaceScreen(screenId, insertIndex);
insertNewWorkspaceScreen(screenId, insertIndex);
}
public long insertNewWorkspaceScreen(long screenId) {
return insertNewWorkspaceScreen(screenId, getChildCount());
public void insertNewWorkspaceScreen(long screenId) {
insertNewWorkspaceScreen(screenId, getChildCount());
}
public long insertNewWorkspaceScreen(long screenId, int insertIndex) {
public CellLayout insertNewWorkspaceScreen(long screenId, int insertIndex) {
if (mWorkspaceScreens.containsKey(screenId)) {
throw new RuntimeException("Screen id " + screenId + " already exists!");
}
@@ -558,7 +595,8 @@ public class Workspace extends PagedView
if (delegate != null && delegate.isInAccessibleDrag()) {
newScreen.enableAccessibleDrag(true, CellLayout.WORKSPACE_ACCESSIBILITY_DRAG);
}
return screenId;
return newScreen;
}
public void createCustomContentContainer() {
@@ -860,7 +898,8 @@ public class Workspace extends PagedView
for (int i = 0; i < total; i++) {
long id = mWorkspaceScreens.keyAt(i);
CellLayout cl = mWorkspaceScreens.valueAt(i);
if (id >= 0 && cl.getShortcutsAndWidgets().getChildCount() == 0) {
// FIRST_SCREEN_ID can never be removed.
if (id > FIRST_SCREEN_ID && cl.getShortcutsAndWidgets().getChildCount() == 0) {
removeScreens.add(id);
}
}