diff --git a/packages/SystemUI/res/layout/qs_customize_header.xml b/packages/SystemUI/res/layout/qs_customize_header.xml new file mode 100644 index 0000000000000..57cf83fffa43e --- /dev/null +++ b/packages/SystemUI/res/layout/qs_customize_header.xml @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_customize_panel_content.xml b/packages/SystemUI/res/layout/qs_customize_panel_content.xml index 4ce6ef6ed31de..bb67c547c36e7 100644 --- a/packages/SystemUI/res/layout/qs_customize_panel_content.xml +++ b/packages/SystemUI/res/layout/qs_customize_panel_content.xml @@ -43,7 +43,6 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" - android:paddingTop="28dp" android:paddingLeft="@dimen/qs_tile_layout_margin_side" android:paddingRight="@dimen/qs_tile_layout_margin_side" android:paddingBottom="28dp" diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index c113745d3e43e..2deec5e30e325 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1869,6 +1869,9 @@ Hold and drag to add tiles + + Hold and drag to rearrange tiles + Drag here to remove diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 10b92f78336f0..92f5cae4e1650 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -62,6 +62,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta private static final int TYPE_TILE = 0; private static final int TYPE_EDIT = 1; private static final int TYPE_ACCESSIBLE_DROP = 2; + private static final int TYPE_HEADER = 3; private static final int TYPE_DIVIDER = 4; private static final long EDIT_ID = 10000; @@ -112,7 +113,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta public void saveSpecs(QSTileHost host) { List newSpecs = new ArrayList<>(); - for (int i = 0; i < mTiles.size() && mTiles.get(i) != null; i++) { + for (int i = 1; i < mTiles.size() && mTiles.get(i) != null; i++) { newSpecs.add(mTiles.get(i).spec); } host.changeTiles(mCurrentSpecs, newSpecs); @@ -145,6 +146,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta } mOtherTiles = new ArrayList(mAllTiles); mTiles.clear(); + mTiles.add(null); for (int i = 0; i < mCurrentSpecs.size(); i++) { final TileInfo tile = getAndRemoveOther(mCurrentSpecs.get(i)); if (tile != null) { @@ -177,6 +179,9 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public int getItemViewType(int position) { + if (position == 0) { + return TYPE_HEADER; + } if (mAccessibilityAction == ACTION_ADD && position == mEditIndex - 1) { return TYPE_ACCESSIBLE_DROP; } @@ -193,6 +198,9 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta public Holder onCreateViewHolder(ViewGroup parent, int viewType) { final Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); + if (viewType == TYPE_HEADER) { + return new Holder(inflater.inflate(R.layout.qs_customize_header, parent, false)); + } if (viewType == TYPE_DIVIDER) { return new Holder(inflater.inflate(R.layout.qs_customize_tile_divider, parent, false)); } @@ -218,6 +226,9 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public void onBindViewHolder(final Holder holder, int position) { + if (holder.getItemViewType() == TYPE_HEADER) { + return; + } if (holder.getItemViewType() == TYPE_DIVIDER) { holder.itemView.setVisibility(mTileDividerIndex < mTiles.size() - 1 ? View.VISIBLE : View.INVISIBLE); @@ -243,7 +254,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta holder.mTileView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); holder.mTileView.setContentDescription(mContext.getString( R.string.accessibility_qs_edit_tile_add, mAccessibilityFromLabel, - position + 1)); + position)); holder.mTileView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -274,13 +285,13 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta R.string.accessibility_qs_edit_add_tile_label, info.state.label); } else if (mAccessibilityAction == ACTION_ADD) { info.state.contentDescription = mContext.getString( - R.string.accessibility_qs_edit_tile_add, mAccessibilityFromLabel, position + 1); + R.string.accessibility_qs_edit_tile_add, mAccessibilityFromLabel, position); } else if (mAccessibilityAction == ACTION_MOVE) { info.state.contentDescription = mContext.getString( - R.string.accessibility_qs_edit_tile_move, mAccessibilityFromLabel, position + 1); + R.string.accessibility_qs_edit_tile_move, mAccessibilityFromLabel, position); } else { info.state.contentDescription = mContext.getString( - R.string.accessibility_qs_edit_tile_label, position + 1, info.state.label); + R.string.accessibility_qs_edit_tile_label, position, info.state.label); } holder.mTileView.handleStateChanged(info.state); holder.mTileView.setShowAppLabel(position > mEditIndex && !info.isSystem); @@ -403,11 +414,12 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta } private void updateDividerLocations() { - // The first null is the edit tiles label, the second null is the tile divider. - // If there is no second null, then there are no non-system tiles. + // The first null is the header label (index 0) so we can skip it, + // the second null is the edit tiles label, the third null is the tile divider. + // If there is no third null, then there are no non-system tiles. mEditIndex = -1; mTileDividerIndex = mTiles.size(); - for (int i = 0; i < mTiles.size(); i++) { + for (int i = 1; i < mTiles.size(); i++) { if (mTiles.get(i) == null) { if (mEditIndex == -1) { mEditIndex = i; @@ -486,7 +498,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public int getSpanSize(int position) { final int type = getItemViewType(position); - return type == TYPE_EDIT || type == TYPE_DIVIDER ? 3 : 1; + return type == TYPE_EDIT || type == TYPE_DIVIDER || type == TYPE_HEADER ? 3 : 1; } }; @@ -511,7 +523,8 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final ViewHolder holder = parent.getChildViewHolder(child); - if (holder.getAdapterPosition() < mEditIndex && !(child instanceof TextView)) { + if (holder.getAdapterPosition() == 0 || + holder.getAdapterPosition() < mEditIndex && !(child instanceof TextView)) { continue; } @@ -569,6 +582,9 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public boolean canDropOver(RecyclerView recyclerView, ViewHolder current, ViewHolder target) { + if (target.getAdapterPosition() == 0){ + return false; + } if (!canRemoveTiles() && current.getAdapterPosition() < mEditIndex) { return target.getAdapterPosition() < mEditIndex; } @@ -577,12 +593,17 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta @Override public int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder) { - if (viewHolder.getItemViewType() == TYPE_EDIT || viewHolder.getItemViewType() == TYPE_DIVIDER) { - return makeMovementFlags(0, 0); + switch (viewHolder.getItemViewType()) { + case TYPE_EDIT: + case TYPE_DIVIDER: + case TYPE_HEADER: + // Fall through + return makeMovementFlags(0, 0); + default: + int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN + | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT; + return makeMovementFlags(dragFlags, 0); } - int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT - | ItemTouchHelper.LEFT; - return makeMovementFlags(dragFlags, 0); } @Override