Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3850b68 authored by Daniel Sandler's avatar Daniel Sandler
Browse files

Improve handling of small largeIcons in tablet ticker.

The tablet system bar is too short for a full notification
row, but it will show the largeIcon of a new notification in
its full frame, intruding into the main application content
rectangle a bit. This is a good thing---the notifications
really pop out at you---but it looks a little odd if the
largeIcon is actually *small*: the icon is vertically
centered in the larger (invisible) rectangle, making it look
poorly centered on the system bar.

This change will detect short largeIcons and center them in
the system bar's height instead. Additionally, it applies
the same ticker background all the way to the left
underneath largeIcons that are not full-frame (and therefore
have transparent regions).

Bug: 5708907
Bug: 5560485
Change-Id: I32af45632df164c58fb960110063dbaa08b5536c
parent f352491a
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -15,20 +15,29 @@
 * limitations under the License.
-->

<LinearLayout
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="bottom"
    >

    <View
        android:layout_height="@*android:dimen/status_bar_height"
        android:layout_width="match_parent"
        android:background="@drawable/status_bar_ticker_background"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:clickable="false"
        />

    <ImageView
        android:id="@+id/large_icon"
        android:layout_width="@android:dimen/notification_large_icon_height"
        android:layout_height="@android:dimen/notification_large_icon_width"
        android:scaleType="center"
        android:visibility="gone"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        />

    <FrameLayout
@@ -36,6 +45,8 @@
        android:layout_weight="1"
        android:layout_height="@*android:dimen/status_bar_height"
        android:layout_width="match_parent"
        android:background="@drawable/status_bar_ticker_background"
        android:layout_toRightOf="@id/large_icon"
        android:layout_alignParentBottom="true"
        android:layout_alignWithParentIfMissing="true"
        />
</LinearLayout>
</RelativeLayout>
+16 −3
Original line number Diff line number Diff line
@@ -73,6 +73,8 @@ public class TabletTicker
    private StatusBarNotification[] mQueue = new StatusBarNotification[QUEUE_LENGTH];
    private int mQueuePos;

    private final int mLargeIconHeight;

    private TabletStatusBar mBar;

    private LayoutTransition mLayoutTransition;
@@ -81,6 +83,9 @@ public class TabletTicker
    public TabletTicker(TabletStatusBar bar) {
        mBar = bar;
        mContext = bar.getContext();
        final Resources res = mContext.getResources();
        mLargeIconHeight = res.getDimensionPixelSize(
                android.R.dimen.notification_large_icon_height);
    }

    public void add(IBinder key, StatusBarNotification notification) {
@@ -209,8 +214,6 @@ public class TabletTicker
        final Resources res = mContext.getResources();
        final FrameLayout view = new FrameLayout(mContext);
        final int width = res.getDimensionPixelSize(R.dimen.notification_ticker_width);
        final int height = res.getDimensionPixelSize(
                android.R.dimen.notification_large_icon_height);
        int windowFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
@@ -219,7 +222,7 @@ public class TabletTicker
        } else {
            windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        }
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(width, height,
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(width, mLargeIconHeight,
                WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, windowFlags,
                PixelFormat.TRANSLUCENT);
        lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
@@ -297,6 +300,16 @@ public class TabletTicker
        if (n.largeIcon != null) {
            largeIcon.setImageBitmap(n.largeIcon);
            largeIcon.setVisibility(View.VISIBLE);
            final ViewGroup.LayoutParams lp = largeIcon.getLayoutParams();
            final int statusBarHeight = mBar.getStatusBarHeight();
            if (n.largeIcon.getHeight() <= statusBarHeight) {
                // for smallish largeIcons, it looks a little odd to have them floating halfway up
                // the ticker, so we vertically center them in the status bar area instead
                lp.height = statusBarHeight;
            } else {
                lp.height = mLargeIconHeight;
            }
            largeIcon.setLayoutParams(lp);
        }

        if (CLICKABLE_TICKER) {
+5 −0
Original line number Diff line number Diff line
@@ -605,6 +605,11 @@
                        style="@style/FieldContents"
                        android:text="pineapple2"
                        />
                <RadioButton
                        android:id="@+id/large_icon_small"
                        style="@style/FieldContents"
                        android:text="small"
                        />
            </RadioGroup>
            

+3 −0
Original line number Diff line number Diff line
@@ -287,6 +287,9 @@ public class NotificationBuilderTest extends Activity
            case R.id.large_icon_pineapple2:
                b.setLargeIcon(loadBitmap(R.drawable.pineapple2));
                break;
            case R.id.large_icon_small:
                b.setLargeIcon(loadBitmap(R.drawable.icon2));
                break;
        }

        // sound TODO