Merge changes I5fa6ec7c,Ice1fabb2
* changes:
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
diff --git a/config/hiddenapi-max-target-o.txt b/config/hiddenapi-max-target-o.txt
index 592b4ae..3fee568 100644
--- a/config/hiddenapi-max-target-o.txt
+++ b/config/hiddenapi-max-target-o.txt
@@ -91672,7 +91672,6 @@
Lcom/android/internal/R$dimen;->notification_media_image_max_width:I
Lcom/android/internal/R$dimen;->notification_media_image_max_width_low_ram:I
Lcom/android/internal/R$dimen;->notification_messaging_spacing:I
-Lcom/android/internal/R$dimen;->notification_min_content_height:I
Lcom/android/internal/R$dimen;->notification_reply_inset:I
Lcom/android/internal/R$dimen;->notification_right_icon_size:I
Lcom/android/internal/R$dimen;->notification_right_icon_size_low_ram:I
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 70b7d22..75f7cec 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -4922,8 +4922,6 @@
contentView.setViewVisibility(textId, View.VISIBLE);
}
- setContentMinHeight(contentView, showProgress || mN.hasLargeIcon());
-
return contentView;
}
@@ -5081,21 +5079,6 @@
}
}
- /**
- * @param remoteView the remote view to update the minheight in
- * @param hasMinHeight does it have a mimHeight
- * @hide
- */
- void setContentMinHeight(RemoteViews remoteView, boolean hasMinHeight) {
- int minHeight = 0;
- if (hasMinHeight) {
- // we need to set the minHeight of the notification
- minHeight = mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.notification_min_content_height);
- }
- remoteView.setInt(R.id.notification_main_column, "setMinimumHeight", minHeight);
- }
-
private boolean handleProgressBar(RemoteViews contentView, Bundle ex,
StandardTemplateParams p) {
final int max = ex.getInt(EXTRA_PROGRESS_MAX, 0);
@@ -6942,7 +6925,6 @@
mBuilder.setTextViewColorSecondary(contentView, R.id.text, p);
contentView.setViewVisibility(R.id.text, View.VISIBLE);
}
- mBuilder.setContentMinHeight(contentView, mBuilder.mN.hasLargeIcon());
if (mBigLargeIconSet) {
mBuilder.mN.mLargeIcon = oldLargeIcon;
@@ -8710,7 +8692,7 @@
RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions(
mBuilder.getHeadsUpBaseLayoutResource(),
StandardTemplateParams.VIEW_TYPE_HEADS_UP, result);
- buildIntoRemoteViewContent(remoteViews, headsUpContentView, result, false);
+ buildIntoRemoteViewContent(remoteViews, headsUpContentView, result, true);
return remoteViews;
}
@@ -8755,8 +8737,7 @@
Resources resources = mBuilder.mContext.getResources();
int endMargin = resources.getDimensionPixelSize(
R.dimen.notification_content_margin_end) + result.getTitleMarginEnd();
- remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column,
- endMargin);
+ remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column, endMargin);
}
}
diff --git a/core/java/com/android/internal/widget/RecyclerView.java b/core/java/com/android/internal/widget/RecyclerView.java
index fd9e430..89a90e9 100644
--- a/core/java/com/android/internal/widget/RecyclerView.java
+++ b/core/java/com/android/internal/widget/RecyclerView.java
@@ -2799,6 +2799,7 @@
if (index < 0) {
Log.e(TAG, "Error processing scroll; pointer index for id "
+ mScrollPointerId + " not found. Did any MotionEvents get skipped?");
+ vtev.recycle();
return false;
}
diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml
index 46b3a8f..ded16b7 100644
--- a/core/res/res/layout/notification_template_material_base.xml
+++ b/core/res/res/layout/notification_template_material_base.xml
@@ -33,16 +33,30 @@
android:padding="@dimen/notification_icon_circle_padding"
/>
- <com.android.internal.widget.RemeasuringLinearLayout
+ <LinearLayout
android:id="@+id/notification_standard_view_column"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginBottom="@dimen/notification_headerless_margin_vertical"
- android:layout_marginTop="@dimen/notification_headerless_margin_vertical"
+ android:layout_marginBottom="@dimen/notification_headerless_margin_minimum"
+ android:layout_marginTop="@dimen/notification_headerless_margin_minimum"
android:orientation="vertical"
>
+ <!--
+ This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is
+ what causes this view (and it's counterpart at the opposite end) to collapse before the
+ actual content views do.
+ This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support
+ headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line
+ variant is 56dp and the 2- and 3-line variants are both 76dp.
+ -->
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/notification_headerless_margin_extra"
+ android:layout_weight="1"
+ />
+
<!-- extends ViewGroup -->
<NotificationTopLineView
android:id="@+id/notification_top_line"
@@ -58,6 +72,7 @@
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
@@ -69,7 +84,7 @@
</NotificationTopLineView>
- <com.android.internal.widget.RemeasuringLinearLayout
+ <LinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -91,8 +106,23 @@
android:layout_height="@dimen/notification_headerless_line_height"
/>
- </com.android.internal.widget.RemeasuringLinearLayout>
- </com.android.internal.widget.RemeasuringLinearLayout>
+ </LinearLayout>
+
+ <!--
+ This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is
+ what causes this view (and it's counterpart at the opposite end) to collapse before the
+ actual content views do.
+ This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support
+ headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line
+ variant is 56dp and the 2- and 3-line variants are both 76dp.
+ -->
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/notification_headerless_margin_extra"
+ android:layout_weight="1"
+ />
+
+ </LinearLayout>
<ImageView
android:id="@+id/right_icon"
diff --git a/core/res/res/layout/notification_template_material_big_media.xml b/core/res/res/layout/notification_template_material_big_media.xml
index bbe49e5..4cf323b 100644
--- a/core/res/res/layout/notification_template_material_big_media.xml
+++ b/core/res/res/layout/notification_template_material_big_media.xml
@@ -54,7 +54,6 @@
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginBottom="@dimen/notification_content_margin"
android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
>
diff --git a/core/res/res/layout/notification_template_material_big_text.xml b/core/res/res/layout/notification_template_material_big_text.xml
index b8e827d..2452a32 100644
--- a/core/res/res/layout/notification_template_material_big_text.xml
+++ b/core/res/res/layout/notification_template_material_big_text.xml
@@ -48,7 +48,6 @@
android:paddingStart="@dimen/notification_content_margin_start"
android:paddingEnd="@dimen/notification_content_margin_end"
android:clipToPadding="false"
- android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
android:layout_weight="1"
>
diff --git a/core/res/res/layout/notification_template_material_inbox.xml b/core/res/res/layout/notification_template_material_inbox.xml
index eb89258..e6fa503 100644
--- a/core/res/res/layout/notification_template_material_inbox.xml
+++ b/core/res/res/layout/notification_template_material_inbox.xml
@@ -39,7 +39,6 @@
android:layout_gravity="top"
android:paddingStart="@dimen/notification_content_margin_start"
android:paddingEnd="@dimen/notification_content_margin_end"
- android:minHeight="@dimen/notification_min_content_height"
android:layout_weight="1"
android:clipToPadding="false"
android:orientation="vertical"
diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml
index 575295b..52053dc 100644
--- a/core/res/res/layout/notification_template_material_media.xml
+++ b/core/res/res/layout/notification_template_material_media.xml
@@ -55,7 +55,6 @@
android:layout_height="wrap_content"
android:layout_gravity="fill_vertical"
android:layout_weight="1"
- android:minHeight="@dimen/notification_min_content_height"
android:paddingBottom="@dimen/notification_content_margin"
android:orientation="vertical"
>
diff --git a/core/res/res/layout/notification_template_material_messaging.xml b/core/res/res/layout/notification_template_material_messaging.xml
index de9814b..c3fd249 100644
--- a/core/res/res/layout/notification_template_material_messaging.xml
+++ b/core/res/res/layout/notification_template_material_messaging.xml
@@ -40,7 +40,6 @@
android:layout_weight="1"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
>
<com.android.internal.widget.MessagingLinearLayout
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index d7722ef..79eae67 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -298,8 +298,11 @@
<!-- The top padding for the notification expand button. -->
<dimen name="notification_expand_button_padding_top">1dp</dimen>
- <!-- vertical margin for the headerless notification content -->
- <dimen name="notification_headerless_margin_vertical">18dp</dimen>
+ <!-- minimum vertical margin for the headerless notification content -->
+ <dimen name="notification_headerless_margin_minimum">8dp</dimen>
+
+ <!-- extra vertical margin for the headerless notification content -->
+ <dimen name="notification_headerless_margin_extra">10dp</dimen>
<!-- The height of each of the 1 or 2 lines in the headerless notification template -->
<dimen name="notification_headerless_line_height">20sp</dimen>
@@ -319,9 +322,6 @@
<!-- The minimum width of the app name in the header if it shrinks -->
<dimen name="notification_header_shrink_min_width">72dp</dimen>
- <!-- The minimum height of the content if there are at least two lines or a picture-->
- <dimen name="notification_min_content_height">39dp</dimen>
-
<!-- The size of the media actions in the media notification. -->
<dimen name="media_notification_action_button_size">48dp</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 7567468..23733af 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2871,7 +2871,6 @@
<java-symbol type="drawable" name="ic_collapse_notification" />
<java-symbol type="drawable" name="ic_expand_bundle" />
<java-symbol type="drawable" name="ic_collapse_bundle" />
- <java-symbol type="dimen" name="notification_min_content_height" />
<java-symbol type="dimen" name="notification_header_shrink_min_width" />
<java-symbol type="dimen" name="notification_content_margin_start" />
<java-symbol type="dimen" name="notification_content_margin_end" />
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 42e6ab9..81aeec0 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -550,8 +550,7 @@
@Saveflags int saveFlags) {
checkValidSaveFlags(saveFlags);
return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom,
- paint != null ? paint.getNativeInstance() : 0,
- ALL_SAVE_FLAG);
+ paint != null ? paint.getNativeInstance() : 0);
}
/**
@@ -626,8 +625,7 @@
@Saveflags int saveFlags) {
checkValidSaveFlags(saveFlags);
alpha = Math.min(255, Math.max(0, alpha));
- return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom,
- alpha, ALL_SAVE_FLAG);
+ return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom, alpha);
}
/**
@@ -1420,10 +1418,10 @@
private static native int nSave(long canvasHandle, int saveFlags);
@CriticalNative
private static native int nSaveLayer(long nativeCanvas, float l, float t, float r, float b,
- long nativePaint, int layerFlags);
+ long nativePaint);
@CriticalNative
private static native int nSaveLayerAlpha(long nativeCanvas, float l, float t, float r, float b,
- int alpha, int layerFlags);
+ int alpha);
@CriticalNative
private static native int nSaveUnclippedLayer(long nativeCanvas, int l, int t, int r, int b);
@CriticalNative
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 1dbce58..9a4ed81 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -160,32 +160,20 @@
}
}
-static inline SkCanvas::SaveLayerFlags layerFlags(SaveFlags::Flags flags) {
- SkCanvas::SaveLayerFlags layerFlags = 0;
-
- if (!(flags & SaveFlags::ClipToLayer)) {
- layerFlags |= SkCanvasPriv::kDontClipToLayer_SaveLayerFlag;
- }
-
- return layerFlags;
-}
-
-int SkiaCanvas::saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
- SaveFlags::Flags flags) {
+int SkiaCanvas::saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) {
const SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom);
- const SkCanvas::SaveLayerRec rec(&bounds, paint, layerFlags(flags));
+ const SkCanvas::SaveLayerRec rec(&bounds, paint);
return mCanvas->saveLayer(rec);
}
-int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
- SaveFlags::Flags flags) {
+int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, int alpha) {
if (static_cast<unsigned>(alpha) < 0xFF) {
SkPaint alphaPaint;
alphaPaint.setAlpha(alpha);
- return this->saveLayer(left, top, right, bottom, &alphaPaint, flags);
+ return this->saveLayer(left, top, right, bottom, &alphaPaint);
}
- return this->saveLayer(left, top, right, bottom, nullptr, flags);
+ return this->saveLayer(left, top, right, bottom, nullptr);
}
int SkiaCanvas::saveUnclippedLayer(int left, int top, int right, int bottom) {
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 2cb850c8..591ae5c 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -73,10 +73,8 @@
virtual void restoreToCount(int saveCount) override;
virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) override;
- virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
- SaveFlags::Flags flags) override;
- virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
- SaveFlags::Flags flags) override;
+ virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) override;
+ virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) override;
virtual int saveUnclippedLayer(int left, int top, int right, int bottom) override;
virtual void getMatrix(SkMatrix* outMatrix) const override;
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index 772b7a2..f94bae274 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -178,10 +178,8 @@
virtual void restoreToCount(int saveCount) = 0;
virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) = 0;
- virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
- SaveFlags::Flags flags) = 0;
- virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
- SaveFlags::Flags flags) = 0;
+ virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) = 0;
+ virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) = 0;
virtual int saveUnclippedLayer(int, int, int, int) = 0;
// Matrix
diff --git a/libs/hwui/jni/android_graphics_Canvas.cpp b/libs/hwui/jni/android_graphics_Canvas.cpp
index c04340c..89fb8bb 100644
--- a/libs/hwui/jni/android_graphics_Canvas.cpp
+++ b/libs/hwui/jni/android_graphics_Canvas.cpp
@@ -93,16 +93,14 @@
}
static jint saveLayer(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jfloat l, jfloat t,
- jfloat r, jfloat b, jlong paintHandle, jint flagsHandle) {
+ jfloat r, jfloat b, jlong paintHandle) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
- SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle);
- return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint, flags));
+ return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint));
}
static jint saveLayerAlpha(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jfloat l, jfloat t,
- jfloat r, jfloat b, jint alpha, jint flagsHandle) {
- SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle);
- return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags));
+ jfloat r, jfloat b, jint alpha) {
+ return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha));
}
static jint saveUnclippedLayer(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jint l, jint t, jint r, jint b) {
@@ -688,8 +686,8 @@
{"nGetWidth","(J)I", (void*) CanvasJNI::getWidth},
{"nGetHeight","(J)I", (void*) CanvasJNI::getHeight},
{"nSave","(JI)I", (void*) CanvasJNI::save},
- {"nSaveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer},
- {"nSaveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha},
+ {"nSaveLayer","(JFFFFJ)I", (void*) CanvasJNI::saveLayer},
+ {"nSaveLayerAlpha","(JFFFFI)I", (void*) CanvasJNI::saveLayerAlpha},
{"nSaveUnclippedLayer","(JIIII)I", (void*) CanvasJNI::saveUnclippedLayer},
{"nRestoreUnclippedLayer","(JIJ)V", (void*) CanvasJNI::restoreUnclippedLayer},
{"nGetSaveCount","(J)I", (void*) CanvasJNI::getSaveCount},
diff --git a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp
index a9449b6..5eaf185 100644
--- a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp
+++ b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp
@@ -32,7 +32,7 @@
int itemHeight) override {
canvas.drawColor(Color::White, SkBlendMode::kSrcOver);
int length = dp(100);
- canvas.saveLayer(0, 0, length, itemHeight, nullptr, SaveFlags::HasAlphaLayer);
+ canvas.saveLayer(0, 0, length, itemHeight, nullptr);
Paint textPaint;
textPaint.getSkFont().setSize(dp(20));
textPaint.setAntiAlias(true);
diff --git a/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp b/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp
index 8630be8..252f539 100644
--- a/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp
+++ b/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp
@@ -47,8 +47,7 @@
// interleave drawText and drawRect with saveLayer ops
for (int i = 0; i < regions; i++, top += smallRectHeight) {
- canvas.saveLayer(bounds.fLeft, top, bounds.fRight, top + padding, &mBluePaint,
- SaveFlags::ClipToLayer | SaveFlags::MatrixClip);
+ canvas.saveLayer(bounds.fLeft, top, bounds.fRight, top + padding, &mBluePaint);
canvas.drawColor(SkColorSetARGB(255, 255, 255, 0), SkBlendMode::kSrcOver);
std::string stri = std::to_string(i);
std::string offscreen = "offscreen line " + stri;
diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp
index 97bfba3..10ba079 100644
--- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp
+++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp
@@ -33,10 +33,10 @@
card = TestUtils::createNode(0, 0, 400, 800, [](RenderProperties& props, Canvas& canvas) {
// nested clipped saveLayers
- canvas.saveLayerAlpha(0, 0, 400, 400, 200, SaveFlags::ClipToLayer);
+ canvas.saveLayerAlpha(0, 0, 400, 400, 200);
canvas.drawColor(Color::Green_700, SkBlendMode::kSrcOver);
canvas.clipRect(50, 50, 350, 350, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer);
+ canvas.saveLayerAlpha(100, 100, 300, 300, 128);
canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver);
canvas.restore();
canvas.restore();
@@ -44,12 +44,14 @@
// single unclipped saveLayer
canvas.save(SaveFlags::MatrixClip);
canvas.translate(0, 400);
- canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::Flags(0)); // unclipped
+ int unclippedSaveLayer = canvas.saveUnclippedLayer(100, 100, 300, 300);
Paint paint;
paint.setAntiAlias(true);
paint.setColor(Color::Green_700);
canvas.drawCircle(200, 200, 200, paint);
- canvas.restore();
+ SkPaint alphaPaint;
+ alphaPaint.setAlpha(128);
+ canvas.restoreUnclippedLayer(unclippedSaveLayer, alphaPaint);
canvas.restore();
});
diff --git a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
index 7aa6be8..abdf9d5 100644
--- a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
+++ b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
@@ -198,7 +198,7 @@
EXPECT_TRUE(getRecorderMatrix(recorder).isIdentity());
// note we don't pass SaveFlags::MatrixClip, but matrix and clip will be saved
- recorder.saveLayer(0, 0, 400, 400, &layerPaint, SaveFlags::ClipToLayer);
+ recorder.saveLayer(0, 0, 400, 400, &layerPaint);
ASSERT_EQ(SkRect::MakeLTRB(0, 0, 400, 400), getRecorderClipBounds(recorder));
EXPECT_TRUE(getRecorderMatrix(recorder).isIdentity());
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
index d339ae9..7816d62 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -67,20 +67,18 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
- android:layout_marginBottom="24dp"
android:visibility="gone">
<com.android.keyguard.AnimatableClockView
android:id="@+id/animatable_clock_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:gravity="right"
android:textSize="80dp"
android:letterSpacing="0.02"
android:lineSpacingMultiplier=".8"
android:includeFontPadding="false"
android:fontFamily="@font/clock"
android:typeface="monospace"
- android:format12Hour="hh\nmm"
- android:format24Hour="HH\nmm"
android:elegantTextHeight="false"
/>
</FrameLayout>
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index 692e401..3157a5a 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -17,6 +17,8 @@
package com.android.keyguard;
import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.MathUtils;
import com.android.settingslib.Utils;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -54,6 +56,11 @@
mStatusBarStateController.removeCallback(mStatusBarStateListener);
}
+ float getClockTextTopPadding() {
+ Paint.FontMetrics fm = mView.getPaint().getFontMetrics();
+ return MathUtils.abs(fm.ascent - fm.top);
+ }
+
/**
* Updates the time for this view.
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 4d8fdf3..d731840 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -232,6 +232,11 @@
}
}
+ float getClockTextTopPadding() {
+ Paint.FontMetrics fm = mClockView.getPaint().getFontMetrics();
+ return fm.ascent - fm.top;
+ }
+
/**
* Set container for big clock face appearing behind NSSL and KeyguardStatusView.
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index 775ebf4..6c69534 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -239,6 +239,15 @@
mView.setFormat24Hour(Patterns.sClockView24);
}
+ float getClockTextTopPadding() {
+ if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1
+ && mNewLockScreenClockViewController != null) {
+ return mNewLockScreenClockViewController.getClockTextTopPadding();
+ }
+
+ return mView.getClockTextTopPadding();
+ }
+
private void updateAodIcons() {
NotificationIconContainer nic = (NotificationIconContainer)
mView.findViewById(
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index a9c06ed..a32cd14 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -154,12 +154,7 @@
public void updateLockScreenMode(int mode) {
mLockScreenMode = mode;
if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
- // add top padding to better align with top of clock
- final int topPadding = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP,
- 20,
- getResources().getDisplayMetrics());
- mTitle.setPaddingRelative(0, topPadding, 0, 0);
+ mTitle.setPaddingRelative(0, 0, 0, 0);
mTitle.setGravity(Gravity.START);
setGravity(Gravity.START);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
@@ -524,9 +519,9 @@
.getDimension(R.dimen.widget_horizontal_padding) / 2;
if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
// orientation is vertical, so add padding to top & bottom
- setPadding(0, padding, 0, padding * (hasText ? 1 : -1));
+ setPadding(0, padding, 0, hasText ? padding : 0);
} else {
- // oreintation is horizontal, so add padding to left & right
+ // orientation is horizontal, so add padding to left & right
setPadding(padding, 0, padding * (hasText ? 1 : -1), 0);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java
index 02b18b2..1b0a7fa 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java
@@ -26,6 +26,7 @@
import android.util.Log;
import android.view.Display;
import android.view.View;
+import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
@@ -148,6 +149,12 @@
KeyguardSliceViewController.this.hashCode()));
}
+ void updateTopMargin(float clockTopTextPadding) {
+ ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
+ lp.topMargin = (int) clockTopTextPadding;
+ mView.setLayoutParams(lp);
+ }
+
/**
* Updates the lockscreen mode which may change the layout of the keyguard slice view.
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index cc7b832..dcb306e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -297,6 +297,15 @@
mLockScreenMode = mode;
mKeyguardClockSwitchController.updateLockScreenMode(mode);
mKeyguardSliceViewController.updateLockScreenMode(mode);
+ if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) {
+ // align the top of keyguard_status_area with the top of the clock text instead
+ // of the top of the view
+ mKeyguardSliceViewController.updateTopMargin(
+ mKeyguardClockSwitchController.getClockTextTopPadding());
+ } else {
+ // reset margin
+ mKeyguardSliceViewController.updateTopMargin(0);
+ }
updateAodIcons();
}
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 3291aa0..dce081f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -214,6 +214,7 @@
@Override
public void onAnimationCancel(Animator animation) {
mOpening = false;
+ mQs.notifyCustomizeChanged();
mNotifQsContainer.setCustomizerAnimating(false);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 5c225e5..7508dcb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -256,10 +256,9 @@
// TODO(b/12836565) - prototyping only adjustment
if (mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL) {
- // This will keep the clock at the top for AOD
- return (int) (clockY + burnInPreventionOffsetY() + mEmptyDragAmount);
+ // This will keep the clock at the top
+ clockYDark = (int) (clockY + burnInPreventionOffsetY());
}
-
return (int) (MathUtils.lerp(clockY, clockYDark, darkAmount) + mEmptyDragAmount);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 193c963..c936e82 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -221,6 +221,7 @@
@Override
public void onLockScreenModeChanged(int mode) {
+ mLockScreenMode = mode;
mClockPositionAlgorithm.onLockScreenModeChanged(mode);
}
@@ -472,6 +473,8 @@
private int mOldLayoutDirection;
private NotificationShelfController mNotificationShelfController;
+ private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL;
+
private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
@@ -872,8 +875,10 @@
mNotificationStackScrollLayoutController.getIntrinsicContentHeight(),
getExpandedFraction(),
totalHeight,
- (int) (mKeyguardStatusViewController.getHeight()
- - mShelfHeight / 2.0f - mDarkIconSize / 2.0f),
+ mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1
+ ? mKeyguardStatusViewController.getHeight()
+ : (int) (mKeyguardStatusViewController.getHeight()
+ - mShelfHeight / 2.0f - mDarkIconSize / 2.0f),
clockPreferredY, hasCustomClock(),
hasVisibleNotifications, mInterpolatedDarkAmount, mEmptyDragAmount,
bypassEnabled, getUnlockedStackScrollerPadding(),
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index c42c84f..ad96e76 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -156,6 +156,7 @@
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
+import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -261,7 +262,13 @@
@Override
public void onStart() {
- AndroidKeyStoreProvider.install();
+ Optional<Boolean> keystore2_enabled =
+ android.sysprop.Keystore2Properties.keystore2_enabled();
+ if (keystore2_enabled.isPresent() && keystore2_enabled.get()) {
+ android.security.keystore2.AndroidKeyStoreProvider.install();
+ } else {
+ AndroidKeyStoreProvider.install();
+ }
mLockSettingsService = new LockSettingsService(getContext());
publishBinderService("lock_settings", mLockSettingsService);
}
@@ -533,7 +540,8 @@
public @NonNull ManagedProfilePasswordCache getManagedProfilePasswordCache() {
try {
- java.security.KeyStore ks = java.security.KeyStore.getInstance("AndroidKeyStore");
+ java.security.KeyStore ks = java.security.KeyStore.getInstance(
+ SyntheticPasswordCrypto.androidKeystoreProviderName());
ks.load(null);
return new ManagedProfilePasswordCache(ks, getUserManager());
} catch (Exception e) {
@@ -1281,7 +1289,8 @@
byte[] encryptedPassword = Arrays.copyOfRange(storedData, PROFILE_KEY_IV_SIZE,
storedData.length);
byte[] decryptionResult;
- java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
+ java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
+ SyntheticPasswordCrypto.androidKeystoreProviderName());
keyStore.load(null);
SecretKey decryptionKey = (SecretKey) keyStore.getKey(
LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + userId, null);
@@ -1717,7 +1726,8 @@
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
keyGenerator.init(new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
- java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
+ java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
+ SyntheticPasswordCrypto.androidKeystoreProviderName());
keyStore.load(null);
try {
keyStore.setEntry(
@@ -2291,7 +2301,8 @@
private void removeKeystoreProfileKey(int targetUserId) {
Slog.i(TAG, "Remove keystore profile key for user: " + targetUserId);
try {
- java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
+ java.security.KeyStore keyStore = java.security.KeyStore.getInstance(
+ SyntheticPasswordCrypto.androidKeystoreProviderName());
keyStore.load(null);
keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + targetUserId);
keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + targetUserId);
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
index 9246311..6d420a9 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java
@@ -18,6 +18,7 @@
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
+import android.security.keystore2.AndroidKeyStoreProvider;
import android.util.Slog;
import java.io.ByteArrayOutputStream;
@@ -125,7 +126,7 @@
public static byte[] decryptBlobV1(String keyAlias, byte[] blob, byte[] applicationId) {
try {
- KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+ KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
keyStore.load(null);
SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null);
@@ -140,9 +141,24 @@
}
}
+ /**
+ * TODO This function redirects keystore access to the legacy keystore during a transitional
+ * phase during which not all calling code has been adjusted to use Keystore 2.0.
+ * This can be reverted to a constant of "AndroidKeyStore" when b/171305684 is complete.
+ * The specific bug for this component is b/171305115.
+ */
+ static String androidKeystoreProviderName() {
+ if (AndroidKeyStoreProvider.isInstalled()) {
+ return "AndroidKeyStoreLegacy";
+ } else {
+ return "AndroidKeystore";
+ }
+
+ }
+
public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) {
try {
- KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+ KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
keyStore.load(null);
SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null);
@@ -166,7 +182,7 @@
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
keyGenerator.init(AES_KEY_LENGTH * 8, new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
- KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+ KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName());
keyStore.load(null);
KeyProtection.Builder builder = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
@@ -196,7 +212,7 @@
public static void destroyBlobKey(String keyAlias) {
KeyStore keyStore;
try {
- keyStore = KeyStore.getInstance("AndroidKeyStore");
+ keyStore = KeyStore.getInstance(androidKeystoreProviderName());
keyStore.load(null);
keyStore.deleteEntry(keyAlias);
Slog.i(TAG, "SP key deleted: " + keyAlias);
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index 074aefe..885ff9b 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -26,6 +26,7 @@
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.ServiceSpecificException;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.BinderCacheManager;
@@ -198,6 +199,8 @@
c.setExecutor(executor);
try {
imsRcsController.registerImsRegistrationCallback(mSubId, c.getBinder());
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.toString(), e.errorCode);
} catch (RemoteException | IllegalStateException e) {
throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
}
@@ -333,6 +336,9 @@
c.setExecutor(executor);
try {
imsRcsController.registerRcsAvailabilityCallback(mSubId, c.getBinder());
+
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.toString(), e.errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#registerRcsAvailabilityCallback", e);
throw new ImsException("Remote IMS Service is not available",
diff --git a/telephony/java/android/telephony/ims/RcsUceAdapter.java b/telephony/java/android/telephony/ims/RcsUceAdapter.java
index 0aeaecc..ada0696 100644
--- a/telephony/java/android/telephony/ims/RcsUceAdapter.java
+++ b/telephony/java/android/telephony/ims/RcsUceAdapter.java
@@ -27,6 +27,7 @@
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.ServiceSpecificException;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.ims.aidl.IImsRcsController;
import android.telephony.ims.aidl.IRcsUceControllerCallback;
@@ -463,6 +464,8 @@
try {
imsRcsController.requestCapabilities(mSubId, mContext.getOpPackageName(),
mContext.getAttributionTag(), contactNumbers, internalCallback);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.toString(), e.errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#requestCapabilities", e);
throw new ImsException("Remote IMS Service is not available",
@@ -545,6 +548,8 @@
try {
imsRcsController.requestNetworkAvailability(mSubId, mContext.getOpPackageName(),
mContext.getAttributionTag(), contactNumber, internalCallback);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.toString(), e.errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#requestNetworkAvailability", e);
throw new ImsException("Remote IMS Service is not available",
@@ -574,7 +579,7 @@
try {
return imsRcsController.getUcePublishState(mSubId);
- } catch (android.os.ServiceSpecificException e) {
+ } catch (ServiceSpecificException e) {
throw new ImsException(e.getMessage(), e.errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#getUcePublishState", e);
@@ -621,7 +626,7 @@
c.setExecutor(executor);
try {
imsRcsController.registerUcePublishStateCallback(mSubId, c.getBinder());
- } catch (android.os.ServiceSpecificException e) {
+ } catch (ServiceSpecificException e) {
throw new ImsException(e.getMessage(), e.errorCode);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#registerUcePublishStateCallback", e);