summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Birg <roman@cyngn.com>2016-01-18 14:32:50 -0800
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-01-19 15:14:28 -0800
commitd1295657d03c605ea20f0881f6adff2762167e04 (patch)
treee6647861302f32eac4205c020a84b62ab9c3f521
parent4d84b82a5e41b3745ba75fc85c92877e5a702300 (diff)
downloadframeworks_base-d1295657d03c605ea20f0881f6adff2762167e04.zip
frameworks_base-d1295657d03c605ea20f0881f6adff2762167e04.tar.gz
frameworks_base-d1295657d03c605ea20f0881f6adff2762167e04.tar.bz2
SystemUI: fix qs tile page regressions
- Hide QS tile toast message while adding tile - Don't allow scrolling right when on last page - The viewpager adapter is no longer responsible for actually creating the backing pages, so we can safely cache them and add/remove them as the viewpager sees fit. The pages will be permanently cached until a future call to setTiles() results in less tiles, and the page will be automatically cleaned up. - This also fixes no tiles after theme change - And resetting tiles too, custom tile listeners were interfering and overwriting the default tile values Ref: CYNGNOS-1644 Change-Id: Ibb43adb249b81601370ceab4a4873f91b34b5074 Signed-off-by: Roman Birg <roman@cyngn.com>
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java137
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPage.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSSettings.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTile.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java57
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java4
8 files changed, 179 insertions, 53 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java
index 88b5d4e..5769f58 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java
@@ -76,6 +76,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
public class QSDragPanel extends QSPanel implements View.OnDragListener, View.OnLongClickListener {
@@ -86,7 +87,6 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
public static final boolean DEBUG_DRAG = false;
private static final int MAX_ROW_COUNT = 3;
- private static final int INITIAL_OFFSCREEN_PAGE_LIMIT = 3;
private static final String BROADCAST_TILE_SPEC_PLACEHOLDER = "broadcast_placeholder";
protected final ArrayList<QSPage> mPages = new ArrayList<>();
@@ -156,8 +156,8 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
@Override
public void onClick(View v) {
TilesListAdapter adapter = new TilesListAdapter(mContext, QSDragPanel.this);
- showDetailAdapter(true, adapter,
- v.getLocationOnScreen());
+ showDetailAdapter(true, adapter, v.getLocationOnScreen());
+ mDetail.bringToFront();
}
});
mViewPager = new QSViewPager(getContext());
@@ -188,7 +188,7 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
mPagerAdapter = new PagerAdapter() {
@Override
public Object instantiateItem(ViewGroup container, int position) {
- if (DEBUG_DRAG) {
+ if (DEBUG_TILES) {
Log.d(TAG, "instantiateItem() called with "
+ "container = [" + container + "], position = [" + position + "]");
}
@@ -200,31 +200,22 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
container.addView(qss, 0);
return qss;
} else {
- QSPage page = new QSPage(container.getContext(),
- QSDragPanel.this, mEditing ? position - 1 : position);
+ final int adjustedPosition = mEditing ? position - 1 : position;
+ QSPage page = mPages.get(adjustedPosition);
- container.addView(page);
- int viewPos = page.getPageIndex();
- if (viewPos > mPages.size()) {
- mPages.add(page);
- } else {
- mPages.add(viewPos, page);
- }
+ container.addView(page, position);
return page;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
- if (DEBUG_DRAG) {
+ if (DEBUG_TILES) {
Log.d(TAG, "destroyItem() called with " + "container = ["
+ container + "], position = [" + position + "], object = ["
+ object + "]");
}
if (object instanceof View) {
- if (object instanceof QSPage) {
- mPages.remove(object);
- }
container.removeView((View) object);
}
}
@@ -232,16 +223,34 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
@Override
public int getItemPosition(Object object) {
if (object instanceof QSPage) {
+ if (mEditing != ((QSPage) object).getAdapterEditingState()) {
+ // position of item changes when we set change the editing mode,
+ // sync it and send the new position
+ ((QSPage) object).setAdapterEditingState(mEditing);
+
+ // calculate new position
+ int indexOf = ((QSPage) object).getPageIndex();
+ if (mEditing) return indexOf + 1;
+ else return indexOf;
+
+ } else if (!mPages.contains(object) && !mDragging) {
+ // only return none if we aren't dragging (object may be removed from
+ // the records array temporarily and we might think we have less pages,
+ // we don't want to prematurely remove this page
+ return POSITION_NONE;
+ } else {
- final int indexOf = ((QSPage) object).getPageIndex();
- if (mEditing) return indexOf + 1;
- else return indexOf;
+ return POSITION_UNCHANGED;
+ }
} else if (object instanceof QSSettings) {
-
- if (mEditing) return 0;
- else return POSITION_NONE;
-
+ if (((QSSettings) object).getAdapterEditingState() != mEditing) {
+ ((QSSettings) object).setAdapterEditingState(mEditing);
+ if (mEditing) return 0 /* locked at position 0 */;
+ else return POSITION_NONE;
+ } else {
+ return POSITION_UNCHANGED;
+ }
}
return super.getItemPosition(object);
}
@@ -250,6 +259,12 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
public int getCount() {
final int qsPages = Math.max(getCurrentMaxPageCount(), 1);
+ if (mPages != null && qsPages > mPages.size()) {
+ for(int i = mPages.size(); i < qsPages; i++) {
+ mPages.add(i, new QSPage(mViewPager.getContext(), QSDragPanel.this, i));
+ }
+ }
+
if (mEditing) return qsPages + 1;
return qsPages;
}
@@ -260,7 +275,6 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
}
};
mViewPager.setAdapter(mPagerAdapter);
- mViewPager.setOffscreenPageLimit(INITIAL_OFFSCREEN_PAGE_LIMIT);
mPageIndicator.setViewPager(mViewPager);
mPageIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@@ -325,6 +339,8 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
mQsPanelTop.setOnDragListener(QSDragPanel.this);
mPageIndicator.setOnDragListener(QSDragPanel.this);
setOnDragListener(QSDragPanel.this);
+
+ mViewPager.setOverScrollMode(View.OVER_SCROLL_NEVER);
}
@Override
@@ -402,8 +418,10 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
mPageIndicator.setEditing(editing);
mPagerAdapter.notifyDataSetChanged();
+ mViewPager.setOffscreenPageLimit(mEditing ? getCurrentMaxPageCount() + 1 : 1);
+ mPagerAdapter.notifyDataSetChanged();
+
requestLayout();
- ensurePagerState();
}
protected void onStartDrag() {
@@ -423,7 +441,6 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
mQsPanelTop.onStopDrag();
requestLayout();
- ensurePagerState();
}
protected View getDropTarget() {
@@ -503,12 +520,12 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
}
Map<QSTile<?>, DragTileRecord> recordMap = new ArrayMap<>();
- Iterator<TileRecord> iterator = mRecords.iterator();
+ ListIterator<TileRecord> iterator = mRecords.listIterator(mRecords.size());
int recordsRemoved = 0;
// cleanup current records
- while (iterator.hasNext()) {
- DragTileRecord dr = (DragTileRecord) iterator.next();
+ while (iterator.hasPrevious()) {
+ DragTileRecord dr = (DragTileRecord) iterator.previous();
if (tiles.contains(dr.tile)) {
if (DEBUG_TILES) {
@@ -525,10 +542,26 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
// remove record
iterator.remove();
recordsRemoved++;
+
+ if (dr.page >= getCurrentMaxPageCount() - 1) {
+ final int childCount = mPages.get(dr.page).getChildCount();
+
+ if (childCount == 0) {
+ // if current page is the current max page COUNT (off by 1) then move back
+ final int currentIndex = mViewPager.getCurrentItem();
+ if (currentIndex == (getCurrentMaxPageCount()) + (mEditing ? 1 : 0)) {
+ mViewPager.setCurrentItem(currentIndex - 1, false);
+ mPagerAdapter.startUpdate(mViewPager);
+ final int pageIndex = mEditing ? currentIndex - 1 : currentIndex;
+ mPages.remove(pageIndex);
+ mPagerAdapter.finishUpdate(mViewPager);
+ mPagerAdapter.notifyDataSetChanged();
+ }
+ }
+ }
}
}
-
// at this point recordMap should have all retained tiles, no new or old tiles
int delta = tiles.size() - recordMap.size() - recordsRemoved;
if (DEBUG_TILES) {
@@ -582,6 +615,7 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
}
}
}
+
if (isShowingDetail()) {
mDetail.bringToFront();
}
@@ -685,6 +719,16 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
return r;
}
+ private void removeDraggingRecord() {
+ // what spec is this tile?
+ String spec = mHost.getSpec(mDraggingRecord.tile);
+ if (DEBUG_DRAG) {
+ Log.w(TAG, "removing tile: " + mDraggingRecord + " with spec: " + spec);
+ }
+ onStopDrag();
+ mHost.remove(spec);
+ }
+
public void ensurePagerState() {
if (!isShowingDetail()) {
final boolean pagingEnabled = getVisibleTilePageCount() > 1 || mDragging || mEditing;
@@ -807,7 +851,9 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
footer.getMeasuredWidth(), getMeasuredHeight());
}
- mQsPanelTop.bringToFront();
+ if (!isShowingDetail() && !isClosingDetail()) {
+ mQsPanelTop.bringToFront();
+ }
ensurePagerState();
}
@@ -998,13 +1044,7 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
break;
} else {
mRestored = true;
- // what spec is this tile?
- String spec = mHost.getSpec(mDraggingRecord.tile);
- if (DEBUG_DRAG) {
- Log.w(TAG, "removing tile: " + mDraggingRecord + " with spec: " + spec);
- }
- onStopDrag();
- mHost.remove(spec);
+ removeDraggingRecord();
}
} else {
restoreDraggingTilePosition(v);
@@ -1688,6 +1728,22 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
}
}
+ @Override
+ protected void setGridContentVisibility(boolean visible) {
+ int newVis = visible ? VISIBLE : INVISIBLE;
+ for (int i = 0; i < mRecords.size(); i++) {
+ TileRecord tileRecord = mRecords.get(i);
+ if (tileRecord.tileView.getVisibility() != GONE) {
+ tileRecord.tileView.setVisibility(newVis);
+ }
+ }
+ mQsPanelTop.setVisibility(showBrightnessSlider() ? newVis : GONE);
+ if (mGridContentVisible != visible) {
+ MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, newVis);
+ }
+ mGridContentVisible = visible;
+ }
+
public void updateResources() {
final Resources res = mContext.getResources();
final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
@@ -1759,6 +1815,9 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
// add broadcast tile
mPackageTileMap.get(PACKAGE_ANDROID).add(BROADCAST_TILE_SPEC_PLACEHOLDER);
+
+ final List<String> systemTiles = mPackageTileMap.get(PACKAGE_ANDROID);
+ Collections.sort(systemTiles);
}
private String getCustomTilePackage(String spec) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPage.java b/packages/SystemUI/src/com/android/systemui/qs/QSPage.java
index 5bfbdc7..57b559e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPage.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPage.java
@@ -23,6 +23,8 @@ public class QSPage extends ViewGroup {
private int mPage;
+ private boolean mAdapterEditingState;
+
public QSPage(Context context, QSDragPanel panel, int page) {
super(context);
mPanel = panel;
@@ -137,6 +139,14 @@ public class QSPage extends ViewGroup {
}
}
+ public boolean getAdapterEditingState() {
+ return mAdapterEditingState;
+ }
+
+ public void setAdapterEditingState(boolean editing) {
+ this.mAdapterEditingState = editing;
+ }
+
public boolean dualRecord(QSPanel.TileRecord record) {
return mPanel.mFirstRowLarge && record.row == 0 && mPage == 0;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 7f3d452..60dc787 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -82,7 +82,7 @@ public class QSPanel extends ViewGroup {
protected QSTileHost mHost;
protected QSFooter mFooter;
- private boolean mGridContentVisible = true;
+ protected boolean mGridContentVisible = true;
public QSPanel(Context context) {
this(context, null);
@@ -463,7 +463,7 @@ public class QSPanel extends ViewGroup {
}
}
- private void setGridContentVisibility(boolean visible) {
+ protected void setGridContentVisibility(boolean visible) {
int newVis = visible ? VISIBLE : INVISIBLE;
for (int i = 0; i < mRecords.size(); i++) {
TileRecord tileRecord = mRecords.get(i);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSettings.java b/packages/SystemUI/src/com/android/systemui/qs/QSSettings.java
index fd2fb17..d90c991 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSettings.java
@@ -29,6 +29,8 @@ import com.android.systemui.statusbar.phone.SystemUIDialog;
public class QSSettings extends LinearLayout {
private QSTileHost mHost;
+ private boolean mAdapterEditingState;
+
public QSSettings(Context context) {
super(context);
}
@@ -57,7 +59,7 @@ public class QSSettings extends LinearLayout {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- mHost.resetTiles();
+ mHost.initiateReset();
}
}).create();
SystemUIDialog.makeSystemUIDialog(d);
@@ -67,4 +69,12 @@ public class QSSettings extends LinearLayout {
public void setHost(QSTileHost host) {
mHost = host;
}
+
+ public boolean getAdapterEditingState() {
+ return mAdapterEditingState;
+ }
+
+ public void setAdapterEditingState(boolean editing) {
+ this.mAdapterEditingState = editing;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 6d0c857..2d62724 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -354,6 +354,7 @@ public abstract class QSTile<TState extends State> implements Listenable {
void setEditing(boolean editing);
boolean isEditing();
void goToSettingsPage();
+ void resetTiles();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index f518d9d..6e104ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -136,6 +136,7 @@ import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.qs.QSDragPanel;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.qs.QSTile;
import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.settings.BrightnessController;
import com.android.systemui.statusbar.ActivatableNotificationView;
@@ -1205,6 +1206,40 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
}, 500);
}
+
+ @Override
+ public void resetTiles() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mQSPanel.setEditing(false);
+ mHeader.setEditing(false);
+
+ // unregister custom tile service while we reset to not get
+ // callbacks from custom tiles
+ try {
+ mCustomTileListenerService.unregisterAsSystemService();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to unregister custom tile listener", e);
+ }
+
+ // clear out old tile states and views
+ mQSPanel.setTiles(new ArrayList<QSTile<?>>());
+
+ mQSTileHost.resetTiles();
+
+ // reregister service
+ try {
+ mCustomTileListenerService.registerAsSystemService(mContext,
+ new ComponentName(mContext.getPackageName(),
+ PhoneStatusBar.this.getClass().getCanonicalName()),
+ UserHandle.USER_ALL);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to register custom tile listener", e);
+ }
+ }
+ });
+ }
});
}
@@ -3690,6 +3725,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
}
+ if (mCustomTileListenerService != null) {
+ try {
+ mCustomTileListenerService.unregisterAsSystemService();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to unregister custom tile listener", e);
+ }
+ }
+
+ mQSPanel.getHost().setCustomTileListenerService(null);
+ mQSPanel.setTiles(new ArrayList<QSTile<?>>());
+
makeStatusBarView();
repositionNavigationBar();
@@ -3716,16 +3762,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// Stop the command queue until the new status bar container settles and has a layout pass
mCommandQueue.pause();
- if (mCustomTileListenerService != null) {
- try {
- mCustomTileListenerService.unregisterAsSystemService();
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to unregister custom tile listener", e);
- }
- }
-
- mQSPanel.getHost().setCustomTileListenerService(null);
-
// fix notification panel being shifted to the left by calling
// instantCollapseNotificationPanel()
instantCollapseNotificationPanel();
@@ -3736,6 +3772,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
@Override
public void onGlobalLayout() {
mStatusBarWindow.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ mQSPanel.setTiles(mQSTileHost.getTiles());
mCommandQueue.resume();
mRecreating = false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
index ad881f9..c4ce350 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -413,9 +413,14 @@ public class QSTileHost implements QSTile.Host, Tunable {
TextUtils.join(",", tiles), ActivityManager.getCurrentUser());
}
+ public void initiateReset() {
+ if (mCallback != null) {
+ mCallback.resetTiles();
+ }
+ }
+
@Override
public void resetTiles() {
- setEditing(false);
CMSettings.Secure.putStringForUser(getContext().getContentResolver(),
CMSettings.Secure.QS_TILES, "default", ActivityManager.getCurrentUser());
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
index b186323..9d63d08 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java
@@ -155,6 +155,10 @@ public class QsTuner extends Fragment implements Callback {
public void goToSettingsPage() {
}
+ @Override
+ public void resetTiles() {
+ }
+
private static class CustomHost extends QSTileHost {
public CustomHost(Context context) {