Notification guts have now the actualHeight of the notifications

Before it just had the height of the notification leading to bugs
in cornercases during animations and swiping.
Also updated to colors to use system colors.

Bug: 17333457
Change-Id: I00d87820595a789006632c582e8c35759a61969d
This commit is contained in:
Selim Cinek
2014-09-01 15:11:28 +02:00
parent 1cf8906231
commit 024ca598dd
6 changed files with 121 additions and 12 deletions

View File

@@ -17,5 +17,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/notification_guts_bg_color" />
<corners android:radius="@dimen/notification_material_rounded_rect_radius" />
<!--The radius is 1dp smaller than the notification one, to avoid aliasing bugs on the corners -->
<corners android:radius="1dp" />
</shape>

View File

@@ -15,11 +15,10 @@
limitations under the License.
-->
<FrameLayout
<com.android.systemui.statusbar.NotificationGuts
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/notification_guts_bg"
android:id="@+id/notification_guts"
android:visibility="gone"
android:clickable="true"
@@ -87,4 +86,4 @@
android:src="@drawable/ic_settings"
/>
</LinearLayout>
</FrameLayout>
</com.android.systemui.statusbar.NotificationGuts>

View File

@@ -97,9 +97,9 @@
<color name="segmented_button_text_inactive">#99afbdc4</color><!-- 60% -->
<!-- The "inside" of a notification, reached via longpress -->
<color name="notification_guts_bg_color">#ff424242</color><!-- grey 800 -->
<color name="notification_guts_bg_color">@color/system_secondary_color</color>
<color name="notification_guts_title_color">#FFFFFFFF</color>
<color name="notification_guts_text_color">#99FFFFFF</color>
<color name="notification_guts_text_color">#b2FFFFFF</color>
<color name="notification_guts_btn_color">#FFFFFFFF</color>
<color name="search_panel_card_color">#ffffff</color>

View File

@@ -191,7 +191,7 @@ public abstract class BaseStatusBar extends SystemUI implements
protected int mZenMode;
// which notification is currently being longpress-examined by the user
private View mNotificationGutsExposed;
private NotificationGuts mNotificationGutsExposed;
private TimeInterpolator mLinearOutSlowIn, mFastOutLinearIn;
@@ -659,15 +659,16 @@ public abstract class BaseStatusBar extends SystemUI implements
if (v.getWindowToken() == null) return false;
// Assume we are a status_bar_notification_row
final View guts = v.findViewById(R.id.notification_guts);
final NotificationGuts guts = (NotificationGuts) v.findViewById(
R.id.notification_guts);
if (guts == null) return false;
// Already showing?
if (guts.getVisibility() == View.VISIBLE) return false;
guts.setVisibility(View.VISIBLE);
final double horz = Math.max(v.getWidth() - x, x);
final double vert = Math.max(v.getHeight() - y, y);
final double horz = Math.max(guts.getWidth() - x, x);
final double vert = Math.max(guts.getActualHeight() - y, y);
final float r = (float) Math.hypot(horz, vert);
final Animator a
= ViewAnimationUtils.createCircularReveal(guts, x, y, 0, r);
@@ -684,11 +685,11 @@ public abstract class BaseStatusBar extends SystemUI implements
public void dismissPopups() {
if (mNotificationGutsExposed != null) {
final View v = mNotificationGutsExposed;
final NotificationGuts v = mNotificationGutsExposed;
mNotificationGutsExposed = null;
final int x = (v.getLeft() + v.getRight()) / 2;
final int y = (v.getTop() + v.getBottom()) / 2;
final int y = (v.getTop() + v.getActualHeight() / 2);
final Animator a = ViewAnimationUtils.createCircularReveal(v,
x, y, x, 0);
a.setDuration(200);

View File

@@ -60,6 +60,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
private ExpansionLogger mLogger;
private String mLoggingKey;
private boolean mWasReset;
private NotificationGuts mGuts;
public interface ExpansionLogger {
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
@@ -103,6 +104,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
super.onFinishInflate();
mPublicLayout = (NotificationContentView) findViewById(R.id.expandedPublic);
mPrivateLayout = (NotificationContentView) findViewById(R.id.expanded);
mGuts = (NotificationGuts) findViewById(R.id.notification_guts);
mVetoButton = findViewById(R.id.veto);
}
@@ -360,6 +362,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
public void setActualHeight(int height, boolean notifyListeners) {
mPrivateLayout.setActualHeight(height);
mPublicLayout.setActualHeight(height);
mGuts.setActualHeight(height);
invalidate();
super.setActualHeight(height, notifyListeners);
}
@@ -381,6 +384,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
super.setClipTopAmount(clipTopAmount);
mPrivateLayout.setClipTopAmount(clipTopAmount);
mPublicLayout.setClipTopAmount(clipTopAmount);
mGuts.setClipTopAmount(clipTopAmount);
}
public void notifyContentUpdated() {

View File

@@ -0,0 +1,104 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.systemui.statusbar;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import com.android.systemui.R;
/**
* The guts of a notification revealed when performing a long press.
*/
public class NotificationGuts extends FrameLayout {
private Drawable mBackground;
private int mClipTopAmount;
private int mActualHeight;
public NotificationGuts(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
}
@Override
protected void onDraw(Canvas canvas) {
draw(canvas, mBackground);
}
private void draw(Canvas canvas, Drawable drawable) {
if (drawable != null) {
drawable.setBounds(0, mClipTopAmount, getWidth(), mActualHeight);
drawable.draw(canvas);
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mBackground = mContext.getDrawable(R.drawable.notification_guts_bg);
if (mBackground != null) {
mBackground.setCallback(this);
}
}
@Override
protected boolean verifyDrawable(Drawable who) {
return super.verifyDrawable(who) || who == mBackground;
}
@Override
protected void drawableStateChanged() {
drawableStateChanged(mBackground);
}
private void drawableStateChanged(Drawable d) {
if (d != null && d.isStateful()) {
d.setState(getDrawableState());
}
}
@Override
public void drawableHotspotChanged(float x, float y) {
if (mBackground != null) {
mBackground.setHotspot(x, y);
}
}
public void setActualHeight(int actualHeight) {
mActualHeight = actualHeight;
invalidate();
}
public int getActualHeight() {
return mActualHeight;
}
public void setClipTopAmount(int clipTopAmount) {
mClipTopAmount = clipTopAmount;
invalidate();
}
@Override
public boolean hasOverlappingRendering() {
// Prevents this view from creating a layer when alpha is animating.
return false;
}
}