Remove obsolete lock screen UI
Removes obsolete KeyguardSliceView title area and adds doze callbacks
necessary to support new lock screen design.
Bug: 111405682
Test: manual
Test: atest KeyguardSliceViewTest
Change-Id: I07e96dbde68d4e5e38e1371526bedf59fc925b86
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 7479152..50b98a1 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -23,15 +23,12 @@
import android.animation.PropertyValuesHolder;
import android.annotation.ColorInt;
import android.app.PendingIntent;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.Observer;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Trace;
import android.provider.Settings;
-import android.text.Layout;
import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
@@ -41,25 +38,9 @@
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.graphics.ColorUtils;
-import com.android.settingslib.Utils;
-import com.android.systemui.Dependency;
-import com.android.systemui.Interpolators;
-import com.android.systemui.R;
-import com.android.systemui.keyguard.KeyguardSliceProvider;
-import com.android.systemui.statusbar.AlphaOptimizedTextView;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.tuner.TunerService;
-import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.function.Consumer;
-
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Observer;
import androidx.slice.Slice;
import androidx.slice.SliceItem;
import androidx.slice.SliceViewManager;
@@ -69,6 +50,20 @@
import androidx.slice.widget.SliceContent;
import androidx.slice.widget.SliceLiveData;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.graphics.ColorUtils;
+import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
+import com.android.systemui.Interpolators;
+import com.android.systemui.keyguard.KeyguardSliceProvider;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.tuner.TunerService;
+import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
/**
* View visible under the clock on the lock screen and AoD.
*/
@@ -80,8 +75,6 @@
private final HashMap<View, PendingIntent> mClickActions;
private Uri mKeyguardSliceUri;
- @VisibleForTesting
- TextView mTitle;
private Row mRow;
private int mTextColor;
private float mDarkAmount = 0;
@@ -92,7 +85,6 @@
* Runnable called whenever the view contents change.
*/
private Runnable mContentChangeListener;
- private boolean mHasHeader;
private Slice mSlice;
private boolean mPulsing;
@@ -128,7 +120,6 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mTitle = findViewById(R.id.title);
mRow = findViewById(R.id.row);
mTextColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
mIconSize = (int) mContext.getResources().getDimension(R.dimen.widget_icon_size);
@@ -154,7 +145,6 @@
private void showSlice() {
Trace.beginSection("KeyguardSliceView#showSlice");
if (mPulsing || mSlice == null) {
- mTitle.setVisibility(GONE);
mRow.setVisibility(GONE);
if (mContentChangeListener != null) {
mContentChangeListener.run();
@@ -164,8 +154,9 @@
ListContent lc = new ListContent(getContext(), mSlice);
SliceContent headerContent = lc.getHeader();
- mHasHeader = headerContent != null && !headerContent.getSliceItem().hasHint(HINT_LIST_ITEM);
- List<SliceContent> subItems = new ArrayList<SliceContent>();
+ boolean hasHeader = headerContent != null
+ && !headerContent.getSliceItem().hasHint(HINT_LIST_ITEM);
+ List<SliceContent> subItems = new ArrayList<>();
for (int i = 0; i < lc.getRowItems().size(); i++) {
SliceContent subItem = lc.getRowItems().get(i);
String itemUri = subItem.getSliceItem().getSlice().getUri().toString();
@@ -174,21 +165,11 @@
subItems.add(subItem);
}
}
- if (!mHasHeader) {
- mTitle.setVisibility(GONE);
- } else {
- mTitle.setVisibility(VISIBLE);
-
- RowContent header = lc.getHeader();
- SliceItem mainTitle = header.getTitleItem();
- CharSequence title = mainTitle != null ? mainTitle.getText() : null;
- mTitle.setText(title);
- }
mClickActions.clear();
final int subItemsCount = subItems.size();
final int blendedColor = getTextColor();
- final int startIndex = mHasHeader ? 1 : 0; // First item is header; skip it
+ final int startIndex = hasHeader ? 1 : 0; // First item is header; skip it
mRow.setVisibility(subItemsCount > 0 ? VISIBLE : GONE);
for (int i = startIndex; i < subItemsCount; i++) {
RowContent rc = (RowContent) subItems.get(i);
@@ -200,7 +181,7 @@
button = new KeyguardSliceButton(mContext);
button.setTextColor(blendedColor);
button.setTag(itemTag);
- final int viewIndex = i - (mHasHeader ? 1 : 0);
+ final int viewIndex = i - (hasHeader ? 1 : 0);
mRow.addView(button, viewIndex);
}
@@ -303,7 +284,6 @@
private void updateTextColors() {
final int blendedColor = getTextColor();
- mTitle.setTextColor(blendedColor);
int childCount = mRow.getChildCount();
for (int i = 0; i < childCount; i++) {
View v = mRow.getChildAt(i);
@@ -333,10 +313,6 @@
mContentChangeListener = contentChangeListener;
}
- public boolean hasHeader() {
- return mHasHeader;
- }
-
/**
* LiveData observer lifecycle.
* @param slice the new slice content.
@@ -352,7 +328,7 @@
setupUri(newValue);
}
- public void setupUri(String uriString) {
+ private void setupUri(String uriString) {
if (uriString == null) {
uriString = KeyguardSliceProvider.KEYGUARD_SLICE_URI;
}
@@ -564,46 +540,6 @@
}
}
- /**
- * A text view that will split its contents in 2 lines when possible.
- */
- static class TitleView extends AlphaOptimizedTextView {
-
- public TitleView(Context context) {
- super(context);
- }
-
- public TitleView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public TitleView(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- Layout layout = getLayout();
- int lineCount = layout.getLineCount();
- boolean ellipsizing = layout.getEllipsisCount(lineCount - 1) != 0;
- if (lineCount > 0 && !ellipsizing) {
- CharSequence title = getText();
- CharSequence bestLineBreak = findBestLineBreak(title);
- if (!TextUtils.equals(title, bestLineBreak)) {
- setText(bestLineBreak);
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
- }
- }
- }
-
private class SliceViewTransitionListener implements LayoutTransition.TransitionListener {
@Override
public void startTransition(LayoutTransition transition, ViewGroup container, View view,
@@ -619,15 +555,6 @@
.setInterpolator(Interpolators.ALPHA_IN)
.start();
break;
- case LayoutTransition.DISAPPEARING:
- if (view == mTitle) {
- // Translate the view to the inverse of its height, so the layout event
- // won't misposition it.
- LayoutParams params = (LayoutParams) mTitle.getLayoutParams();
- int margin = params.topMargin + params.bottomMargin;
- mTitle.setTranslationY(-mTitle.getHeight() - margin);
- }
- break;
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index db78667..a403b75 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -200,10 +200,9 @@
* Moves clock, adjusting margins when slice content changes.
*/
private void onSliceContentChanged() {
- boolean smallClock = mKeyguardSlice.hasHeader() || mPulsing;
RelativeLayout.LayoutParams layoutParams =
(RelativeLayout.LayoutParams) mClockView.getLayoutParams();
- layoutParams.bottomMargin = smallClock ? mSmallClockPadding : 0;
+ layoutParams.bottomMargin = mPulsing ? mSmallClockPadding : 0;
mClockView.setLayoutParams(layoutParams);
}
@@ -214,17 +213,15 @@
public void onLayoutChange(View view, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
int heightOffset = mPulsing || mWasPulsing ? 0 : getHeight() - mLastLayoutHeight;
- boolean hasHeader = mKeyguardSlice.hasHeader();
- boolean smallClock = hasHeader || mPulsing;
long duration = KeyguardSliceView.DEFAULT_ANIM_DURATION;
- long delay = smallClock || mWasPulsing ? 0 : duration / 4;
+ long delay = mPulsing || mWasPulsing ? 0 : duration / 4;
mWasPulsing = false;
boolean shouldAnimate = mKeyguardSlice.getLayoutTransition() != null
&& mKeyguardSlice.getLayoutTransition().isRunning();
if (view == mClockView) {
- float clockScale = smallClock ? mSmallClockScale : 1;
- Paint.Style style = smallClock ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL;
+ float clockScale = mPulsing ? mSmallClockScale : 1;
+ Paint.Style style = mPulsing ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL;
mClockView.animate().cancel();
if (shouldAnimate) {
mClockView.setY(oldTop + heightOffset);
@@ -431,11 +428,6 @@
mWasPulsing = true;
}
mPulsing = pulsing;
- // Animation can look really weird when the slice has a header, let's hide the views
- // immediately instead of fading them away.
- if (mKeyguardSlice.hasHeader()) {
- animate = false;
- }
mKeyguardSlice.setPulsing(pulsing, animate);
updateDozeVisibleViews();
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeReceiver.java b/packages/SystemUI/src/com/android/systemui/doze/DozeReceiver.java
index dcb3882..30dfd36 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeReceiver.java
@@ -20,5 +20,19 @@
* Interface for class that cares about doze states.
*/
public interface DozeReceiver {
+
+ /**
+ * If device enters or leaves doze mode
+ */
void setDozing(boolean dozing);
+
+ /**
+ * Invoked every time a minute is elapsed in doze mode
+ */
+ void dozeTimeTick();
+
+ /**
+ * When view is double tapped in doze mode.
+ */
+ void onDozeDoubleTap();
}
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 b2a04ad..2b661ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -3961,6 +3961,9 @@
@Override
public void dozeTimeTick() {
mNotificationPanel.dozeTimeTick();
+ if (mAmbientIndicationContainer instanceof DozeReceiver) {
+ ((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick();
+ }
}
@Override
@@ -4027,7 +4030,8 @@
float viewY = screenY - mTmpInt2[1];
if (0 <= viewX && viewX <= mAmbientIndicationContainer.getWidth()
&& 0 <= viewY && viewY <= mAmbientIndicationContainer.getHeight()) {
- dispatchDoubleTap(viewX, viewY);
+ if (mAmbientIndicationContainer instanceof DozeReceiver)
+ ((DozeReceiver) mAmbientIndicationContainer).onDozeDoubleTap();
}
}
}
@@ -4042,17 +4046,6 @@
mScrimController.setAodFrontScrimAlpha(scrimOpacity);
}
- public void dispatchDoubleTap(float viewX, float viewY) {
- dispatchTap(mAmbientIndicationContainer, viewX, viewY);
- dispatchTap(mAmbientIndicationContainer, viewX, viewY);
- }
-
- private void dispatchTap(View view, float x, float y) {
- long now = SystemClock.elapsedRealtime();
- dispatchTouchEvent(view, x, y, now, MotionEvent.ACTION_DOWN);
- dispatchTouchEvent(view, x, y, now, MotionEvent.ACTION_UP);
- }
-
private void dispatchTouchEvent(View view, float x, float y, long now, int action) {
MotionEvent ev = MotionEvent.obtain(now, now, action, x, y, 0 /* meta */);
view.dispatchTouchEvent(ev);
@@ -4278,12 +4271,9 @@
}
}
- public void startPendingIntentDismissingKeyguard(final PendingIntent intent) {
+ public void executeActionDismissingKeyguard(Runnable action, boolean afterKeyguardGone) {
if (!mDeviceProvisionedController.isDeviceProvisioned()) return;
- final boolean afterKeyguardGone = intent.isActivity()
- && PreviewInflater.wouldLaunchResolverActivity(mContext, intent.getIntent(),
- mLockscreenUserManager.getCurrentUserId());
dismissKeyguardThenExecute(() -> {
new Thread(() -> {
try {
@@ -4294,25 +4284,35 @@
ActivityManager.getService().resumeAppSwitches();
} catch (RemoteException e) {
}
- try {
- intent.send(null, 0, null, null, null, null, getActivityOptions(
- null /* animationAdapter */));
- } catch (PendingIntent.CanceledException e) {
- // the stack trace isn't very helpful here.
- // Just log the exception message.
- Log.w(TAG, "Sending intent failed: " + e);
-
- // TODO: Dismiss Keyguard.
- }
- if (intent.isActivity()) {
- mAssistManager.hideAssist();
- }
+ action.run();
}).start();
return collapsePanel();
}, afterKeyguardGone);
}
+ public void startPendingIntentDismissingKeyguard(final PendingIntent intent) {
+ final boolean afterKeyguardGone = intent.isActivity()
+ && PreviewInflater.wouldLaunchResolverActivity(mContext, intent.getIntent(),
+ mLockscreenUserManager.getCurrentUserId());
+
+ executeActionDismissingKeyguard(() -> {
+ try {
+ intent.send(null, 0, null, null, null, null, getActivityOptions(
+ null /* animationAdapter */));
+ } catch (PendingIntent.CanceledException e) {
+ // the stack trace isn't very helpful here.
+ // Just log the exception message.
+ Log.w(TAG, "Sending intent failed: " + e);
+
+ // TODO: Dismiss Keyguard.
+ }
+ if (intent.isActivity()) {
+ mAssistManager.hideAssist();
+ }
+ }, afterKeyguardGone);
+ }
+
public static Bundle getActivityOptions(@Nullable RemoteAnimationAdapter animationAdapter) {
ActivityOptions options;
if (animationAdapter != null) {