From ecb66ce790dafe976bb55d00697cc1e13898d238 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 10 Apr 2020 15:34:19 -0400 Subject: [PATCH] Fixes for notification history - Fix some crashes - Fix layout in landscape - Fix a11y readout Test: manual Fixes: 153510934 Fixes: 153554113 Fixes: 153407364 Fixes: 152728558 Change-Id: I6c6bb10d4a67ece61fbf109b4289c4f368206788 --- res/layout/notification_history.xml | 28 ++------ .../notification_history_app_layout.xml | 8 +-- .../history/NotificationHistoryActivity.java | 2 +- .../history/NotificationHistoryAdapter.java | 42 +++++++++++- .../NotificationHistoryRecyclerView.java | 1 + .../NotificationHistoryViewHolder.java | 34 ---------- .../history/NotificationSbnViewHolder.java | 64 ++++++++++--------- 7 files changed, 85 insertions(+), 94 deletions(-) diff --git a/res/layout/notification_history.xml b/res/layout/notification_history.xml index 0e7f6b0210d..f5fae3f606f 100644 --- a/res/layout/notification_history.xml +++ b/res/layout/notification_history.xml @@ -14,7 +14,7 @@ limitations under the License. --> - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/notification_history_app_layout.xml b/res/layout/notification_history_app_layout.xml index a8757fe707e..e8d33166c9d 100644 --- a/res/layout/notification_history_app_layout.xml +++ b/res/layout/notification_history_app_layout.xml @@ -73,18 +73,12 @@ android:layout_height="1dp" android:background="?android:attr/listDivider"/> - - - \ No newline at end of file diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java index d41268dcc53..73befeb4801 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java +++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java @@ -77,7 +77,7 @@ public class NotificationHistoryActivity extends Activity { View viewForPackage = LayoutInflater.from(this) .inflate(R.layout.notification_history_app_layout, null); - final View container = viewForPackage.findViewById(R.id.list_container); + final View container = viewForPackage.findViewById(R.id.notification_list); container.setVisibility(View.GONE); ImageButton expand = viewForPackage.findViewById(R.id.expand); expand.setContentDescription(container.getVisibility() == View.VISIBLE diff --git a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java index a06939ac4d1..9d652d97f2c 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryAdapter.java +++ b/src/com/android/settings/notification/history/NotificationHistoryAdapter.java @@ -16,13 +16,22 @@ package com.android.settings.notification.history; +import static android.provider.Settings.EXTRA_APP_PACKAGE; +import static android.provider.Settings.EXTRA_CHANNEL_ID; +import static android.provider.Settings.EXTRA_CONVERSATION_ID; + import android.app.INotificationManager; import android.app.NotificationHistory.HistoricalNotification; +import android.content.Intent; +import android.os.Bundle; import android.os.RemoteException; +import android.os.UserHandle; +import android.provider.Settings; import android.util.Slog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityNodeInfo; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -63,8 +72,37 @@ public class NotificationHistoryAdapter extends holder.setTitle(hn.getTitle()); holder.setSummary(hn.getText()); holder.setPostedTime(hn.getPostedTimeMs()); - holder.addOnClick(hn.getPackage(), hn.getUserId(), hn.getChannelId(), - hn.getConversationId()); + holder.itemView.setOnClickListener(v -> { + Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) + .putExtra(EXTRA_APP_PACKAGE, hn.getPackage()) + .putExtra(EXTRA_CHANNEL_ID, hn.getChannelId()) + .putExtra(EXTRA_CONVERSATION_ID, hn.getConversationId()); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + holder.itemView.getContext().startActivityAsUser(intent, UserHandle.of(hn.getUserId())); + }); + holder.itemView.setAccessibilityDelegate(new View.AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, + AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + CharSequence description = + host.getResources().getText(R.string.notification_history_view_settings); + AccessibilityNodeInfo.AccessibilityAction customClick = + new AccessibilityNodeInfo.AccessibilityAction( + AccessibilityNodeInfo.ACTION_CLICK, description); + info.addAction(customClick); + //info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (action == AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS.getId()) { + onItemSwipeDeleted(position); + return true; + } + return false; + } + }); } @Override diff --git a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java index eaaa7c99edf..6f6deb073fe 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java +++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java @@ -34,6 +34,7 @@ public class NotificationHistoryRecyclerView extends RecyclerView { ItemTouchHelper touchHelper = new ItemTouchHelper( new DismissTouchHelper(0, ItemTouchHelper.START | ItemTouchHelper.END)); touchHelper.attachToRecyclerView(this); + setNestedScrollingEnabled(false); } public void setOnItemSwipeDeleteListener(OnItemSwipeDeleteListener listener) { diff --git a/src/com/android/settings/notification/history/NotificationHistoryViewHolder.java b/src/com/android/settings/notification/history/NotificationHistoryViewHolder.java index d1f47afad85..ef4f0da3bd9 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryViewHolder.java +++ b/src/com/android/settings/notification/history/NotificationHistoryViewHolder.java @@ -16,20 +16,10 @@ package com.android.settings.notification.history; -import static android.provider.Settings.EXTRA_APP_PACKAGE; -import static android.provider.Settings.EXTRA_CHANNEL_ID; -import static android.provider.Settings.EXTRA_CONVERSATION_ID; - -import android.content.Intent; -import android.os.UserHandle; -import android.provider.Settings; import android.view.View; import android.widget.DateTimeView; import android.widget.TextView; -import androidx.core.view.AccessibilityDelegateCompat; -import androidx.core.view.ViewCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; @@ -61,28 +51,4 @@ public class NotificationHistoryViewHolder extends RecyclerView.ViewHolder { void setPostedTime(long postedTime) { mTime.setTime(postedTime); } - - void addOnClick(String pkg, int userId, String channelId, String conversationId) { - itemView.setOnClickListener(v -> { - Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) - .putExtra(EXTRA_APP_PACKAGE, pkg) - .putExtra(EXTRA_CHANNEL_ID, channelId) - .putExtra(EXTRA_CONVERSATION_ID, conversationId); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - itemView.getContext().startActivityAsUser(intent, UserHandle.of(userId)); - }); - ViewCompat.setAccessibilityDelegate(itemView, new AccessibilityDelegateCompat() { - @Override - public void onInitializeAccessibilityNodeInfo(View host, - AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(host, info); - CharSequence description = - host.getResources().getText(R.string.notification_history_view_settings); - AccessibilityNodeInfoCompat.AccessibilityActionCompat customClick = - new AccessibilityNodeInfoCompat.AccessibilityActionCompat( - AccessibilityNodeInfoCompat.ACTION_CLICK, description); - info.addAction(customClick); - } - }); - } } diff --git a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java index dabf3f3dd46..42a210057a8 100644 --- a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java +++ b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java @@ -20,6 +20,7 @@ import android.app.PendingIntent; import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; import android.util.Slog; @@ -81,39 +82,44 @@ public class NotificationSbnViewHolder extends RecyclerView.ViewHolder { void setProfileBadge(Drawable badge) { mProfileBadge.setImageDrawable(badge); + mProfileBadge.setVisibility(badge != null ? View.VISIBLE : View.GONE); } void addOnClick(String pkg, int userId, PendingIntent pi) { - itemView.setOnClickListener(v -> { - if (pi != null) { - try { - pi.send(); - } catch (PendingIntent.CanceledException e) { - Slog.e(TAG, "Could not launch", e); + Intent appIntent = itemView.getContext().getPackageManager() + .getLaunchIntentForPackage(pkg); + boolean isPendingIntentValid = pi != null && PendingIntent.getActivity( + itemView.getContext(), 0, pi.getIntent(), PendingIntent.FLAG_NO_CREATE) != null; + if (isPendingIntentValid || appIntent != null) { + itemView.setOnClickListener(v -> { + if (pi != null) { + try { + pi.send(); + } catch (PendingIntent.CanceledException e) { + Slog.e(TAG, "Could not launch", e); + } + } else if (appIntent != null) { + appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + itemView.getContext().startActivityAsUser(appIntent, UserHandle.of(userId)); + } catch (ActivityNotFoundException e) { + Slog.e(TAG, "no launch activity", e); + } } - } else { - Intent appIntent = itemView.getContext().getPackageManager() - .getLaunchIntentForPackage(pkg); - appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - itemView.getContext().startActivityAsUser(appIntent, UserHandle.of(userId)); - } catch (ActivityNotFoundException e) { - Slog.e(TAG, "no launch activity", e); + }); + ViewCompat.setAccessibilityDelegate(itemView, new AccessibilityDelegateCompat() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, + AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + CharSequence description = host.getResources().getText( + R.string.notification_history_open_notification); + AccessibilityNodeInfoCompat.AccessibilityActionCompat customClick = + new AccessibilityNodeInfoCompat.AccessibilityActionCompat( + AccessibilityNodeInfoCompat.ACTION_CLICK, description); + info.addAction(customClick); } - } - }); - ViewCompat.setAccessibilityDelegate(itemView, new AccessibilityDelegateCompat() { - @Override - public void onInitializeAccessibilityNodeInfo(View host, - AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(host, info); - CharSequence description = host.getResources().getText( - R.string.notification_history_open_notification); - AccessibilityNodeInfoCompat.AccessibilityActionCompat customClick = - new AccessibilityNodeInfoCompat.AccessibilityActionCompat( - AccessibilityNodeInfoCompat.ACTION_CLICK, description); - info.addAction(customClick); - } - }); + }); + } } }