From 707e2072c81b7405e6c9102b1f937fd251f56291 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 30 Jun 2017 18:32:40 +0200 Subject: [PATCH] Fixed an issue where the shelf could be hidden During reinflation, the panel could be stuck in a bad state where qs edit mode was on but not visible. QS edit now persists through reinflations. Test: manual Change-Id: I6e7a20fda2db2184a26a11093064a1367469ab45 Fixes: 62807612 --- .../graphics/drawable/TransitionDrawable.java | 12 +++++ .../android/systemui/qs/QSDetailClipper.java | 4 ++ .../com/android/systemui/qs/QSFragment.java | 8 +++ .../systemui/qs/customize/QSCustomizer.java | 54 +++++++++++++++++++ .../systemui/statusbar/phone/StatusBar.java | 5 ++ .../stack/NotificationStackScrollLayout.java | 15 ++++++ 6 files changed, 98 insertions(+) diff --git a/graphics/java/android/graphics/drawable/TransitionDrawable.java b/graphics/java/android/graphics/drawable/TransitionDrawable.java index 0122338a7255e..3dfd68018a6b4 100644 --- a/graphics/java/android/graphics/drawable/TransitionDrawable.java +++ b/graphics/java/android/graphics/drawable/TransitionDrawable.java @@ -117,6 +117,18 @@ public class TransitionDrawable extends LayerDrawable implements Drawable.Callba invalidateSelf(); } + /** + * Show the second layer on top of the first layer immediately + * + * @hide + */ + public void showSecondLayer() { + mAlpha = 255; + mReverse = false; + mTransitionState = TRANSITION_NONE; + invalidateSelf(); + } + /** * Show only the first layer. */ diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java index a318efcf4d503..c454048d06493 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java @@ -100,4 +100,8 @@ public class QSDetailClipper { mAnimator = null; }; }; + + public void showBackground() { + mBackground.showSecondLayer(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 90275c50b54a3..62d308618d2f1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -94,6 +94,13 @@ public class QSFragment extends Fragment implements QS { if (savedInstanceState != null) { setExpanded(savedInstanceState.getBoolean(EXTRA_EXPANDED)); setListening(savedInstanceState.getBoolean(EXTRA_LISTENING)); + int[] loc = new int[2]; + View edit = view.findViewById(android.R.id.edit); + edit.getLocationInWindow(loc); + int x = loc[0] + edit.getWidth() / 2; + int y = loc[1] + edit.getHeight() / 2; + mQSCustomizer.setEditLocation(x, y); + mQSCustomizer.restoreInstanceState(savedInstanceState); } } @@ -110,6 +117,7 @@ public class QSFragment extends Fragment implements QS { super.onSaveInstanceState(outState); outState.putBoolean(EXTRA_EXPANDED, mQsExpanded); outState.putBoolean(EXTRA_LISTENING, mListening); + mQSCustomizer.saveInstanceState(outState); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 30053e35ef053..6c95a8013108c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -20,6 +20,9 @@ import android.animation.Animator.AnimatorListener; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.content.res.Configuration; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v7.widget.DefaultItemAnimator; @@ -42,6 +45,7 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QSTile; +import com.android.systemui.qs.QSContainerImpl; import com.android.systemui.qs.QSDetailClipper; import com.android.systemui.qs.QSTileHost; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; @@ -60,6 +64,7 @@ import java.util.List; public class QSCustomizer extends LinearLayout implements OnMenuItemClickListener { private static final int MENU_RESET = Menu.FIRST; + private static final String EXTRA_QS_CUSTOMIZING = "qs_customizing"; private final QSDetailClipper mClipper; @@ -109,11 +114,16 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setMoveDuration(TileAdapter.MOVE_DURATION); mRecyclerView.setItemAnimator(animator); + updateNavBackDrop(getResources().getConfiguration()); } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); + updateNavBackDrop(newConfig); + } + + private void updateNavBackDrop(Configuration newConfig) { View navBackdrop = findViewById(R.id.nav_bar_background); if (navBackdrop != null) { boolean shouldShow = newConfig.smallestScreenWidthDp >= 600 @@ -154,6 +164,21 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene } } + + public void showImmediately() { + if (!isShown) { + setVisibility(VISIBLE); + mClipper.showBackground(); + isShown = true; + setTileSpecs(); + setCustomizing(true); + queryTiles(); + mNotifQsContainer.setCustomizerAnimating(false); + mNotifQsContainer.setCustomizerShowing(true); + Dependency.get(KeyguardMonitor.class).addCallback(mKeyguardCallback); + } + } + private void queryTiles() { mFinishedFetchingTiles = false; Runnable tileQueryFetchCompletion = () -> { @@ -227,6 +252,35 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene } } + + public void saveInstanceState(Bundle outState) { + if (isShown) { + Dependency.get(KeyguardMonitor.class).removeCallback(mKeyguardCallback); + } + outState.putBoolean(EXTRA_QS_CUSTOMIZING, mCustomizing); + } + + public void restoreInstanceState(Bundle savedInstanceState) { + boolean customizing = savedInstanceState.getBoolean(EXTRA_QS_CUSTOMIZING); + if (customizing) { + setVisibility(VISIBLE); + addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, + int oldTop, int oldRight, int oldBottom) { + removeOnLayoutChangeListener(this); + showImmediately(); + } + }); + } + } + + public void setEditLocation(int x, int y) { + mX = x; + mY = y; + } + private final Callback mKeyguardCallback = () -> { if (!isAttachedToWindow()) return; if (Dependency.get(KeyguardMonitor.class).isShowing() && !mOpening) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 14d0b7ea86b94..920ccd0ccc8a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3484,6 +3484,11 @@ public class StatusBar extends SystemUI implements DemoMode, pw.print (" "); mNotificationPanel.dump(fd, pw, args); } + pw.println(" mStackScroller: "); + if (mStackScroller != null) { + pw.print (" "); + mStackScroller.dump(fd, pw, args); + } DozeLog.dump(pw); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index cbd315b940f3c..e9f97299f73b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -91,6 +91,8 @@ import com.android.systemui.statusbar.policy.ScrollAdapter; import android.support.v4.graphics.ColorUtils; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -4256,6 +4258,19 @@ public class NotificationStackScrollLayout extends ViewGroup mShelf.setDarkOffsetX(shelfOffsetX); } + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println(String.format("[%s: pulsing=%s qsCustomizerShowing=%s visibility=%s" + + " alpha:%f scrollY:%d]", + this.getClass().getSimpleName(), + mPulsing != null ?"T":"f", + mAmbientState.isQsCustomizerShowing() ? "T":"f", + getVisibility() == View.VISIBLE ? "visible" + : getVisibility() == View.GONE ? "gone" + : "invisible", + getAlpha(), + mAmbientState.getScrollY())); + } + /** * A listener that is notified when some child locations might have changed. */