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
diff --git a/res/layout/notification_history.xml b/res/layout/notification_history.xml
index 0e7f6b0..f5fae3f 100644
--- a/res/layout/notification_history.xml
+++ b/res/layout/notification_history.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 
-<ScrollView
+<androidx.core.widget.NestedScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/scroll"
     android:layout_width="match_parent"
@@ -124,22 +124,15 @@
                     android:textColor="?android:attr/textColorPrimary"
                     android:textAppearance="?android:attr/textAppearanceMedium"
                     android:paddingBottom="16dp" />
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/list_container"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:clipChildren="true"
-                    android:elevation="3dp"
-                    android:background="@drawable/rounded_bg">
 
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/notification_list"
+                        android:elevation="3dp"
+                        android:background="@drawable/rounded_bg"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:clipChildren="true"
                         android:scrollbars="none"/>
-
-                </androidx.constraintlayout.widget.ConstraintLayout>
             </LinearLayout>
 
             <LinearLayout
@@ -156,21 +149,14 @@
                     android:textColor="?android:attr/textColorPrimary"
                     android:textAppearance="?android:attr/textAppearanceMedium"
                     android:paddingBottom="16dp" />
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/list_container"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:elevation="3dp"
-                    android:clipChildren="true"
-                    android:background="@drawable/rounded_bg">
-                    <androidx.recyclerview.widget.RecyclerView
+                <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/notification_list"
+                        android:elevation="3dp"
+                        android:background="@drawable/rounded_bg"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:clipChildren="true"
                         android:scrollbars="none"/>
-
-                </androidx.constraintlayout.widget.ConstraintLayout>
             </LinearLayout>
 
             <LinearLayout
@@ -198,4 +184,4 @@
         </LinearLayout>
 
     </LinearLayout>
-</ScrollView>
\ No newline at end of file
+</androidx.core.widget.NestedScrollView>
\ 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 a8757fe..e8d3316 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"/>
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/list_container"
-        android:layout_width="match_parent"
-        android:clipChildren="true"
-        android:layout_height="wrap_content">
         <com.android.settings.notification.history.NotificationHistoryRecyclerView
             android:id="@+id/notification_list"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:clipChildren="true"
+            android:importantForAccessibility="yes"
             android:scrollbars="none"/>
 
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
 </LinearLayout>
\ 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 d41268d..73befeb 100644
--- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java
+++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java
@@ -77,7 +77,7 @@
             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 a06939a..9d652d9 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 @@
         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 eaaa7c9..6f6deb0 100644
--- a/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java
+++ b/src/com/android/settings/notification/history/NotificationHistoryRecyclerView.java
@@ -34,6 +34,7 @@
         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 d1f47af..ef4f0da 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 @@
     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 dabf3f3..42a2100 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.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 @@
 
     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);
-            }
-        });
+            });
+        }
     }
 }