Add account info on apps row

Bug: 143730616
Test: manual
Test: atest DocumentsUIGoogleTests
Change-Id: I2b20446d8ca54426aef10e78ca934d906cd24f2a
diff --git a/res/layout/apps_item.xml b/res/layout/apps_item.xml
index 91d94a3..345f015 100644
--- a/res/layout/apps_item.xml
+++ b/res/layout/apps_item.xml
@@ -45,6 +45,17 @@
         android:ellipsize="end"
         android:gravity="center"/>
 
+    <TextView
+        android:id="@+id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/apps_row_item_text_margin_horizontal"
+        android:layout_marginEnd="@dimen/apps_row_item_text_margin_horizontal"
+        android:textAppearance="@style/AppsItemSubText"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:gravity="center"/>
+
     <ImageView
         android:id="@+id/exit_icon"
         android:layout_width="@dimen/apps_row_exit_icon_size"
diff --git a/res/values/styles_text.xml b/res/values/styles_text.xml
index 5e3d57c..4fce6c4 100644
--- a/res/values/styles_text.xml
+++ b/res/values/styles_text.xml
@@ -36,11 +36,16 @@
     </style>
 
     <style name="AppsItemText">
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
         <item name="android:textSize">12sp</item>
         <item name="fontFamily">@string/config_fontFamily</item>
     </style>
 
+    <style name="AppsItemSubText">
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:textSize">11sp</item>
+    </style>
+
     <style name="AutoCompleteText" parent="@style/TextAppearance.AppCompat.Medium">
         <item name="fontFamily">@string/config_fontFamily</item>
     </style>
diff --git a/src/com/android/documentsui/dirlist/AppsRowItemData.java b/src/com/android/documentsui/dirlist/AppsRowItemData.java
index 7c6d9c7..6ea018e 100644
--- a/src/com/android/documentsui/dirlist/AppsRowItemData.java
+++ b/src/com/android/documentsui/dirlist/AppsRowItemData.java
@@ -17,10 +17,11 @@
 package com.android.documentsui.dirlist;
 
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
 
+import androidx.annotation.Nullable;
+
 import com.android.documentsui.ActionHandler;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.sidebar.AppItem;
@@ -35,10 +36,12 @@
 public abstract class AppsRowItemData {
 
     private final String mTitle;
+    private final @Nullable String mSummary;
     protected final ActionHandler mActionHandler;
 
     public AppsRowItemData(Item item, ActionHandler actionHandler) {
         mTitle = item.title;
+        mSummary = item.getSummary();
         mActionHandler = actionHandler;
     }
 
@@ -46,6 +49,13 @@
         return mTitle;
     }
 
+    /**
+     * Get the summary from {@link Item}.
+     */
+    public final @Nullable String getSummary() {
+        return mSummary;
+    }
+
     protected abstract Drawable getIconDrawable(Context context);
     protected abstract void onClicked();
     protected abstract boolean showExitIcon();
diff --git a/src/com/android/documentsui/dirlist/AppsRowManager.java b/src/com/android/documentsui/dirlist/AppsRowManager.java
index cace69f..80eae16 100644
--- a/src/com/android/documentsui/dirlist/AppsRowManager.java
+++ b/src/com/android/documentsui/dirlist/AppsRowManager.java
@@ -90,10 +90,13 @@
     private void bindView(View view, AppsRowItemData data) {
         final ImageView app_icon = view.findViewById(R.id.app_icon);
         final TextView title = view.findViewById(android.R.id.title);
+        final TextView summary = view.findViewById(R.id.summary);
         final ImageView exit_icon = view.findViewById(R.id.exit_icon);
 
         app_icon.setImageDrawable(data.getIconDrawable(view.getContext()));
         title.setText(data.getTitle());
+        summary.setText(data.getSummary());
+        summary.setVisibility(data.getSummary() != null ? View.VISIBLE : View.GONE);
         exit_icon.setVisibility(data.showExitIcon() ? View.VISIBLE : View.GONE);
         view.setOnClickListener(v -> data.onClicked());
     }
diff --git a/src/com/android/documentsui/sidebar/Item.java b/src/com/android/documentsui/sidebar/Item.java
index 8bd1f32..9e98d62 100644
--- a/src/com/android/documentsui/sidebar/Item.java
+++ b/src/com/android/documentsui/sidebar/Item.java
@@ -16,7 +16,6 @@
 
 package com.android.documentsui.sidebar;
 
-import androidx.annotation.LayoutRes;
 import android.view.DragEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -24,6 +23,9 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+
 import com.android.documentsui.MenuManager;
 import com.android.documentsui.R;
 
@@ -64,6 +66,13 @@
         return "";
     }
 
+    /**
+     * Get the root or app summary such as account information.
+     */
+    public @Nullable String getSummary() {
+        return null;
+    }
+
     boolean isDropTarget() {
         return isRoot();
     }
diff --git a/src/com/android/documentsui/sidebar/RootItem.java b/src/com/android/documentsui/sidebar/RootItem.java
index 774fb08..b132142 100644
--- a/src/com/android/documentsui/sidebar/RootItem.java
+++ b/src/com/android/documentsui/sidebar/RootItem.java
@@ -16,7 +16,6 @@
 
 package com.android.documentsui.sidebar;
 
-import androidx.annotation.Nullable;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.provider.DocumentsProvider;
@@ -29,6 +28,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.annotation.Nullable;
+
 import com.android.documentsui.ActionHandler;
 import com.android.documentsui.IconUtils;
 import com.android.documentsui.MenuManager;
@@ -145,6 +146,11 @@
     }
 
     @Override
+    public String getSummary() {
+        return root.summary;
+    }
+
+    @Override
     boolean isDropTarget() {
         return root.supportsCreate();
     }
diff --git a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
index 3ca227a..38f7224 100644
--- a/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
+++ b/tests/common/com/android/documentsui/testing/TestProvidersAccess.java
@@ -79,6 +79,7 @@
         PICKLES.authority = "yummies";
         PICKLES.rootId = "pickles";
         PICKLES.title = "Pickles";
+        PICKLES.summary = "Yummy pickles";
 
         RECENTS = new RootInfo() {
             {
diff --git a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
index 9577550..5ee91d6 100644
--- a/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/AppsRowManagerTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -89,6 +90,7 @@
         assertEquals(TestProvidersAccess.INSPECTOR.title, chipDataList.get(0).getTitle());
         assertFalse(chipDataList.get(0).showExitIcon());
         assertEquals(TestProvidersAccess.PICKLES.title, chipDataList.get(1).getTitle());
+        assertEquals(TestProvidersAccess.PICKLES.summary, chipDataList.get(1).getSummary());
         assertFalse(chipDataList.get(1).showExitIcon());
     }
 
@@ -109,6 +111,7 @@
         assertTrue(chipDataList.get(0) instanceof AppsRowItemData.RootData);
         assertFalse(chipDataList.get(0).showExitIcon());
         assertEquals(TestProvidersAccess.PICKLES.title, chipDataList.get(1).getTitle());
+        assertNull(chipDataList.get(1).getSummary());
         assertTrue(chipDataList.get(1) instanceof AppsRowItemData.AppData);
         assertTrue(chipDataList.get(1).showExitIcon());
     }