Browse Source

Merge pull request #11693 from nextcloud/nmc/notification_theming

Notification list customization
Andy Scherzinger 1 year ago
parent
commit
ef4d638138

BIN
app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png


+ 31 - 16
app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java

@@ -2,7 +2,9 @@
  * ownCloud Android client application
  *
  * @author Andy Scherzinger
+ * @author TSI-mc
  * Copyright (C) 2016 ownCloud Inc.
+ * Copyright (C) 2023 TSI-mc
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2,
@@ -21,10 +23,7 @@ package com.owncloud.android.ui.adapter;
 
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -35,6 +34,7 @@ import android.text.style.ForegroundColorSpan;
 import android.text.style.StyleSpan;
 import android.view.Gravity;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -46,6 +46,7 @@ import com.bumptech.glide.load.model.StreamEncoder;
 import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.caverock.androidsvg.SVG;
 import com.google.android.material.button.MaterialButton;
+import com.nextcloud.android.common.ui.theme.utils.ColorRole;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.NotificationListItemBinding;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -68,6 +69,7 @@ import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.widget.PopupMenu;
+import androidx.core.content.res.ResourcesCompat;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
@@ -141,20 +143,22 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
             }
         }
 
-        holder.binding.message.setText(notification.getMessage());
+        if (notification.getMessage() != null && !notification.getMessage().isEmpty()) {
+            holder.binding.message.setText(notification.getMessage());
+            holder.binding.message.setVisibility(View.VISIBLE);
+        } else {
+            holder.binding.message.setVisibility(View.GONE);
+        }
 
         if (!TextUtils.isEmpty(notification.getIcon())) {
             downloadIcon(notification.getIcon(), holder.binding.icon, notificationsActivity);
         }
 
-        int nightModeFlag =
-            notificationsActivity.getResources().getConfiguration().uiMode
-                & Configuration.UI_MODE_NIGHT_MASK;
-        if (Configuration.UI_MODE_NIGHT_YES == nightModeFlag) {
-            holder.binding.icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
-        } else {
-            holder.binding.icon.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
-        }
+        viewThemeUtils.platform.colorImageView(holder.binding.icon, ColorRole.ON_SURFACE_VARIANT);
+        viewThemeUtils.platform.colorImageView(holder.binding.dismiss, ColorRole.ON_SURFACE_VARIANT);
+        viewThemeUtils.platform.colorTextView(holder.binding.subject, ColorRole.ON_SURFACE);
+        viewThemeUtils.platform.colorTextView(holder.binding.message, ColorRole.ON_SURFACE_VARIANT);
+        viewThemeUtils.platform.colorTextView(holder.binding.datetime, ColorRole.ON_SURFACE_VARIANT);
 
         setButtons(holder, notification);
 
@@ -172,13 +176,19 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                                                                          LinearLayout.LayoutParams.WRAP_CONTENT);
         params.setMargins(
-            resources.getDimensionPixelOffset(R.dimen.standard_half_margin),
+            resources.getDimensionPixelOffset(R.dimen.standard_quarter_margin),
             0,
             resources.getDimensionPixelOffset(R.dimen.standard_half_margin),
             0);
 
         List<Action> overflowActions = new ArrayList<>();
 
+        if (notification.getActions().size() > 0) {
+            holder.binding.buttons.setVisibility(View.VISIBLE);
+        } else {
+            holder.binding.buttons.setVisibility(View.GONE);
+        }
+
         if (notification.getActions().size() > 2) {
             for (Action action : notification.getActions()) {
                 if (action.primary) {
@@ -217,7 +227,10 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
 
             // further actions
             final MaterialButton moreButton = new MaterialButton(notificationsActivity);
-            viewThemeUtils.material.colorMaterialButtonPrimaryTonal(moreButton);
+            moreButton.setBackgroundColor(ResourcesCompat.getColor(resources,
+                                                               android.R.color.transparent,
+                                                               null));
+            viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(moreButton);
 
             moreButton.setAllCaps(false);
 
@@ -262,7 +275,10 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
                 if (action.primary) {
                     viewThemeUtils.material.colorMaterialButtonPrimaryFilled(button);
                 } else {
-                    viewThemeUtils.material.colorMaterialButtonPrimaryTonal(button);
+                    button.setBackgroundColor(ResourcesCompat.getColor(resources,
+                                                                       android.R.color.transparent,
+                                                                       null));
+                    viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(button);
                 }
 
                 button.setAllCaps(false);
@@ -271,7 +287,6 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
                 button.setCornerRadiusResource(R.dimen.button_corner_radius);
 
                 button.setLayoutParams(params);
-                button.setGravity(Gravity.CENTER);
 
                 button.setOnClickListener(v -> {
                     setButtonEnabled(holder, false);

+ 31 - 25
app/src/main/res/layout/notification_list_item.xml

@@ -3,8 +3,11 @@
  Nextcloud Android client application
 
   @author Tobias Kaminsky
+  @author TSI-mc
+  Copyright (C) 2023 Andy Scherzinger
+  Copyright (C) 2023 TSI-mc
   Copyright (C) 2018 Tobias Kaminsky
-  Copyright (C) 2018 Nextcloud GmbH.
+  Copyright (C) 2018 Nextcloud GmbH
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -24,10 +27,10 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
+    android:paddingStart="@dimen/standard_padding"
     android:paddingTop="@dimen/standard_padding"
-    android:paddingRight="@dimen/standard_padding"
+    android:paddingEnd="@dimen/standard_padding"
     android:paddingBottom="@dimen/standard_padding"
-    android:paddingLeft="@dimen/standard_padding"
     tools:ignore="UseCompoundDrawables">
 
     <ImageView
@@ -36,17 +39,15 @@
         android:layout_height="@dimen/notification_icon_height"
         android:layout_alignParentTop="true"
         android:layout_marginEnd="@dimen/notification_icon_layout_right_end_margin"
-        android:padding="2dp"
-        android:alpha="0.5"
         android:contentDescription="@string/notification_icon"
         android:src="@drawable/ic_notification" />
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
         android:layout_alignTop="@id/icon"
-        android:layout_toEndOf="@id/icon">
+        android:layout_toEndOf="@id/icon"
+        android:orientation="vertical">
 
         <LinearLayout
             android:layout_width="match_parent"
@@ -60,14 +61,17 @@
                 android:layout_weight="1"
                 android:ellipsize="end"
                 android:textAppearance="?android:attr/textAppearanceListItem"
+                android:textColor="@color/text_color"
+                android:textSize="@dimen/txt_size_16sp"
+                android:paddingBottom="@dimen/standard_half_padding"
                 tools:text="@string/placeholder_filename" />
 
             <ImageView
                 android:id="@+id/dismiss"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:src="@drawable/ic_close"
-                android:contentDescription="@string/dismiss_notification_description" />
+                android:contentDescription="@string/dismiss_notification_description"
+                android:src="@drawable/ic_close" />
         </LinearLayout>
 
         <TextView
@@ -75,28 +79,30 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:ellipsize="end"
-            tools:text="@string/placeholder_sentence"
-            android:alpha="0.57"
-            android:textAppearance="?android:attr/textAppearanceListItem"/>
-
-        <LinearLayout
-            android:id="@+id/buttons"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/alternate_half_margin"
-            android:layout_marginStart="@dimen/notification_list_item_grid_layout_left_start_margin"
-            android:columnCount="3"
-            android:orientation="horizontal"/>
+            android:paddingBottom="@dimen/standard_quarter_padding"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:textColor="@color/secondary_text_color"
+            android:textSize="@dimen/txt_size_14sp"
+            tools:text="@string/placeholder_sentence" />
 
         <TextView
             android:id="@+id/datetime"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="end"
             android:ellipsize="end"
-            tools:text="@string/placeholder_sentence"
-            android:alpha="0.5"
-            android:textColor="?android:attr/textColorSecondary"/>
+            android:textColor="@color/secondary_text_color"
+            android:textSize="@dimen/text_size_13sp"
+            tools:text="@string/placeholder_sentence" />
+
+        <LinearLayout
+            android:id="@+id/buttons"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/standard_quarter_margin"
+            android:layout_marginEnd="@dimen/notification_list_item_grid_layout_left_start_margin"
+            android:columnCount="3"
+            android:gravity="start"
+            android:orientation="horizontal" />
 
     </LinearLayout>
 

+ 6 - 4
app/src/main/res/values/dims.xml

@@ -98,10 +98,10 @@
     <dimen name="activity_list_item_title_header_text_size">16sp</dimen>
     <dimen name="activity_list_layout_recycler_view_margin">-3dp</dimen>
     <dimen name="activity_row_layout_height">48dp</dimen>
-    <dimen name="notification_icon_width">32dp</dimen>
-    <dimen name="notification_icon_height">32dp</dimen>
-    <dimen name="notification_icon_layout_right_end_margin">24dp</dimen>
-    <dimen name="notification_list_item_grid_layout_left_start_margin">-3dp</dimen>
+    <dimen name="notification_icon_width">24dp</dimen>
+    <dimen name="notification_icon_height">24dp</dimen>
+    <dimen name="notification_icon_layout_right_end_margin">21dp</dimen>
+    <dimen name="notification_list_item_grid_layout_left_start_margin">-8dp</dimen>
     <dimen name="uploader_list_separator_height">1dp</dimen>
     <dimen name="contactlist_item_icon_layout_width">40dp</dimen>
     <dimen name="contactlist_item_icon_layout_height">40dp</dimen>
@@ -148,6 +148,8 @@
     <dimen name="dialog_padding">24dp</dimen>
     <integer name="small_margin">5</integer>
     <integer name="zero">0</integer>
+    <dimen name="txt_size_16sp">16sp</dimen>
+    <dimen name="txt_size_14sp">14sp</dimen>
     <!--Adaptive Icon size specified here:  https://developer.android.com/develop/ui/views/launch/icon_design_adaptive -->
     <dimen name="adaptive_icon_size">108dp</dimen>
     <dimen name="adaptive_icon_padding">18dp</dimen>