diff options
Diffstat (limited to 'com/android/systemui/statusbar/phone/PanelView.java')
-rw-r--r-- | com/android/systemui/statusbar/phone/PanelView.java | 104 |
1 files changed, 68 insertions, 36 deletions
diff --git a/com/android/systemui/statusbar/phone/PanelView.java b/com/android/systemui/statusbar/phone/PanelView.java index 2fc22caa..04cb620b 100644 --- a/com/android/systemui/statusbar/phone/PanelView.java +++ b/com/android/systemui/statusbar/phone/PanelView.java @@ -23,14 +23,8 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.database.ContentObserver; -import android.os.AsyncTask; -import android.os.Handler; import android.os.SystemClock; -import android.os.UserHandle; import android.os.VibrationEffect; -import android.os.Vibrator; -import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.InputDevice; @@ -44,35 +38,40 @@ import android.widget.FrameLayout; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.LatencyTracker; import com.android.systemui.DejankUtils; +import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; -import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.VibratorHelper; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.function.BiConsumer; public abstract class PanelView extends FrameLayout { public static final boolean DEBUG = PanelBar.DEBUG; public static final String TAG = PanelView.class.getSimpleName(); private static final int INITIAL_OPENING_PEEK_DURATION = 200; private static final int PEEK_ANIMATION_DURATION = 360; + private static final int NO_FIXED_DURATION = -1; private long mDownTime; private float mMinExpandHeight; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; private boolean mVibrateOnOpening; - private boolean mVibrationEnabled; + protected boolean mLaunchingNotification; + private int mFixedDuration = NO_FIXED_DURATION; + private BiConsumer<Float, Boolean> mExpansionListener; private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); } protected StatusBar mStatusBar; - protected HeadsUpManager mHeadsUpManager; + protected HeadsUpManagerPhone mHeadsUpManager; private float mPeekHeight; private float mHintDistance; @@ -107,13 +106,7 @@ public abstract class PanelView extends FrameLayout { private FlingAnimationUtils mFlingAnimationUtilsClosing; private FlingAnimationUtils mFlingAnimationUtilsDismissing; private FalsingManager mFalsingManager; - private final Vibrator mVibrator; - final private ContentObserver mVibrationObserver = new ContentObserver(Handler.getMain()) { - @Override - public void onChange(boolean selfChange) { - updateHapticFeedBackEnabled(); - } - }; + private final VibratorHelper mVibratorHelper; /** * Whether an instant expand request is currently pending and we are just waiting for layout. @@ -215,18 +208,9 @@ public abstract class PanelView extends FrameLayout { mFalsingManager = FalsingManager.getInstance(context); mNotificationsDragEnabled = getResources().getBoolean(R.bool.config_enableNotificationShadeDrag); - mVibrator = mContext.getSystemService(Vibrator.class); + mVibratorHelper = Dependency.get(VibratorHelper.class); mVibrateOnOpening = mContext.getResources().getBoolean( R.bool.config_vibrateOnIconAnimation); - mContext.getContentResolver().registerContentObserver( - Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED), true, - mVibrationObserver); - mVibrationObserver.onChange(false /* selfChange */); - } - - public void updateHapticFeedBackEnabled() { - mVibrationEnabled = Settings.System.getIntForUser(mContext.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) != 0; } protected void loadDimens() { @@ -338,8 +322,9 @@ public abstract class PanelView extends FrameLayout { cancelPeek(); onTrackingStarted(); } - if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp()) { - startOpening(); + if (isFullyCollapsed() && !mHeadsUpManager.hasPinnedHeadsUp() + && !mStatusBar.isBouncerShowing()) { + startOpening(event); } break; @@ -414,14 +399,25 @@ public abstract class PanelView extends FrameLayout { return !mGestureWaitForTouchSlop || mTracking; } - private void startOpening() {; + private void startOpening(MotionEvent event) { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - if (mVibrateOnOpening && mVibrationEnabled) { - AsyncTask.execute(() -> - mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK, false))); + if (mVibrateOnOpening) { + mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); } + + //TODO: keyguard opens QS a different way; log that too? + + // Log the position of the swipe that opened the panel + float width = mStatusBar.getDisplayWidth(); + float height = mStatusBar.getDisplayHeight(); + int rot = mStatusBar.getRotation(); + + mLockscreenGestureLogger.writeAtFractionalPosition(MetricsEvent.ACTION_PANEL_VIEW_EXPAND, + (int) (event.getX() / width * 100), + (int) (event.getY() / height * 100), + rot); } protected abstract float getOpeningHeight(); @@ -491,7 +487,8 @@ public abstract class PanelView extends FrameLayout { if (mUpdateFlingOnLayout) { mUpdateFlingVelocity = vel; } - } else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking) { + } else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking + && !mStatusBar.isBouncerShowing()) { long timePassed = SystemClock.uptimeMillis() - mDownTime; if (timePassed < ViewConfiguration.getLongPressTimeout()) { // Lets show the user that he can actually expand the panel @@ -500,7 +497,7 @@ public abstract class PanelView extends FrameLayout { // We need to collapse the panel since we peeked to the small height. postOnAnimation(mPostCollapseRunnable); } - } else { + } else if (!mStatusBar.isBouncerShowing()) { boolean expands = onEmptySpaceClick(mInitialTouchX); onTrackingStopped(expands); } @@ -785,6 +782,9 @@ public abstract class PanelView extends FrameLayout { if (vel == 0) { animator.setDuration((long) (animator.getDuration() / collapseSpeedUpFactor)); } + if (mFixedDuration != NO_FIXED_DURATION) { + animator.setDuration(mFixedDuration); + } } animator.addListener(new AnimatorListenerAdapter() { private boolean mCancelled; @@ -944,7 +944,18 @@ public abstract class PanelView extends FrameLayout { } public boolean isCollapsing() { - return mClosing; + return mClosing || mLaunchingNotification; + } + + /** + * Bouncer might need a scrim when you double tap on notifications or edit QS. + * On other cases, when you drag up the bouncer with the finger or just fling, + * the scrim should be hidden to avoid occluding the clock. + * + * @return true when we need a scrim to show content on top of the notification panel. + */ + public boolean needsScrimming() { + return !isTracking() && !isCollapsing() && !isFullyCollapsed(); } public boolean isTracking() { @@ -1097,6 +1108,10 @@ public abstract class PanelView extends FrameLayout { mStatusBar.onUnlockHintStarted(); } + public boolean isUnlockHintRunning() { + return mHintAnimationRunning; + } + /** * Phase 1: Move everything upwards. */ @@ -1188,6 +1203,13 @@ public abstract class PanelView extends FrameLayout { mBar.panelExpansionChanged(mExpandedFraction, mExpandedFraction > 0f || mPeekAnimator != null || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null); + if (mExpansionListener != null) { + mExpansionListener.accept(mExpandedFraction, mTracking); + } + } + + public void setExpansionListener(BiConsumer<Float, Boolean> consumer) { + mExpansionListener = consumer; } protected abstract boolean isPanelVisibleBecauseOfHeadsUp(); @@ -1246,7 +1268,17 @@ public abstract class PanelView extends FrameLayout { */ protected abstract int getClearAllHeight(); - public void setHeadsUpManager(HeadsUpManager headsUpManager) { + public void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) { mHeadsUpManager = headsUpManager; } + + public void setLaunchingNotification(boolean launchingNotification) { + mLaunchingNotification = launchingNotification; + } + + public void collapseWithDuration(int animationDuration) { + mFixedDuration = animationDuration; + collapse(false /* delayed */, 1.0f /* speedUpFactor */); + mFixedDuration = NO_FIXED_DURATION; + } } |